Passed
Branch master (bbfb46)
by Jan
22:41 queued 14:44
created

Migration1536233560BasicData::createCountry()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 190
Code Lines 147

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 147
dl 0
loc 190
rs 8
c 0
b 0
f 0
cc 1
nc 1
nop 1

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php declare(strict_types=1);
2
3
namespace Shopware\Core\Migration;
4
5
use Doctrine\DBAL\Connection;
6
use Doctrine\DBAL\FetchMode;
7
use Shopware\Core\Checkout\Cart\Order\Event\CheckoutOrderPlacedEvent;
8
use Shopware\Core\Checkout\Customer\Event\CustomerRegisterEvent;
9
use Shopware\Core\Checkout\Document\DocumentGenerator\CreditNoteGenerator;
10
use Shopware\Core\Checkout\Document\DocumentGenerator\DeliveryNoteGenerator;
11
use Shopware\Core\Checkout\Document\DocumentGenerator\InvoiceGenerator;
12
use Shopware\Core\Checkout\Document\DocumentGenerator\StornoGenerator;
13
use Shopware\Core\Checkout\Order\Aggregate\OrderDelivery\OrderDeliveryStates;
14
use Shopware\Core\Checkout\Order\Aggregate\OrderTransaction\OrderTransactionStates;
15
use Shopware\Core\Checkout\Order\OrderStates;
16
use Shopware\Core\Checkout\Payment\Cart\PaymentHandler\CashPayment;
17
use Shopware\Core\Checkout\Payment\Cart\PaymentHandler\DebitPayment;
18
use Shopware\Core\Checkout\Payment\Cart\PaymentHandler\InvoicePayment;
19
use Shopware\Core\Checkout\Payment\Cart\PaymentHandler\PrePayment;
20
use Shopware\Core\Content\Category\CategoryDefinition;
21
use Shopware\Core\Content\DeliveryTime\DeliveryTimeEntity;
22
use Shopware\Core\Content\MailTemplate\MailTemplateTypes;
23
use Shopware\Core\Content\MailTemplate\Subscriber\MailSendSubscriber;
24
use Shopware\Core\Content\Newsletter\Event\NewsletterConfirmEvent;
25
use Shopware\Core\Content\Newsletter\Event\NewsletterRegisterEvent;
26
use Shopware\Core\Content\Newsletter\SalesChannel\NewsletterSubscriptionServiceInterface;
27
use Shopware\Core\Defaults;
28
use Shopware\Core\Framework\Api\Util\AccessKeyHelper;
29
use Shopware\Core\Framework\Doctrine\MultiInsertQueryQueue;
30
use Shopware\Core\Framework\Migration\MigrationStep;
31
use Shopware\Core\Framework\Uuid\Uuid;
32
33
class Migration1536233560BasicData extends MigrationStep
34
{
35
    /**
36
     * @var array
37
     */
38
    private $mailTypes;
39
40
    public function getCreationTimestamp(): int
41
    {
42
        return 1536233560;
43
    }
44
45
    public function update(Connection $connection): void
46
    {
47
        $hasData = $connection->executeQuery('SELECT 1 FROM `language` LIMIT 1')->fetch();
48
        if ($hasData) {
49
            return;
50
        }
51
52
        $this->createLanguage($connection);
53
        $this->createLocale($connection);
54
55
        $this->createDocumentTypes($connection);
56
        $this->createSalutation($connection);
57
        $this->createCountry($connection);
58
        $this->createCurrency($connection);
59
        $this->createCustomerGroup($connection);
60
        $this->createPaymentMethod($connection);
61
        $this->createShippingMethod($connection);
62
        $this->createTax($connection);
63
        $this->createRootCategory($connection);
64
        $this->createSalesChannelTypes($connection);
65
        $this->createSalesChannel($connection);
66
        $this->createProductManufacturer($connection);
67
        $this->createDefaultSnippetSets($connection);
68
        $this->createDefaultMediaFolders($connection);
69
        $this->createRules($connection);
70
        $this->createMailTemplateTypes($connection);
71
        $this->createNewsletterMailTemplate($connection);
72
        $this->createDocumentConfiguration($connection);
73
        $this->createMailEvents($connection);
74
        $this->createNumberRanges($connection);
75
76
        $this->createOrderStateMachine($connection);
77
        $this->createOrderDeliveryStateMachine($connection);
78
        $this->createOrderTransactionStateMachine($connection);
79
80
        $this->createSystemConfigOptions($connection);
81
82
        $this->createCmsPages($connection);
83
    }
84
85
    public function updateDestructive(Connection $connection): void
86
    {
87
        // implement update destructive
88
    }
89
90
    private function createLanguage(Connection $connection): void
91
    {
92
        $localeEn = Uuid::randomBytes();
93
        $localeDe = Uuid::randomBytes();
94
        $languageEn = Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM);
95
        $languageDe = Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM_DE);
96
97
        // first locales
98
        $connection->insert('locale', ['id' => $localeEn, 'code' => 'en-GB', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
99
        $connection->insert('locale', ['id' => $localeDe, 'code' => 'de-DE', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
100
101
        // second languages
102
        $connection->insert('language', [
103
            'id' => $languageEn,
104
            'name' => 'English',
105
            'locale_id' => $localeEn,
106
            'translation_code_id' => $localeEn,
107
            'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
108
        ]);
109
110
        $connection->insert('language', [
111
            'id' => $languageDe,
112
            'name' => 'Deutsch',
113
            'locale_id' => $localeDe,
114
            'translation_code_id' => $localeDe,
115
            'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
116
        ]);
117
118
        // third translations
119
        $connection->insert('locale_translation', [
120
            'locale_id' => $localeEn,
121
            'language_id' => $languageEn,
122
            'name' => 'English',
123
            'territory' => 'United Kingdom',
124
            'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
125
        ]);
126
        $connection->insert('locale_translation', [
127
            'locale_id' => $localeEn,
128
            'language_id' => $languageDe,
129
            'name' => 'Englisch',
130
            'territory' => 'Vereinigtes Königreich',
131
            'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
132
        ]);
133
        $connection->insert('locale_translation', [
134
            'locale_id' => $localeDe,
135
            'language_id' => $languageEn,
136
            'name' => 'German',
137
            'territory' => 'Germany',
138
            'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
139
        ]);
140
        $connection->insert('locale_translation', [
141
            'locale_id' => $localeDe,
142
            'language_id' => $languageDe,
143
            'name' => 'Deutsch',
144
            'territory' => 'Deutschland',
145
            'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
146
        ]);
147
    }
148
149
    private function createLocale(Connection $connection): void
150
    {
151
        $localeData = include __DIR__ . '/../locales.php';
152
153
        $queue = new MultiInsertQueryQueue($connection);
154
        $languageEn = Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM);
155
        $languageDe = Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM_DE);
156
157
        foreach ($localeData as $locale) {
158
            if (\in_array($locale['locale'], ['en-GB', 'de-DE'], true)) {
159
                continue;
160
            }
161
162
            $localeId = Uuid::randomBytes();
163
164
            $queue->addInsert(
165
                'locale',
166
                ['id' => $localeId, 'code' => $locale['locale'], 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]
167
            );
168
169
            $queue->addInsert(
170
                'locale_translation',
171
                [
172
                    'locale_id' => $localeId,
173
                    'language_id' => $languageEn,
174
                    'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
175
                    'name' => $locale['name']['en-GB'],
176
                    'territory' => $locale['territory']['en-GB'],
177
                ]
178
            );
179
180
            $queue->addInsert(
181
                'locale_translation',
182
                [
183
                    'locale_id' => $localeId,
184
                    'language_id' => $languageDe,
185
                    'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
186
                    'name' => $locale['name']['de-DE'],
187
                    'territory' => $locale['territory']['de-DE'],
188
                ]
189
            );
190
        }
191
192
        $queue->execute();
193
    }
194
195
    private function createCountry(Connection $connection): void
196
    {
197
        $languageDE = function (string $countryId, string $name) {
198
            return [
199
                'language_id' => Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM_DE),
200
                'name' => $name,
201
                'country_id' => $countryId,
202
                'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
203
            ];
204
        };
205
206
        $languageEN = function (string $countryId, string $name) {
207
            return [
208
                'language_id' => Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM),
209
                'name' => $name,
210
                'country_id' => $countryId,
211
                'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
212
            ];
213
        };
214
215
        $deId = Uuid::randomBytes();
216
        $connection->insert('country', ['id' => $deId, 'iso' => 'DE', 'position' => 1, 'iso3' => 'DEU', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
217
        $connection->insert('country_translation', $languageDE($deId, 'Deutschland'));
218
        $connection->insert('country_translation', $languageEN($deId, 'Germany'));
219
220
        $this->createCountryStates($connection, $deId, 'DE');
221
222
        $grId = Uuid::randomBytes();
223
        $connection->insert('country', ['id' => $grId, 'iso' => 'GR', 'position' => 10, 'iso3' => 'GRC', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
224
        $connection->insert('country_translation', $languageEN($grId, 'Greece'));
225
        $connection->insert('country_translation', $languageDE($grId, 'Griechenland'));
226
227
        $gbId = Uuid::randomBytes();
228
        $connection->insert('country', ['id' => $gbId, 'iso' => 'GB', 'position' => 5, 'iso3' => 'GBR', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
229
        $connection->insert('country_translation', $languageEN($gbId, 'Great Britain'));
230
        $connection->insert('country_translation', $languageDE($gbId, 'Großbritannien'));
231
232
        $this->createCountryStates($connection, $gbId, 'GB');
233
234
        $ieId = Uuid::randomBytes();
235
        $connection->insert('country', ['id' => $ieId, 'iso' => 'IE', 'position' => 10, 'iso3' => 'IRL', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
236
        $connection->insert('country_translation', $languageEN($ieId, 'Ireland'));
237
        $connection->insert('country_translation', $languageDE($ieId, 'Irland'));
238
239
        $isId = Uuid::randomBytes();
240
        $connection->insert('country', ['id' => $isId, 'iso' => 'IS', 'position' => 10, 'iso3' => 'ISL', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
241
        $connection->insert('country_translation', $languageEN($isId, 'Iceland'));
242
        $connection->insert('country_translation', $languageDE($isId, 'Island'));
243
244
        $itId = Uuid::randomBytes();
245
        $connection->insert('country', ['id' => $itId, 'iso' => 'IT', 'position' => 10, 'active' => 1, 'iso3' => 'ITA', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
246
        $connection->insert('country_translation', $languageEN($itId, 'Italy'));
247
        $connection->insert('country_translation', $languageDE($itId, 'Italien'));
248
249
        $jpId = Uuid::randomBytes();
250
        $connection->insert('country', ['id' => $jpId, 'iso' => 'JP', 'position' => 10, 'iso3' => 'JPN', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
251
        $connection->insert('country_translation', $languageEN($jpId, 'Japan'));
252
        $connection->insert('country_translation', $languageDE($jpId, 'Japan'));
253
254
        $caId = Uuid::randomBytes();
255
        $connection->insert('country', ['id' => $caId, 'iso' => 'CA', 'position' => 10, 'iso3' => 'CAN', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
256
        $connection->insert('country_translation', $languageEN($caId, 'Canada'));
257
        $connection->insert('country_translation', $languageDE($caId, 'Kanada'));
258
259
        $luId = Uuid::randomBytes();
260
        $connection->insert('country', ['id' => $luId, 'iso' => 'LU', 'position' => 10, 'iso3' => 'LUX', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
261
        $connection->insert('country_translation', $languageEN($luId, 'Luxembourg'));
262
        $connection->insert('country_translation', $languageDE($luId, 'Luxemburg'));
263
264
        $naId = Uuid::randomBytes();
265
        $connection->insert('country', ['id' => $naId, 'iso' => 'NA', 'position' => 10, 'iso3' => 'NAM', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
266
        $connection->insert('country_translation', $languageEN($naId, 'Namibia'));
267
        $connection->insert('country_translation', $languageDE($naId, 'Namibia'));
268
269
        $nlId = Uuid::randomBytes();
270
        $connection->insert('country', ['id' => $nlId, 'iso' => 'NL', 'position' => 10, 'active' => 1, 'iso3' => 'NLD', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
271
        $connection->insert('country_translation', $languageEN($nlId, 'Netherlands'));
272
        $connection->insert('country_translation', $languageDE($nlId, 'Niederlande'));
273
274
        $noId = Uuid::randomBytes();
275
        $connection->insert('country', ['id' => $noId, 'iso' => 'NO', 'position' => 10, 'iso3' => 'NOR', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
276
        $connection->insert('country_translation', $languageEN($noId, 'Norway'));
277
        $connection->insert('country_translation', $languageDE($noId, 'Norwegen'));
278
279
        $atId = Uuid::randomBytes();
280
        $connection->insert('country', ['id' => $atId, 'iso' => 'AT', 'position' => 10, 'active' => 1, 'iso3' => 'AUT', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
281
        $connection->insert('country_translation', $languageEN($atId, 'Austria'));
282
        $connection->insert('country_translation', $languageDE($atId, 'Österreich'));
283
284
        $ptId = Uuid::randomBytes();
285
        $connection->insert('country', ['id' => $ptId, 'iso' => 'PT', 'position' => 10, 'iso3' => 'PRT', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
286
        $connection->insert('country_translation', $languageEN($ptId, 'Portugal'));
287
        $connection->insert('country_translation', $languageDE($ptId, 'Portugal'));
288
289
        $seId = Uuid::randomBytes();
290
        $connection->insert('country', ['id' => $seId, 'iso' => 'SE', 'position' => 10, 'iso3' => 'SWE', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
291
        $connection->insert('country_translation', $languageEN($seId, 'Sweden'));
292
        $connection->insert('country_translation', $languageDE($seId, 'Schweden'));
293
294
        $chId = Uuid::randomBytes();
295
        $connection->insert('country', ['id' => $chId, 'iso' => 'CH', 'position' => 10, 'tax_free' => 1, 'active' => 1, 'iso3' => 'CHE', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
296
        $connection->insert('country_translation', $languageEN($chId, 'Switzerland'));
297
        $connection->insert('country_translation', $languageDE($chId, 'Schweiz'));
298
299
        $esId = Uuid::randomBytes();
300
        $connection->insert('country', ['id' => $esId, 'iso' => 'ES', 'position' => 10, 'active' => 1, 'iso3' => 'ESP', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
301
        $connection->insert('country_translation', $languageEN($esId, 'Spain'));
302
        $connection->insert('country_translation', $languageDE($esId, 'Spanien'));
303
304
        $usId = Uuid::randomBytes();
305
        $connection->insert('country', ['id' => $usId, 'iso' => 'US', 'position' => 10, 'iso3' => 'USA', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
306
        $connection->insert('country_translation', $languageEN($usId, 'USA'));
307
        $connection->insert('country_translation', $languageDE($usId, 'USA'));
308
309
        $this->createCountryStates($connection, $usId, 'US');
310
311
        $liId = Uuid::randomBytes();
312
        $connection->insert('country', ['id' => $liId, 'iso' => 'LI', 'position' => 10, 'iso3' => 'LIE', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
313
        $connection->insert('country_translation', $languageEN($liId, 'Liechtenstein'));
314
        $connection->insert('country_translation', $languageDE($liId, 'Liechtenstein'));
315
316
        $aeId = Uuid::randomBytes();
317
        $connection->insert('country', ['id' => $aeId, 'iso' => 'AE', 'position' => 10, 'active' => 1, 'iso3' => 'ARE', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
318
        $connection->insert('country_translation', $languageEN($aeId, 'Arab Emirates'));
319
        $connection->insert('country_translation', $languageDE($aeId, 'Arabische Emirate'));
320
321
        $plId = Uuid::randomBytes();
322
        $connection->insert('country', ['id' => $plId, 'iso' => 'PL', 'position' => 10, 'iso3' => 'POL', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
323
        $connection->insert('country_translation', $languageEN($plId, 'Poland'));
324
        $connection->insert('country_translation', $languageDE($plId, 'Polen'));
325
326
        $huId = Uuid::randomBytes();
327
        $connection->insert('country', ['id' => $huId, 'iso' => 'HU', 'position' => 10, 'iso3' => 'HUN', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
328
        $connection->insert('country_translation', $languageEN($huId, 'Hungary'));
329
        $connection->insert('country_translation', $languageDE($huId, 'Ungarn'));
330
331
        $trId = Uuid::randomBytes();
332
        $connection->insert('country', ['id' => $trId, 'iso' => 'TR', 'position' => 10, 'iso3' => 'TUR', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
333
        $connection->insert('country_translation', $languageEN($trId, 'Turkey'));
334
        $connection->insert('country_translation', $languageDE($trId, 'Türkei'));
335
336
        $czId = Uuid::randomBytes();
337
        $connection->insert('country', ['id' => $czId, 'iso' => 'CZ', 'position' => 10, 'iso3' => 'CZE', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
338
        $connection->insert('country_translation', $languageEN($czId, 'Czech Republic'));
339
        $connection->insert('country_translation', $languageDE($czId, 'Tschechische Republik'));
340
341
        $skId = Uuid::randomBytes();
342
        $connection->insert('country', ['id' => $skId, 'iso' => 'SK', 'position' => 10, 'iso3' => 'SVK', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
343
        $connection->insert('country_translation', $languageEN($skId, 'Slovenia'));
344
        $connection->insert('country_translation', $languageDE($skId, 'Slowenien'));
345
346
        $roId = Uuid::randomBytes();
347
        $connection->insert('country', ['id' => $roId, 'iso' => 'RO', 'position' => 10, 'iso3' => 'ROU', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
348
        $connection->insert('country_translation', $languageEN($roId, 'Romania'));
349
        $connection->insert('country_translation', $languageDE($roId, 'Rumänien'));
350
351
        $brId = Uuid::randomBytes();
352
        $connection->insert('country', ['id' => $brId, 'iso' => 'BR', 'position' => 10, 'iso3' => 'BRA', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
353
        $connection->insert('country_translation', $languageEN($brId, 'Brazil'));
354
        $connection->insert('country_translation', $languageDE($brId, 'Brasilien'));
355
356
        $ilId = Uuid::randomBytes();
357
        $connection->insert('country', ['id' => $ilId, 'iso' => 'IL', 'position' => 10, 'iso3' => 'ISR', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
358
        $connection->insert('country_translation', $languageEN($ilId, 'Isreal'));
359
        $connection->insert('country_translation', $languageDE($ilId, 'Isreal'));
360
361
        $auId = Uuid::randomBytes();
362
        $connection->insert('country', ['id' => $auId, 'iso' => 'AU', 'position' => 10, 'active' => 1, 'iso3' => 'AUS', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
363
        $connection->insert('country_translation', $languageEN($auId, 'Australia'));
364
        $connection->insert('country_translation', $languageDE($auId, 'Australien'));
365
366
        $beId = Uuid::randomBytes();
367
        $connection->insert('country', ['id' => $beId, 'iso' => 'BE', 'position' => 10, 'active' => 1, 'iso3' => 'BEL', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
368
        $connection->insert('country_translation', $languageEN($beId, 'Belgium'));
369
        $connection->insert('country_translation', $languageDE($beId, 'Belgien'));
370
371
        $dkId = Uuid::randomBytes();
372
        $connection->insert('country', ['id' => $dkId, 'iso' => 'DK', 'position' => 10, 'active' => 1, 'iso3' => 'DNK', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
373
        $connection->insert('country_translation', $languageEN($dkId, 'Denmark'));
374
        $connection->insert('country_translation', $languageDE($dkId, 'Dänemark'));
375
376
        $fiId = Uuid::randomBytes();
377
        $connection->insert('country', ['id' => $fiId, 'iso' => 'FI', 'position' => 10, 'active' => 1, 'iso3' => 'FIN', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
378
        $connection->insert('country_translation', $languageEN($fiId, 'Finland'));
379
        $connection->insert('country_translation', $languageDE($fiId, 'Finnland'));
380
381
        $frId = Uuid::randomBytes();
382
        $connection->insert('country', ['id' => $frId, 'iso' => 'FR', 'position' => 10, 'iso3' => 'FRA', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
383
        $connection->insert('country_translation', $languageEN($frId, 'France'));
384
        $connection->insert('country_translation', $languageDE($frId, 'Frankreich'));
385
    }
386
387
    private function createCountryStates(Connection $connection, string $countryId, string $countryCode): void
388
    {
389
        $data = [
390
            'US' => [
391
                'US-AL' => 'Alabama',
392
                'US-AK' => 'Alaska',
393
                'US-AZ' => 'Arizona',
394
                'US-AR' => 'Arkansas',
395
                'US-CA' => 'California',
396
                'US-CO' => 'Colorado',
397
                'US-CT' => 'Connecticut',
398
                'US-DE' => 'Delaware',
399
                'US-FL' => 'Florida',
400
                'US-GA' => 'Georgia',
401
                'US-HI' => 'Hawaii',
402
                'US-ID' => 'Idaho',
403
                'US-IL' => 'Illinois',
404
                'US-IN' => 'Indiana',
405
                'US-IA' => 'Iowa',
406
                'US-KS' => 'Kansas',
407
                'US-KY' => 'Kentucky',
408
                'US-LA' => 'Louisiana',
409
                'US-ME' => 'Maine',
410
                'US-MD' => 'Maryland',
411
                'US-MA' => 'Massachusetts',
412
                'US-MI' => 'Michigan',
413
                'US-MN' => 'Minnesota',
414
                'US-MS' => 'Mississippi',
415
                'US-MO' => 'Missouri',
416
                'US-MT' => 'Montana',
417
                'US-NE' => 'Nebraska',
418
                'US-NV' => 'Nevada',
419
                'US-NH' => 'New Hampshire',
420
                'US-NJ' => 'New Jersey',
421
                'US-NM' => 'New Mexico',
422
                'US-NY' => 'New York',
423
                'US-NC' => 'North Carolina',
424
                'US-ND' => 'North Dakota',
425
                'US-OH' => 'Ohio',
426
                'US-OK' => 'Oklahoma',
427
                'US-OR' => 'Oregon',
428
                'US-PA' => 'Pennsylvania',
429
                'US-RI' => 'Rhode Island',
430
                'US-SC' => 'South Carolina',
431
                'US-SD' => 'South Dakota',
432
                'US-TN' => 'Tennessee',
433
                'US-TX' => 'Texas',
434
                'US-UT' => 'Utah',
435
                'US-VT' => 'Vermont',
436
                'US-VA' => 'Virginia',
437
                'US-WA' => 'Washington',
438
                'US-WV' => 'West Virginia',
439
                'US-WI' => 'Wisconsin',
440
                'US-WY' => 'Wyoming',
441
                'US-DC' => 'District of Columbia',
442
            ],
443
            'DE' => [
444
                'DE-BW' => 'Baden-Württemberg',
445
                'DE-BY' => 'Bavaria',
446
                'DE-BE' => 'Berlin',
447
                'DE-BB' => 'Brandenburg',
448
                'DE-HB' => 'Bremen',
449
                'DE-HH' => 'Hamburg',
450
                'DE-HE' => 'Hesse',
451
                'DE-NI' => 'Lower Saxony',
452
                'DE-MV' => 'Mecklenburg-Western Pomerania',
453
                'DE-NW' => 'North Rhine-Westphalia',
454
                'DE-RP' => 'Rhineland-Palatinate',
455
                'DE-SL' => 'Saarland',
456
                'DE-SN' => 'Saxony',
457
                'DE-ST' => 'Saxony-Anhalt',
458
                'DE-SH' => 'Schleswig-Holstein',
459
                'DE-TH' => 'Thuringia',
460
            ],
461
            'GB' => [
462
                'GB-ENG' => 'England',
463
                'GB-NIR' => 'Northern Ireland',
464
                'GB-SCT' => 'Scotland',
465
                'GB-WLS' => 'Wales',
466
467
                'GB-EAW' => 'England and Wales',
468
                'GB-GBN' => 'Great Britain',
469
                'GB-UKM' => 'United Kingdom',
470
471
                'GB-BKM' => 'Buckinghamshire',
472
                'GB-CAM' => 'Cambridgeshire',
473
                'GB-CMA' => 'Cumbria',
474
                'GB-DBY' => 'Derbyshire',
475
                'GB-DEV' => 'Devon',
476
                'GB-DOR' => 'Dorset',
477
                'GB-ESX' => 'East Sussex',
478
                'GB-ESS' => 'Essex',
479
                'GB-GLS' => 'Gloucestershire',
480
                'GB-HAM' => 'Hampshire',
481
                'GB-HRT' => 'Hertfordshire',
482
                'GB-KEN' => 'Kent',
483
                'GB-LAN' => 'Lancashire',
484
                'GB-LEC' => 'Leicestershire',
485
                'GB-LIN' => 'Lincolnshire',
486
                'GB-NFK' => 'Norfolk',
487
                'GB-NYK' => 'North Yorkshire',
488
                'GB-NTH' => 'Northamptonshire',
489
                'GB-NTT' => 'Nottinghamshire',
490
                'GB-OXF' => 'Oxfordshire',
491
                'GB-SOM' => 'Somerset',
492
                'GB-STS' => 'Staffordshire',
493
                'GB-SFK' => 'Suffolk',
494
                'GB-SRY' => 'Surrey',
495
                'GB-WAR' => 'Warwickshire',
496
                'GB-WSX' => 'West Sussex',
497
                'GB-WOR' => 'Worcestershire',
498
                'GB-LND' => 'London, City of',
499
                'GB-BDG' => 'Barking and Dagenham',
500
                'GB-BNE' => 'Barnet',
501
                'GB-BEX' => 'Bexley',
502
                'GB-BEN' => 'Brent',
503
                'GB-BRY' => 'Bromley',
504
                'GB-CMD' => 'Camden',
505
                'GB-CRY' => 'Croydon',
506
                'GB-EAL' => 'Ealing',
507
                'GB-ENF' => 'Enfield',
508
                'GB-GRE' => 'Greenwich',
509
                'GB-HCK' => 'Hackney',
510
                'GB-HMF' => 'Hammersmith and Fulham',
511
                'GB-HRY' => 'Haringey',
512
                'GB-HRW' => 'Harrow',
513
                'GB-HAV' => 'Havering',
514
                'GB-HIL' => 'Hillingdon',
515
                'GB-HNS' => 'Hounslow',
516
                'GB-ISL' => 'Islington',
517
                'GB-KEC' => 'Kensington and Chelsea',
518
                'GB-KTT' => 'Kingston upon Thames',
519
                'GB-LBH' => 'Lambeth',
520
                'GB-LEW' => 'Lewisham',
521
                'GB-MRT' => 'Merton',
522
                'GB-NWM' => 'Newham',
523
                'GB-RDB' => 'Redbridge',
524
                'GB-RIC' => 'Richmond upon Thames',
525
                'GB-SWK' => 'Southwark',
526
                'GB-STN' => 'Sutton',
527
                'GB-TWH' => 'Tower Hamlets',
528
                'GB-WFT' => 'Waltham Forest',
529
                'GB-WND' => 'Wandsworth',
530
                'GB-WSM' => 'Westminster',
531
                'GB-BNS' => 'Barnsley',
532
                'GB-BIR' => 'Birmingham',
533
                'GB-BOL' => 'Bolton',
534
                'GB-BRD' => 'Bradford',
535
                'GB-BUR' => 'Bury',
536
                'GB-CLD' => 'Calderdale',
537
                'GB-COV' => 'Coventry',
538
                'GB-DNC' => 'Doncaster',
539
                'GB-DUD' => 'Dudley',
540
                'GB-GAT' => 'Gateshead',
541
                'GB-KIR' => 'Kirklees',
542
                'GB-KWL' => 'Knowsley',
543
                'GB-LDS' => 'Leeds',
544
                'GB-LIV' => 'Liverpool',
545
                'GB-MAN' => 'Manchester',
546
                'GB-NET' => 'Newcastle upon Tyne',
547
                'GB-NTY' => 'North Tyneside',
548
                'GB-OLD' => 'Oldham',
549
                'GB-RCH' => 'Rochdale',
550
                'GB-ROT' => 'Rotherham',
551
                'GB-SHN' => 'St. Helens',
552
                'GB-SLF' => 'Salford',
553
                'GB-SAW' => 'Sandwell',
554
                'GB-SFT' => 'Sefton',
555
                'GB-SHF' => 'Sheffield',
556
                'GB-SOL' => 'Solihull',
557
                'GB-STY' => 'South Tyneside',
558
                'GB-SKP' => 'Stockport',
559
                'GB-SND' => 'Sunderland',
560
                'GB-TAM' => 'Tameside',
561
                'GB-TRF' => 'Trafford',
562
                'GB-WKF' => 'Wakefield',
563
                'GB-WLL' => 'Walsall',
564
                'GB-WGN' => 'Wigan',
565
                'GB-WRL' => 'Wirral',
566
                'GB-WLV' => 'Wolverhampton',
567
                'GB-BAS' => 'Bath and North East Somerset',
568
                'GB-BDF' => 'Bedford',
569
                'GB-BBD' => 'Blackburn with Darwen',
570
                'GB-BPL' => 'Blackpool',
571
                'GB-BMH' => 'Bournemouth',
572
                'GB-BRC' => 'Bracknell Forest',
573
                'GB-BNH' => 'Brighton and Hove',
574
                'GB-BST' => 'Bristol, City of',
575
                'GB-CBF' => 'Central Bedfordshire',
576
                'GB-CHE' => 'Cheshire East',
577
                'GB-CHW' => 'Cheshire West and Chester',
578
                'GB-CON' => 'Cornwall',
579
                'GB-DAL' => 'Darlington',
580
                'GB-DER' => 'Derby',
581
                'GB-DUR' => 'Durham County',
582
                'GB-ERY' => 'East Riding of Yorkshire',
583
                'GB-HAL' => 'Halton',
584
                'GB-HPL' => 'Hartlepool',
585
                'GB-HEF' => 'Herefordshire',
586
                'GB-IOW' => 'Isle of Wight',
587
                'GB-IOS' => 'Isles of Scilly',
588
                'GB-KHL' => 'Kingston upon Hull',
589
                'GB-LCE' => 'Leicester',
590
                'GB-LUT' => 'Luton',
591
                'GB-MDW' => 'Medway',
592
                'GB-MDB' => 'Middlesbrough',
593
                'GB-MIK' => 'Milton Keynes',
594
                'GB-NEL' => 'North East Lincolnshire',
595
                'GB-NLN' => 'North Lincolnshire',
596
                'GB-NSM' => 'North Somerset',
597
                'GB-NBL' => 'Northumberland',
598
                'GB-NGM' => 'Nottingham',
599
                'GB-PTE' => 'Peterborough',
600
                'GB-PLY' => 'Plymouth',
601
                'GB-POL' => 'Poole',
602
                'GB-POR' => 'Portsmouth',
603
                'GB-RDG' => 'Reading',
604
                'GB-RCC' => 'Redcar and Cleveland',
605
                'GB-RUT' => 'Rutland',
606
                'GB-SHR' => 'Shropshire',
607
                'GB-SLG' => 'Slough',
608
                'GB-SGC' => 'South Gloucestershire',
609
                'GB-STH' => 'Southampton',
610
                'GB-SOS' => 'Southend-on-Sea',
611
                'GB-STT' => 'Stockton-on-Tees',
612
                'GB-STE' => 'Stoke-on-Trent',
613
                'GB-SWD' => 'Swindon',
614
                'GB-TFW' => 'Telford and Wrekin',
615
                'GB-THR' => 'Thurrock',
616
                'GB-TOB' => 'Torbay',
617
                'GB-WRT' => 'Warrington',
618
                'GB-WBK' => 'West Berkshire',
619
                'GB-WIL' => 'Wiltshire',
620
                'GB-WNM' => 'Windsor and Maidenhead',
621
                'GB-WOK' => 'Wokingham',
622
                'GB-YOR' => 'York',
623
                'GB-ANN' => 'Antrim and Newtownabbey',
624
                'GB-AND' => 'Ards and North Down',
625
                'GB-ABC' => 'Armagh, Banbridge and Craigavon',
626
                'GB-BFS' => 'Belfast',
627
                'GB-CCG' => 'Causeway Coast and Glens',
628
                'GB-DRS' => 'Derry and Strabane',
629
                'GB-FMO' => 'Fermanagh and Omagh',
630
                'GB-LBC' => 'Lisburn and Castlereagh',
631
                'GB-MEA' => 'Mid and East Antrim',
632
                'GB-MUL' => 'Mid Ulster',
633
                'GB-NMD' => 'Newry, Mourne and Down',
634
                'GB-ABE' => 'Aberdeen City',
635
                'GB-ABD' => 'Aberdeenshire',
636
                'GB-ANS' => 'Angus',
637
                'GB-AGB' => 'Argyll and Bute',
638
                'GB-CLK' => 'Clackmannanshire',
639
                'GB-DGY' => 'Dumfries and Galloway',
640
                'GB-DND' => 'Dundee City',
641
                'GB-EAY' => 'East Ayrshire',
642
                'GB-EDU' => 'East Dunbartonshire',
643
                'GB-ELN' => 'East Lothian',
644
                'GB-ERW' => 'East Renfrewshire',
645
                'GB-EDH' => 'Edinburgh, City of',
646
                'GB-ELS' => 'Eilean Siar',
647
                'GB-FAL' => 'Falkirk',
648
                'GB-FIF' => 'Fife',
649
                'GB-GLG' => 'Glasgow City',
650
                'GB-HLD' => 'Highland',
651
                'GB-IVC' => 'Inverclyde',
652
                'GB-MLN' => 'Midlothian',
653
                'GB-MRY' => 'Moray',
654
                'GB-NAY' => 'North Ayrshire',
655
                'GB-NLK' => 'North Lanarkshire',
656
                'GB-ORK' => 'Orkney Islands',
657
                'GB-PKN' => 'Perth and Kinross',
658
                'GB-RFW' => 'Renfrewshire',
659
                'GB-SCB' => 'Scottish Borders, The',
660
                'GB-ZET' => 'Shetland Islands',
661
                'GB-SAY' => 'South Ayrshire',
662
                'GB-SLK' => 'South Lanarkshire',
663
                'GB-STG' => 'Stirling',
664
                'GB-WDU' => 'West Dunbartonshire',
665
                'GB-WLN' => 'West Lothian',
666
                'GB-BGW' => 'Blaenau Gwent',
667
                'GB-BGE' => 'Bridgend',
668
                'GB-CAY' => 'Caerphilly',
669
                'GB-CRF' => 'Cardiff',
670
                'GB-CMN' => 'Carmarthenshire',
671
                'GB-CGN' => 'Ceredigion',
672
                'GB-CWY' => 'Conwy',
673
                'GB-DEN' => 'Denbighshire',
674
                'GB-FLN' => 'Flintshire',
675
                'GB-GWN' => 'Gwynedd',
676
                'GB-AGY' => 'Isle of Anglesey',
677
                'GB-MTY' => 'Merthyr Tydfil',
678
                'GB-MON' => 'Monmouthshire',
679
                'GB-NTL' => 'Neath Port Talbot',
680
                'GB-NWP' => 'Newport',
681
                'GB-PEM' => 'Pembrokeshire',
682
                'GB-POW' => 'Powys',
683
                'GB-RCT' => 'Rhondda, Cynon, Taff',
684
                'GB-SWA' => 'Swansea',
685
                'GB-TOF' => 'Torfaen',
686
                'GB-VGL' => 'Vale of Glamorgan, The',
687
                'GB-WRX' => 'Wrexham',
688
            ],
689
        ];
690
        $germanTranslations = [
691
            'DE' => [
692
                'DE-BW' => 'Baden-Württemberg',
693
                'DE-BY' => 'Bayern',
694
                'DE-BE' => 'Berlin',
695
                'DE-BB' => 'Brandenburg',
696
                'DE-HB' => 'Bremen',
697
                'DE-HH' => 'Hamburg',
698
                'DE-HE' => 'Hessen',
699
                'DE-NI' => 'Niedersachsen',
700
                'DE-MV' => 'Mecklenburg-Vorpommern',
701
                'DE-NW' => 'Nordrhein-Westfalen',
702
                'DE-RP' => 'Rheinland-Pfalz',
703
                'DE-SL' => 'Saarland',
704
                'DE-SN' => 'Sachsen',
705
                'DE-ST' => 'Sachsen-Anhalt',
706
                'DE-SH' => 'Schleswig-Holstein',
707
                'DE-TH' => 'Thüringen',
708
            ],
709
        ];
710
711
        foreach ($data[$countryCode] as $isoCode => $name) {
712
            $storageDate = date(Defaults::STORAGE_DATE_FORMAT);
713
            $id = Uuid::randomBytes();
714
            $countryStateData = [
715
                'id' => $id,
716
                'country_id' => $countryId,
717
                'short_code' => $isoCode,
718
                'created_at' => $storageDate,
719
            ];
720
            $connection->insert('country_state', $countryStateData);
721
            $connection->insert('country_state_translation', [
722
                'language_id' => Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM),
723
                'country_state_id' => $id,
724
                'name' => $name,
725
                'created_at' => $storageDate,
726
            ]);
727
728
            if (isset($germanTranslations[$countryCode])) {
729
                $connection->insert('country_state_translation', [
730
                    'language_id' => Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM_DE),
731
                    'country_state_id' => $id,
732
                    'name' => $name,
733
                    'created_at' => $storageDate,
734
                ]);
735
            }
736
        }
737
    }
738
739
    private function createCurrency(Connection $connection): void
740
    {
741
        $EUR = Uuid::fromHexToBytes(Defaults::CURRENCY);
742
        $USD = Uuid::randomBytes();
743
        $GBP = Uuid::randomBytes();
744
745
        $languageEN = Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM);
746
747
        $connection->insert('currency', ['id' => $EUR, 'iso_code' => 'EUR', 'factor' => 1, 'symbol' => '€', 'position' => 1, 'decimal_precision' => 2, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
748
        $connection->insert('currency_translation', ['currency_id' => $EUR, 'language_id' => $languageEN, 'short_name' => 'EUR', 'name' => 'Euro', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
749
750
        $connection->insert('currency', ['id' => $USD, 'iso_code' => 'USD', 'factor' => 1.17085, 'symbol' => '$', 'position' => 1, 'decimal_precision' => 2, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
751
        $connection->insert('currency_translation', ['currency_id' => $USD, 'language_id' => $languageEN, 'short_name' => 'USD', 'name' => 'US-Dollar', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
752
753
        $connection->insert('currency', ['id' => $GBP, 'iso_code' => 'GBP', 'factor' => 0.89157, 'symbol' => '£', 'position' => 1, 'decimal_precision' => 2, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
754
        $connection->insert('currency_translation', ['currency_id' => $GBP, 'language_id' => $languageEN, 'short_name' => 'GBP', 'name' => 'Pound', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
755
    }
756
757
    private function createCustomerGroup(Connection $connection): void
758
    {
759
        $connection->insert('customer_group', ['id' => Uuid::fromHexToBytes(Defaults::FALLBACK_CUSTOMER_GROUP), 'display_gross' => 1, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
760
        $connection->insert('customer_group_translation', ['customer_group_id' => Uuid::fromHexToBytes(Defaults::FALLBACK_CUSTOMER_GROUP), 'language_id' => Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM), 'name' => 'Standard customer group', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
761
        $connection->insert('customer_group_translation', ['customer_group_id' => Uuid::fromHexToBytes(Defaults::FALLBACK_CUSTOMER_GROUP), 'language_id' => Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM_DE), 'name' => 'Standard-Kundengruppe', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
762
    }
763
764
    private function createPaymentMethod(Connection $connection): void
765
    {
766
        $languageEN = Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM);
767
768
        $ruleId = Uuid::randomBytes();
769
        $connection->insert('rule', ['id' => $ruleId, 'name' => 'Cart >= 0 (Payment)', 'priority' => 100, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
770
        $connection->insert('rule_condition', ['id' => Uuid::randomBytes(), 'rule_id' => $ruleId, 'type' => 'cartCartAmount', 'value' => json_encode(['operator' => '>=', 'amount' => 0]), 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
771
772
        $debit = Uuid::randomBytes();
773
        $connection->insert('payment_method', ['id' => $debit, 'handler_identifier' => DebitPayment::class, 'position' => 4, 'active' => 0, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
774
        $connection->insert('payment_method_translation', ['payment_method_id' => $debit, 'language_id' => $languageEN, 'name' => 'Direct Debit', 'description' => 'Additional text', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
775
776
        $invoice = Uuid::randomBytes();
777
        $connection->insert('payment_method', ['id' => $invoice, 'handler_identifier' => InvoicePayment::class, 'position' => 5, 'active' => 1, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
778
        $connection->insert('payment_method_translation', ['payment_method_id' => $invoice, 'language_id' => $languageEN, 'name' => 'Invoice', 'description' => 'Payment by invoice. Shopware provides automatic invoicing for all customers on orders after the first, in order to avoid defaults on payment.', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
779
780
        $cash = Uuid::randomBytes();
781
        $connection->insert('payment_method', ['id' => $cash, 'handler_identifier' => CashPayment::class, 'position' => 1, 'active' => 1, 'created_at' => (new \DateTime())->format(Defaults::STORAGE_DATE_FORMAT)]);
782
        $connection->insert('payment_method_translation', ['payment_method_id' => $cash, 'language_id' => $languageEN, 'name' => 'Cash on delivery', 'description' => 'Pay when you get the order', 'created_at' => (new \DateTime())->format(Defaults::STORAGE_DATE_FORMAT)]);
783
784
        $pre = Uuid::randomBytes();
785
        $connection->insert('payment_method', ['id' => $pre, 'handler_identifier' => PrePayment::class, 'position' => 2, 'active' => 1, 'created_at' => (new \DateTime())->format(Defaults::STORAGE_DATE_FORMAT)]);
786
        $connection->insert('payment_method_translation', ['payment_method_id' => $pre, 'language_id' => $languageEN, 'name' => 'Paid in advance', 'description' => 'Pay in advance and get your order afterwards', 'created_at' => (new \DateTime())->format(Defaults::STORAGE_DATE_FORMAT)]);
787
    }
788
789
    private function createShippingMethod(Connection $connection): void
790
    {
791
        $deliveryTimeId = $this->createDeliveryTimes($connection);
792
        $standard = Uuid::randomBytes();
793
        $express = Uuid::randomBytes();
794
795
        $ruleId = Uuid::randomBytes();
796
797
        $connection->insert('rule', ['id' => $ruleId, 'name' => 'Cart >= 0', 'priority' => 100, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
798
        $connection->insert('rule_condition', ['id' => Uuid::randomBytes(), 'rule_id' => $ruleId, 'type' => 'cartCartAmount', 'value' => json_encode(['operator' => '>=', 'amount' => 0]), 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
799
800
        $languageEN = Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM);
801
802
        $connection->insert('shipping_method', ['id' => $standard, 'active' => 1, 'availability_rule_id' => $ruleId, 'delivery_time_id' => $deliveryTimeId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
803
        $connection->insert('shipping_method_translation', ['shipping_method_id' => $standard, 'language_id' => $languageEN, 'name' => 'Standard', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
804
        $connection->insert('shipping_method_price', ['id' => Uuid::randomBytes(), 'shipping_method_id' => $standard, 'calculation' => 1, 'currency_id' => Uuid::fromHexToBytes(Defaults::CURRENCY), 'price' => 0, 'quantity_start' => 0, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
805
806
        $connection->insert('shipping_method', ['id' => $express, 'active' => 1, 'availability_rule_id' => $ruleId, 'delivery_time_id' => $deliveryTimeId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
807
        $connection->insert('shipping_method_translation', ['shipping_method_id' => $express, 'language_id' => $languageEN, 'name' => 'Express', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
808
        $connection->insert('shipping_method_price', ['id' => Uuid::randomBytes(), 'shipping_method_id' => $express, 'calculation' => 1, 'currency_id' => Uuid::fromHexToBytes(Defaults::CURRENCY), 'price' => 0, 'quantity_start' => 0, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
809
    }
810
811
    private function createTax(Connection $connection): void
812
    {
813
        $tax19 = Uuid::randomBytes();
814
        $tax7 = Uuid::randomBytes();
815
816
        $connection->insert('tax', ['id' => $tax19, 'tax_rate' => 19, 'name' => '19%', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
817
        $connection->insert('tax', ['id' => $tax7, 'tax_rate' => 7, 'name' => '7%', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
818
    }
819
820
    private function createSalesChannelTypes(Connection $connection): void
821
    {
822
        $languageEN = Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM);
823
824
        $storefront = Uuid::fromHexToBytes(Defaults::SALES_CHANNEL_TYPE_STOREFRONT);
825
        $storefrontApi = Uuid::fromHexToBytes(Defaults::SALES_CHANNEL_TYPE_API);
826
827
        $connection->insert('sales_channel_type', ['id' => $storefront, 'icon_name' => 'default-building-shop', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
828
        $connection->insert('sales_channel_type_translation', ['sales_channel_type_id' => $storefront, 'language_id' => $languageEN, 'name' => 'Storefront', 'manufacturer' => 'shopware AG', 'description' => 'Sales channel with HTML storefront', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
829
830
        $connection->insert('sales_channel_type', ['id' => $storefrontApi, 'icon_name' => 'default-shopping-basket', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
831
        $connection->insert('sales_channel_type_translation', ['sales_channel_type_id' => $storefrontApi, 'language_id' => $languageEN, 'name' => 'Headless', 'manufacturer' => 'shopware AG', 'description' => 'API only sales channel', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
832
    }
833
834
    private function createProductManufacturer(Connection $connection): void
835
    {
836
        $id = Uuid::randomBytes();
837
        $languageEN = Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM);
838
        $versionId = Uuid::fromHexToBytes(Defaults::LIVE_VERSION);
839
840
        $connection->insert('product_manufacturer', ['id' => $id, 'version_id' => $versionId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
841
        $connection->insert('product_manufacturer_translation', ['product_manufacturer_id' => $id, 'product_manufacturer_version_id' => $versionId, 'language_id' => $languageEN, 'name' => 'shopware AG', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
842
    }
843
844
    private function createRootCategory(Connection $connection): void
845
    {
846
        $id = Uuid::randomBytes();
847
        $languageEN = Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM);
848
        $versionId = Uuid::fromHexToBytes(Defaults::LIVE_VERSION);
849
850
        $connection->insert('category', ['id' => $id, 'version_id' => $versionId, 'type' => CategoryDefinition::TYPE_PAGE, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
851
        $connection->insert('category_translation', ['category_id' => $id, 'category_version_id' => $versionId, 'language_id' => $languageEN, 'name' => 'Catalogue #1', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
852
    }
853
854
    private function createSalesChannel(Connection $connection): void
855
    {
856
        $currencies = $connection->executeQuery('SELECT id FROM currency')->fetchAll(FetchMode::COLUMN);
857
        $languages = $connection->executeQuery('SELECT id FROM language')->fetchAll(FetchMode::COLUMN);
858
        $shippingMethods = $connection->executeQuery('SELECT id FROM shipping_method')->fetchAll(FetchMode::COLUMN);
859
        $paymentMethods = $connection->executeQuery('SELECT id FROM payment_method')->fetchAll(FetchMode::COLUMN);
860
        $defaultPaymentMethod = $connection->executeQuery('SELECT id FROM payment_method WHERE active = 1 ORDER BY `position`')->fetchColumn();
861
        $defaultShippingMethod = $connection->executeQuery('SELECT id FROM shipping_method WHERE active = 1')->fetchColumn();
862
        $countryStatement = $connection->executeQuery('SELECT id FROM country WHERE active = 1 ORDER BY `position`');
863
        $defaultCountry = $countryStatement->fetchColumn();
864
        $rootCategoryId = $connection->executeQuery('SELECT id FROM category')->fetchColumn();
865
866
        $id = Uuid::fromHexToBytes(Defaults::SALES_CHANNEL);
867
        $languageEN = Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM);
868
869
        $connection->insert('sales_channel', [
870
            'id' => $id,
871
            'type_id' => Uuid::fromHexToBytes(Defaults::SALES_CHANNEL_TYPE_API),
872
            'access_key' => AccessKeyHelper::generateAccessKey('sales-channel'),
873
            'active' => 1,
874
            'tax_calculation_type' => 'vertical',
875
            'language_id' => Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM),
876
            'currency_id' => Uuid::fromHexToBytes(Defaults::CURRENCY),
877
            'payment_method_id' => $defaultPaymentMethod,
878
            'shipping_method_id' => $defaultShippingMethod,
879
            'country_id' => $defaultCountry,
880
            'navigation_category_id' => $rootCategoryId,
881
            'navigation_category_version_id' => Uuid::fromHexToBytes(Defaults::LIVE_VERSION),
882
            'customer_group_id' => Uuid::fromHexToBytes(Defaults::FALLBACK_CUSTOMER_GROUP),
883
            'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
884
        ]);
885
886
        $connection->insert('sales_channel_translation', ['sales_channel_id' => $id, 'language_id' => $languageEN, 'name' => 'Headless', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
887
888
        // country
889
        $connection->insert('sales_channel_country', ['sales_channel_id' => $id, 'country_id' => $defaultCountry]);
890
        $connection->insert('sales_channel_country', ['sales_channel_id' => $id, 'country_id' => $countryStatement->fetchColumn()]);
891
892
        // currency
893
        foreach ($currencies as $currency) {
894
            $connection->insert('sales_channel_currency', ['sales_channel_id' => $id, 'currency_id' => $currency]);
895
        }
896
897
        // language
898
        foreach ($languages as $language) {
899
            $connection->insert('sales_channel_language', ['sales_channel_id' => $id, 'language_id' => $language]);
900
        }
901
902
        // shipping methods
903
        foreach ($shippingMethods as $shippingMethod) {
904
            $connection->insert('sales_channel_shipping_method', ['sales_channel_id' => $id, 'shipping_method_id' => $shippingMethod]);
905
        }
906
907
        // payment methods
908
        foreach ($paymentMethods as $paymentMethod) {
909
            $connection->insert('sales_channel_payment_method', ['sales_channel_id' => $id, 'payment_method_id' => $paymentMethod]);
910
        }
911
    }
912
913
    private function createDefaultSnippetSets(Connection $connection): void
914
    {
915
        $queue = new MultiInsertQueryQueue($connection);
916
917
        $queue->addInsert('snippet_set', ['id' => Uuid::randomBytes(), 'name' => 'BASE de-DE', 'base_file' => 'messages.de-DE', 'iso' => 'de-DE', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
918
        $queue->addInsert('snippet_set', ['id' => Uuid::randomBytes(), 'name' => 'BASE en-GB', 'base_file' => 'messages.en-GB', 'iso' => 'en-GB', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
919
920
        $queue->execute();
921
    }
922
923
    private function createDefaultMediaFolders(Connection $connection): void
924
    {
925
        $queue = new MultiInsertQueryQueue($connection);
926
927
        $queue->addInsert('media_default_folder', ['id' => Uuid::randomBytes(), 'association_fields' => '["productMedia"]', 'entity' => 'product', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
928
        $queue->addInsert('media_default_folder', ['id' => Uuid::randomBytes(), 'association_fields' => '["productManufacturers"]', 'entity' => 'product_manufacturer', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
929
        $queue->addInsert('media_default_folder', ['id' => Uuid::randomBytes(), 'association_fields' => '["avatarUser"]', 'entity' => 'user', 'created_at' => (new \DateTime())->format(Defaults::STORAGE_DATE_FORMAT)]);
930
        $queue->addInsert('media_default_folder', ['id' => Uuid::randomBytes(), 'association_fields' => '["mailTemplateMedia"]', 'entity' => 'mail_template', 'created_at' => (new \DateTime())->format(Defaults::STORAGE_DATE_FORMAT)]);
931
        $queue->addInsert('media_default_folder', ['id' => Uuid::randomBytes(), 'association_fields' => '["categories"]', 'entity' => 'category', 'created_at' => (new \DateTime())->format(Defaults::STORAGE_DATE_FORMAT)]);
932
        $queue->addInsert('media_default_folder', ['id' => Uuid::randomBytes(), 'association_fields' => '[]', 'entity' => 'cms_page', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
933
        $queue->execute();
934
935
        $notCreatedDefaultFolders = $connection->executeQuery('
936
            SELECT `media_default_folder`.`id` default_folder_id, `media_default_folder`.`entity` entity
937
            FROM `media_default_folder`
938
                LEFT JOIN `media_folder` ON `media_folder`.`default_folder_id` = `media_default_folder`.`id`
939
            WHERE `media_folder`.`id` IS NULL
940
        ')->fetchAll();
941
942
        foreach ($notCreatedDefaultFolders as $notCreatedDefaultFolder) {
943
            $this->createDefaultFolder(
944
                $connection,
945
                $notCreatedDefaultFolder['default_folder_id'],
946
                $notCreatedDefaultFolder['entity']
947
            );
948
        }
949
    }
950
951
    private function createDefaultFolder(Connection $connection, string $defaultFolderId, string $entity): void
952
    {
953
        $connection->transactional(function (Connection $connection) use ($defaultFolderId, $entity) {
954
            $configurationId = Uuid::randomBytes();
955
            $folderId = Uuid::randomBytes();
956
            $folderName = $this->getMediaFolderName($entity);
957
958
            $connection->executeUpdate('
959
                INSERT INTO `media_folder_configuration` (`id`, `thumbnail_quality`, `create_thumbnails`, created_at)
960
                VALUES (:id, 80, 1, :createdAt)
961
            ', [
962
                'id' => $configurationId,
963
                'createdAt' => date(Defaults::STORAGE_DATE_FORMAT),
964
            ]);
965
966
            $connection->executeUpdate('
967
                INSERT into `media_folder` (`id`, `name`, `default_folder_id`, `media_folder_configuration_id`, `use_parent_configuration`, `child_count`, `created_at`)
968
                VALUES (:folderId, :folderName, :defaultFolderId, :configurationId, 0, 0, :createdAt)
969
            ', [
970
                'folderId' => $folderId,
971
                'folderName' => $folderName,
972
                'defaultFolderId' => $defaultFolderId,
973
                'configurationId' => $configurationId,
974
                'createdAt' => date(Defaults::STORAGE_DATE_FORMAT),
975
            ]);
976
        });
977
    }
978
979
    private function getMediaFolderName(string $entity): string
980
    {
981
        $capitalizedEntityParts = array_map(function ($part) {
982
            return ucfirst($part);
983
        },
984
            explode('_', $entity)
985
        );
986
987
        return implode(' ', $capitalizedEntityParts) . ' Media';
988
    }
989
990
    private function createOrderStateMachine(Connection $connection): void
991
    {
992
        $stateMachineId = Uuid::randomBytes();
993
        $openId = Uuid::randomBytes();
994
        $completedId = Uuid::randomBytes();
995
        $inProgressId = Uuid::randomBytes();
996
        $canceledId = Uuid::randomBytes();
997
998
        $germanId = Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM_DE);
999
        $englishId = Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM);
1000
1001
        $translationDE = ['language_id' => $germanId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)];
1002
        $translationEN = ['language_id' => $englishId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)];
1003
1004
        // state machine
1005
        $connection->insert('state_machine', [
1006
            'id' => $stateMachineId,
1007
            'technical_name' => OrderStates::STATE_MACHINE,
1008
            'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1009
        ]);
1010
1011
        $connection->insert('state_machine_translation', array_merge($translationDE, [
1012
            'state_machine_id' => $stateMachineId,
1013
            'name' => 'Bestellstatus',
1014
            'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1015
        ]));
1016
1017
        $connection->insert('state_machine_translation', array_merge($translationEN, [
1018
            'state_machine_id' => $stateMachineId,
1019
            'name' => 'Order state',
1020
            'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1021
        ]));
1022
1023
        // states
1024
        $connection->insert('state_machine_state', ['id' => $openId, 'state_machine_id' => $stateMachineId, 'technical_name' => OrderStates::STATE_OPEN, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1025
        $connection->insert('state_machine_state_translation', array_merge($translationDE, ['state_machine_state_id' => $openId, 'name' => 'Offen']));
1026
        $connection->insert('state_machine_state_translation', array_merge($translationEN, ['state_machine_state_id' => $openId, 'name' => 'Open']));
1027
1028
        $connection->insert('state_machine_state', ['id' => $completedId, 'state_machine_id' => $stateMachineId, 'technical_name' => OrderStates::STATE_COMPLETED, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1029
        $connection->insert('state_machine_state_translation', array_merge($translationDE, ['state_machine_state_id' => $completedId, 'name' => 'Abgeschlossen']));
1030
        $connection->insert('state_machine_state_translation', array_merge($translationEN, ['state_machine_state_id' => $completedId, 'name' => 'Done']));
1031
1032
        $connection->insert('state_machine_state', ['id' => $inProgressId, 'state_machine_id' => $stateMachineId, 'technical_name' => OrderStates::STATE_IN_PROGRESS, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1033
        $connection->insert('state_machine_state_translation', array_merge($translationDE, ['state_machine_state_id' => $inProgressId, 'name' => 'In Bearbeitung']));
1034
        $connection->insert('state_machine_state_translation', array_merge($translationEN, ['state_machine_state_id' => $inProgressId, 'name' => 'In progress']));
1035
1036
        $connection->insert('state_machine_state', ['id' => $canceledId, 'state_machine_id' => $stateMachineId, 'technical_name' => OrderStates::STATE_CANCELLED, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1037
        $connection->insert('state_machine_state_translation', array_merge($translationDE, ['state_machine_state_id' => $canceledId, 'name' => 'Abgebrochen']));
1038
        $connection->insert('state_machine_state_translation', array_merge($translationEN, ['state_machine_state_id' => $canceledId, 'name' => 'Cancelled']));
1039
1040
        // transitions
1041
        $connection->insert('state_machine_transition', ['id' => Uuid::randomBytes(), 'state_machine_id' => $stateMachineId, 'action_name' => 'process', 'from_state_id' => $openId, 'to_state_id' => $inProgressId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1042
        $connection->insert('state_machine_transition', ['id' => Uuid::randomBytes(), 'state_machine_id' => $stateMachineId, 'action_name' => 'cancel', 'from_state_id' => $openId, 'to_state_id' => $canceledId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1043
1044
        $connection->insert('state_machine_transition', ['id' => Uuid::randomBytes(), 'state_machine_id' => $stateMachineId, 'action_name' => 'cancel', 'from_state_id' => $inProgressId, 'to_state_id' => $canceledId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1045
        $connection->insert('state_machine_transition', ['id' => Uuid::randomBytes(), 'state_machine_id' => $stateMachineId, 'action_name' => 'complete', 'from_state_id' => $inProgressId, 'to_state_id' => $completedId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1046
1047
        $connection->insert('state_machine_transition', ['id' => Uuid::randomBytes(), 'state_machine_id' => $stateMachineId, 'action_name' => 'reopen', 'from_state_id' => $canceledId, 'to_state_id' => $openId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1048
        // set initial state
1049
        $connection->update('state_machine', ['initial_state_id' => $openId], ['id' => $stateMachineId]);
1050
    }
1051
1052
    private function createOrderDeliveryStateMachine(Connection $connection): void
1053
    {
1054
        $stateMachineId = Uuid::randomBytes();
1055
        $openId = Uuid::randomBytes();
1056
        $cancelledId = Uuid::randomBytes();
1057
1058
        $shippedId = Uuid::randomBytes();
1059
        $shippedPartiallyId = Uuid::randomBytes();
1060
1061
        $returnedId = Uuid::randomBytes();
1062
        $returnedPartiallyId = Uuid::randomBytes();
1063
1064
        $germanId = Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM_DE);
1065
        $englishId = Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM);
1066
1067
        $translationDE = ['language_id' => $germanId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)];
1068
        $translationEN = ['language_id' => $englishId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)];
1069
1070
        // state machine
1071
        $connection->insert('state_machine', [
1072
            'id' => $stateMachineId,
1073
            'technical_name' => OrderDeliveryStates::STATE_MACHINE,
1074
            'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1075
        ]);
1076
1077
        $connection->insert('state_machine_translation', array_merge($translationDE, [
1078
            'state_machine_id' => $stateMachineId,
1079
            'name' => 'Bestellstatus',
1080
            'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1081
        ]));
1082
1083
        $connection->insert('state_machine_translation', array_merge($translationEN, [
1084
            'state_machine_id' => $stateMachineId,
1085
            'name' => 'Order state',
1086
            'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1087
        ]));
1088
1089
        // states
1090
        $connection->insert('state_machine_state', ['id' => $openId, 'state_machine_id' => $stateMachineId, 'technical_name' => OrderDeliveryStates::STATE_OPEN, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1091
        $connection->insert('state_machine_state_translation', array_merge($translationDE, ['state_machine_state_id' => $openId, 'name' => 'Offen']));
1092
        $connection->insert('state_machine_state_translation', array_merge($translationEN, ['state_machine_state_id' => $openId, 'name' => 'Open']));
1093
1094
        $connection->insert('state_machine_state', ['id' => $shippedId, 'state_machine_id' => $stateMachineId, 'technical_name' => OrderDeliveryStates::STATE_SHIPPED, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1095
        $connection->insert('state_machine_state_translation', array_merge($translationDE, ['state_machine_state_id' => $shippedId, 'name' => 'Versandt']));
1096
        $connection->insert('state_machine_state_translation', array_merge($translationEN, ['state_machine_state_id' => $shippedId, 'name' => 'Shipped']));
1097
1098
        $connection->insert('state_machine_state', ['id' => $shippedPartiallyId, 'state_machine_id' => $stateMachineId, 'technical_name' => OrderDeliveryStates::STATE_PARTIALLY_SHIPPED, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1099
        $connection->insert('state_machine_state_translation', array_merge($translationDE, ['state_machine_state_id' => $shippedPartiallyId, 'name' => 'Teilweise versandt']));
1100
        $connection->insert('state_machine_state_translation', array_merge($translationEN, ['state_machine_state_id' => $shippedPartiallyId, 'name' => 'Shipped (partially)']));
1101
1102
        $connection->insert('state_machine_state', ['id' => $returnedId, 'state_machine_id' => $stateMachineId, 'technical_name' => OrderDeliveryStates::STATE_RETURNED, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1103
        $connection->insert('state_machine_state_translation', array_merge($translationDE, ['state_machine_state_id' => $returnedId, 'name' => 'Retour']));
1104
        $connection->insert('state_machine_state_translation', array_merge($translationEN, ['state_machine_state_id' => $returnedId, 'name' => 'Returned']));
1105
1106
        $connection->insert('state_machine_state', ['id' => $returnedPartiallyId, 'state_machine_id' => $stateMachineId, 'technical_name' => OrderDeliveryStates::STATE_PARTIALLY_RETURNED, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1107
        $connection->insert('state_machine_state_translation', array_merge($translationDE, ['state_machine_state_id' => $returnedPartiallyId, 'name' => 'Teilretour']));
1108
        $connection->insert('state_machine_state_translation', array_merge($translationEN, ['state_machine_state_id' => $returnedPartiallyId, 'name' => 'Returned (partially)']));
1109
1110
        $connection->insert('state_machine_state', ['id' => $cancelledId, 'state_machine_id' => $stateMachineId, 'technical_name' => OrderDeliveryStates::STATE_CANCELLED, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1111
        $connection->insert('state_machine_state_translation', array_merge($translationDE, ['state_machine_state_id' => $cancelledId, 'name' => 'Abgebrochen']));
1112
        $connection->insert('state_machine_state_translation', array_merge($translationEN, ['state_machine_state_id' => $cancelledId, 'name' => 'Cancelled']));
1113
1114
        // transitions
1115
        // from "open" to *
1116
        $connection->insert('state_machine_transition', ['id' => Uuid::randomBytes(), 'state_machine_id' => $stateMachineId, 'action_name' => 'ship', 'from_state_id' => $openId, 'to_state_id' => $shippedId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1117
        $connection->insert('state_machine_transition', ['id' => Uuid::randomBytes(), 'state_machine_id' => $stateMachineId, 'action_name' => 'ship_partially', 'from_state_id' => $openId, 'to_state_id' => $shippedPartiallyId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1118
        $connection->insert('state_machine_transition', ['id' => Uuid::randomBytes(), 'state_machine_id' => $stateMachineId, 'action_name' => 'cancel', 'from_state_id' => $openId, 'to_state_id' => $cancelledId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1119
1120
        // from "shipped" to *
1121
        // $connection->insert('state_machine_transition', ['id' => Uuid::randomBytes(), 'state_machine_id' => $stateMachineId, 'action_name' => 'ship', 'from_state_id' => $shippedId, 'to_state_id' => $shippedId, 'created_at' => date(Defaults::DATE_FORMAT)]);
1122
        $connection->insert('state_machine_transition', ['id' => Uuid::randomBytes(), 'state_machine_id' => $stateMachineId, 'action_name' => 'retour', 'from_state_id' => $shippedId, 'to_state_id' => $returnedId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1123
        $connection->insert('state_machine_transition', ['id' => Uuid::randomBytes(), 'state_machine_id' => $stateMachineId, 'action_name' => 'retour_partially', 'from_state_id' => $shippedId, 'to_state_id' => $returnedPartiallyId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1124
        $connection->insert('state_machine_transition', ['id' => Uuid::randomBytes(), 'state_machine_id' => $stateMachineId, 'action_name' => 'cancel', 'from_state_id' => $shippedId, 'to_state_id' => $cancelledId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1125
1126
        // from shipped_partially
1127
        $connection->insert('state_machine_transition', ['id' => Uuid::randomBytes(), 'state_machine_id' => $stateMachineId, 'action_name' => 'retour', 'from_state_id' => $shippedPartiallyId, 'to_state_id' => $returnedId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1128
        $connection->insert('state_machine_transition', ['id' => Uuid::randomBytes(), 'state_machine_id' => $stateMachineId, 'action_name' => 'retour_partially', 'from_state_id' => $shippedPartiallyId, 'to_state_id' => $returnedPartiallyId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1129
        $connection->insert('state_machine_transition', ['id' => Uuid::randomBytes(), 'state_machine_id' => $stateMachineId, 'action_name' => 'ship', 'from_state_id' => $shippedPartiallyId, 'to_state_id' => $shippedId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1130
        $connection->insert('state_machine_transition', ['id' => Uuid::randomBytes(), 'state_machine_id' => $stateMachineId, 'action_name' => 'cancel', 'from_state_id' => $shippedPartiallyId, 'to_state_id' => $cancelledId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1131
1132
        // set initial state
1133
        $connection->update('state_machine', ['initial_state_id' => $openId], ['id' => $stateMachineId]);
1134
    }
1135
1136
    private function createOrderTransactionStateMachine(Connection $connection): void
1137
    {
1138
        $stateMachineId = Uuid::randomBytes();
1139
1140
        $openId = Uuid::randomBytes();
1141
        $paidId = Uuid::randomBytes();
1142
        $paidPartiallyId = Uuid::randomBytes();
1143
        $cancelledId = Uuid::randomBytes();
1144
        $remindedId = Uuid::randomBytes();
1145
        $refundedId = Uuid::randomBytes();
1146
        $refundedPartiallyId = Uuid::randomBytes();
1147
1148
        $germanId = Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM_DE);
1149
        $englishId = Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM);
1150
1151
        $translationDE = ['language_id' => $germanId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)];
1152
        $translationEN = ['language_id' => $englishId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)];
1153
1154
        // state machine
1155
        $connection->insert('state_machine', [
1156
            'id' => $stateMachineId,
1157
            'technical_name' => OrderTransactionStates::STATE_MACHINE,
1158
            'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1159
        ]);
1160
1161
        $connection->insert('state_machine_translation', array_merge($translationDE, [
1162
            'state_machine_id' => $stateMachineId,
1163
            'name' => 'Zahlungsstatus',
1164
            'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1165
        ]));
1166
1167
        $connection->insert('state_machine_translation', array_merge($translationEN, [
1168
            'state_machine_id' => $stateMachineId,
1169
            'name' => 'Payment state',
1170
            'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1171
        ]));
1172
1173
        // states
1174
        $connection->insert('state_machine_state', ['id' => $openId, 'state_machine_id' => $stateMachineId, 'technical_name' => OrderTransactionStates::STATE_OPEN, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1175
        $connection->insert('state_machine_state_translation', array_merge($translationDE, ['state_machine_state_id' => $openId, 'name' => 'Offen']));
1176
        $connection->insert('state_machine_state_translation', array_merge($translationEN, ['state_machine_state_id' => $openId, 'name' => 'Open']));
1177
1178
        $connection->insert('state_machine_state', ['id' => $paidId, 'state_machine_id' => $stateMachineId, 'technical_name' => OrderTransactionStates::STATE_PAID, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1179
        $connection->insert('state_machine_state_translation', array_merge($translationDE, ['state_machine_state_id' => $paidId, 'name' => 'Bezahlt']));
1180
        $connection->insert('state_machine_state_translation', array_merge($translationEN, ['state_machine_state_id' => $paidId, 'name' => 'Paid']));
1181
1182
        $connection->insert('state_machine_state', ['id' => $paidPartiallyId, 'state_machine_id' => $stateMachineId, 'technical_name' => OrderTransactionStates::STATE_PARTIALLY_PAID, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1183
        $connection->insert('state_machine_state_translation', array_merge($translationDE, ['state_machine_state_id' => $paidPartiallyId, 'name' => 'Teilweise bezahlt']));
1184
        $connection->insert('state_machine_state_translation', array_merge($translationEN, ['state_machine_state_id' => $paidPartiallyId, 'name' => 'Paid (partially)']));
1185
1186
        $connection->insert('state_machine_state', ['id' => $refundedId, 'state_machine_id' => $stateMachineId, 'technical_name' => OrderTransactionStates::STATE_REFUNDED, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1187
        $connection->insert('state_machine_state_translation', array_merge($translationDE, ['state_machine_state_id' => $refundedId, 'name' => 'Erstattet']));
1188
        $connection->insert('state_machine_state_translation', array_merge($translationEN, ['state_machine_state_id' => $refundedId, 'name' => 'Refunded']));
1189
1190
        $connection->insert('state_machine_state', ['id' => $refundedPartiallyId, 'state_machine_id' => $stateMachineId, 'technical_name' => OrderTransactionStates::STATE_PARTIALLY_REFUNDED, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1191
        $connection->insert('state_machine_state_translation', array_merge($translationDE, ['state_machine_state_id' => $refundedPartiallyId, 'name' => 'Teilweise erstattet']));
1192
        $connection->insert('state_machine_state_translation', array_merge($translationEN, ['state_machine_state_id' => $refundedPartiallyId, 'name' => 'Refunded (partially)']));
1193
1194
        $connection->insert('state_machine_state', ['id' => $cancelledId, 'state_machine_id' => $stateMachineId, 'technical_name' => OrderTransactionStates::STATE_CANCELLED, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1195
        $connection->insert('state_machine_state_translation', array_merge($translationDE, ['state_machine_state_id' => $cancelledId, 'name' => 'Abgebrochen']));
1196
        $connection->insert('state_machine_state_translation', array_merge($translationEN, ['state_machine_state_id' => $cancelledId, 'name' => 'Cancelled']));
1197
1198
        $connection->insert('state_machine_state', ['id' => $remindedId, 'state_machine_id' => $stateMachineId, 'technical_name' => OrderTransactionStates::STATE_REMINDED, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1199
        $connection->insert('state_machine_state_translation', array_merge($translationDE, ['state_machine_state_id' => $remindedId, 'name' => 'Erinnert']));
1200
        $connection->insert('state_machine_state_translation', array_merge($translationEN, ['state_machine_state_id' => $remindedId, 'name' => 'Reminded']));
1201
1202
        // transitions
1203
        // from "open" to *
1204
        $connection->insert('state_machine_transition', ['id' => Uuid::randomBytes(), 'state_machine_id' => $stateMachineId, 'action_name' => 'pay', 'from_state_id' => $openId, 'to_state_id' => $paidId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1205
        $connection->insert('state_machine_transition', ['id' => Uuid::randomBytes(), 'state_machine_id' => $stateMachineId, 'action_name' => 'pay_partially', 'from_state_id' => $openId, 'to_state_id' => $paidPartiallyId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1206
        $connection->insert('state_machine_transition', ['id' => Uuid::randomBytes(), 'state_machine_id' => $stateMachineId, 'action_name' => 'cancel', 'from_state_id' => $openId, 'to_state_id' => $cancelledId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1207
        $connection->insert('state_machine_transition', ['id' => Uuid::randomBytes(), 'state_machine_id' => $stateMachineId, 'action_name' => 'remind', 'from_state_id' => $openId, 'to_state_id' => $remindedId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1208
1209
        // from "reminded" to *
1210
        $connection->insert('state_machine_transition', ['id' => Uuid::randomBytes(), 'state_machine_id' => $stateMachineId, 'action_name' => 'pay', 'from_state_id' => $remindedId, 'to_state_id' => $paidId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1211
        $connection->insert('state_machine_transition', ['id' => Uuid::randomBytes(), 'state_machine_id' => $stateMachineId, 'action_name' => 'pay_partially', 'from_state_id' => $remindedId, 'to_state_id' => $paidPartiallyId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1212
1213
        // from "paid_partially" to *
1214
        $connection->insert('state_machine_transition', ['id' => Uuid::randomBytes(), 'state_machine_id' => $stateMachineId, 'action_name' => 'remind', 'from_state_id' => $paidPartiallyId, 'to_state_id' => $remindedId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1215
        $connection->insert('state_machine_transition', ['id' => Uuid::randomBytes(), 'state_machine_id' => $stateMachineId, 'action_name' => 'pay', 'from_state_id' => $paidPartiallyId, 'to_state_id' => $paidId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1216
        $connection->insert('state_machine_transition', ['id' => Uuid::randomBytes(), 'state_machine_id' => $stateMachineId, 'action_name' => 'refund_partially', 'from_state_id' => $paidPartiallyId, 'to_state_id' => $refundedPartiallyId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1217
        $connection->insert('state_machine_transition', ['id' => Uuid::randomBytes(), 'state_machine_id' => $stateMachineId, 'action_name' => 'refund', 'from_state_id' => $paidPartiallyId, 'to_state_id' => $refundedId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1218
1219
        // from "paid" to *
1220
        $connection->insert('state_machine_transition', ['id' => Uuid::randomBytes(), 'state_machine_id' => $stateMachineId, 'action_name' => 'refund_partially', 'from_state_id' => $paidId, 'to_state_id' => $refundedPartiallyId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1221
        $connection->insert('state_machine_transition', ['id' => Uuid::randomBytes(), 'state_machine_id' => $stateMachineId, 'action_name' => 'refund', 'from_state_id' => $paidId, 'to_state_id' => $refundedId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1222
1223
        // from "refunded_partially" to *
1224
        $connection->insert('state_machine_transition', ['id' => Uuid::randomBytes(), 'state_machine_id' => $stateMachineId, 'action_name' => 'refund', 'from_state_id' => $refundedPartiallyId, 'to_state_id' => $refundedId, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1225
1226
        // set initial state
1227
        $connection->update('state_machine', ['initial_state_id' => $openId], ['id' => $stateMachineId]);
1228
    }
1229
1230
    private function createRules(Connection $connection): void
1231
    {
1232
        $sundaySaleRuleId = Uuid::randomBytes();
1233
        $connection->insert('rule', ['id' => $sundaySaleRuleId, 'name' => 'Sunday sales', 'priority' => 2, 'invalid' => 0, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1234
        $connection->insert('rule_condition', ['id' => Uuid::randomBytes(), 'rule_id' => $sundaySaleRuleId, 'type' => 'dayOfWeek', 'value' => json_encode(['operator' => '=', 'dayOfWeek' => 7]), 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1235
1236
        $allCustomersRuleId = Uuid::randomBytes();
1237
        $connection->insert('rule', ['id' => $allCustomersRuleId, 'name' => 'All customers', 'priority' => 1, 'invalid' => 0, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1238
        $connection->insert('rule_condition', ['id' => Uuid::randomBytes(), 'rule_id' => $allCustomersRuleId, 'type' => 'customerCustomerGroup', 'value' => json_encode(['operator' => '=', 'customerGroupIds' => [Defaults::FALLBACK_CUSTOMER_GROUP]]), 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1239
1240
        $usaCountryId = $connection->executeQuery('SELECT LOWER(hex(id)) FROM country WHERE `iso3` = "USA"')->fetchColumn();
1241
        $usaRuleId = Uuid::randomBytes();
1242
        $connection->insert('rule', ['id' => $usaRuleId, 'name' => 'Customers from USA', 'priority' => 100, 'invalid' => 0, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1243
        $connection->insert('rule_condition', ['id' => Uuid::randomBytes(), 'rule_id' => $usaRuleId, 'type' => 'customerBillingCountry', 'value' => json_encode(['operator' => '=', 'countryIds' => [$usaCountryId]]), 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)]);
1244
    }
1245
1246
    private function createSalutation(Connection $connection): void
1247
    {
1248
        $languageEn = Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM);
1249
        $languageDe = Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM_DE);
1250
1251
        $mr = Uuid::randomBytes();
1252
        $connection->insert('salutation', [
1253
            'id' => $mr,
1254
            'salutation_key' => 'mr',
1255
            'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1256
        ]);
1257
        $connection->insert('salutation_translation', [
1258
            'salutation_id' => $mr,
1259
            'language_id' => $languageEn,
1260
            'display_name' => 'Mr.',
1261
            'letter_name' => 'Dear Mr.',
1262
            'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1263
        ]);
1264
        $connection->insert('salutation_translation', [
1265
            'salutation_id' => $mr,
1266
            'language_id' => $languageDe,
1267
            'display_name' => 'Herr',
1268
            'letter_name' => 'Sehr geehrter Herr',
1269
            'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1270
        ]);
1271
1272
        $mrs = Uuid::randomBytes();
1273
        $connection->insert('salutation', [
1274
            'id' => $mrs,
1275
            'salutation_key' => 'mrs',
1276
            'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1277
        ]);
1278
        $connection->insert('salutation_translation', [
1279
            'salutation_id' => $mrs,
1280
            'language_id' => $languageEn,
1281
            'display_name' => 'Mrs.',
1282
            'letter_name' => 'Dear Mrs.',
1283
            'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1284
        ]);
1285
        $connection->insert('salutation_translation', [
1286
            'salutation_id' => $mrs,
1287
            'language_id' => $languageDe,
1288
            'display_name' => 'Frau',
1289
            'letter_name' => 'Sehr geehrte Frau',
1290
            'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1291
        ]);
1292
1293
        $notSpecified = Uuid::randomBytes();
1294
        $connection->insert('salutation', [
1295
            'id' => $notSpecified,
1296
            'salutation_key' => 'not_specified',
1297
            'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1298
        ]);
1299
        $connection->insert('salutation_translation', [
1300
            'salutation_id' => $notSpecified,
1301
            'language_id' => $languageEn,
1302
            'display_name' => 'Not specified',
1303
            'letter_name' => ' ',
1304
            'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1305
        ]);
1306
        $connection->insert('salutation_translation', [
1307
            'salutation_id' => $notSpecified,
1308
            'language_id' => $languageDe,
1309
            'display_name' => 'Keine Angabe',
1310
            'letter_name' => ' ',
1311
            'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1312
        ]);
1313
    }
1314
1315
    private function createDeliveryTimes(Connection $connection): string
1316
    {
1317
        $languageEn = Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM);
1318
        $languageDe = Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM_DE);
1319
1320
        $oneToThree = Uuid::randomBytes();
1321
        $twoToFive = Uuid::randomBytes();
1322
        $oneToTwoWeeks = Uuid::randomBytes();
1323
        $threeToFourWeeks = Uuid::randomBytes();
1324
1325
        $connection->insert('delivery_time', ['id' => $oneToThree, 'min' => 1, 'max' => 3, 'unit' => DeliveryTimeEntity::DELIVERY_TIME_DAY, 'created_at' => (new \DateTime())->format('Y-m-d H:i:s')]);
1326
        $connection->insert('delivery_time_translation', ['delivery_time_id' => $oneToThree, 'language_id' => $languageEn, 'name' => '1-3 days', 'created_at' => (new \DateTime())->format('Y-m-d H:i:s')]);
1327
        $connection->insert('delivery_time_translation', ['delivery_time_id' => $oneToThree, 'language_id' => $languageDe, 'name' => '1-3 Tage', 'created_at' => (new \DateTime())->format('Y-m-d H:i:s')]);
1328
        $connection->insert('delivery_time', ['id' => $twoToFive, 'min' => 2, 'max' => 5, 'unit' => DeliveryTimeEntity::DELIVERY_TIME_DAY, 'created_at' => (new \DateTime())->format('Y-m-d H:i:s')]);
1329
        $connection->insert('delivery_time_translation', ['delivery_time_id' => $twoToFive, 'language_id' => $languageEn, 'name' => '2-5 days', 'created_at' => (new \DateTime())->format('Y-m-d H:i:s')]);
1330
        $connection->insert('delivery_time_translation', ['delivery_time_id' => $twoToFive, 'language_id' => $languageDe, 'name' => '2-5 Tage', 'created_at' => (new \DateTime())->format('Y-m-d H:i:s')]);
1331
        $connection->insert('delivery_time', ['id' => $oneToTwoWeeks, 'min' => 1, 'max' => 2, 'unit' => DeliveryTimeEntity::DELIVERY_TIME_WEEK, 'created_at' => (new \DateTime())->format('Y-m-d H:i:s')]);
1332
        $connection->insert('delivery_time_translation', ['delivery_time_id' => $oneToTwoWeeks, 'language_id' => $languageEn, 'name' => '1-2 weeks', 'created_at' => (new \DateTime())->format('Y-m-d H:i:s')]);
1333
        $connection->insert('delivery_time_translation', ['delivery_time_id' => $oneToTwoWeeks, 'language_id' => $languageDe, 'name' => '1-2 Wochen', 'created_at' => (new \DateTime())->format('Y-m-d H:i:s')]);
1334
        $connection->insert('delivery_time', ['id' => $threeToFourWeeks, 'min' => 3, 'max' => 4, 'unit' => DeliveryTimeEntity::DELIVERY_TIME_WEEK, 'created_at' => (new \DateTime())->format('Y-m-d H:i:s')]);
1335
        $connection->insert('delivery_time_translation', ['delivery_time_id' => $threeToFourWeeks, 'language_id' => $languageEn, 'name' => '3-4 weeks', 'created_at' => (new \DateTime())->format('Y-m-d H:i:s')]);
1336
        $connection->insert('delivery_time_translation', ['delivery_time_id' => $threeToFourWeeks, 'language_id' => $languageDe, 'name' => '3-4 Wochen', 'created_at' => (new \DateTime())->format('Y-m-d H:i:s')]);
1337
1338
        return $oneToThree;
1339
    }
1340
1341
    private function createSystemConfigOptions(Connection $connection): void
1342
    {
1343
        $connection->insert('system_config', [
1344
            'id' => Uuid::randomBytes(),
1345
            'configuration_key' => 'core.privacy.doiNewsletter',
1346
            'configuration_value' => '{"_value": true}',
1347
            'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1348
        ]);
1349
1350
        $connection->insert('system_config', [
1351
            'id' => Uuid::randomBytes(),
1352
            'configuration_key' => 'core.store.apiUri',
1353
            'configuration_value' => '{"_value": "https://api.shopware.com"}',
1354
            'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1355
        ]);
1356
1357
        $connection->insert('system_config', [
1358
            'id' => Uuid::randomBytes(),
1359
            'configuration_key' => 'core.basicInformation.email',
1360
            'configuration_value' => '{"_value": "doNotReply@localhost"}',
1361
            'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1362
        ]);
1363
    }
1364
1365
    private function createDocumentTypes(Connection $connection)
1366
    {
1367
        $invoiceId = Uuid::randomBytes();
1368
        $deliveryNoteId = Uuid::randomBytes();
1369
        $creditNoteId = Uuid::randomBytes();
1370
1371
        $connection->insert('document_type', ['id' => $invoiceId, 'technical_name' => InvoiceGenerator::INVOICE, 'created_at' => (new \DateTime())->format(Defaults::STORAGE_DATE_FORMAT)]);
1372
        $connection->insert('document_type', ['id' => $deliveryNoteId, 'technical_name' => DeliveryNoteGenerator::DELIVERY_NOTE, 'created_at' => (new \DateTime())->format(Defaults::STORAGE_DATE_FORMAT)]);
1373
        $connection->insert('document_type', ['id' => $creditNoteId, 'technical_name' => CreditNoteGenerator::CREDIT_NOTE, 'created_at' => (new \DateTime())->format(Defaults::STORAGE_DATE_FORMAT)]);
1374
1375
        $connection->insert('document_type_translation', ['document_type_id' => $invoiceId, 'language_id' => Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM_DE), 'name' => 'Rechnung', 'created_at' => (new \DateTime())->format(Defaults::STORAGE_DATE_FORMAT)]);
1376
        $connection->insert('document_type_translation', ['document_type_id' => $invoiceId, 'language_id' => Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM), 'name' => 'Invoice', 'created_at' => (new \DateTime())->format(Defaults::STORAGE_DATE_FORMAT)]);
1377
1378
        $connection->insert('document_type_translation', ['document_type_id' => $deliveryNoteId, 'language_id' => Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM_DE), 'name' => 'Lieferschein', 'created_at' => (new \DateTime())->format(Defaults::STORAGE_DATE_FORMAT)]);
1379
        $connection->insert('document_type_translation', ['document_type_id' => $deliveryNoteId, 'language_id' => Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM), 'name' => 'Delivery note', 'created_at' => (new \DateTime())->format(Defaults::STORAGE_DATE_FORMAT)]);
1380
1381
        $connection->insert('document_type_translation', ['document_type_id' => $creditNoteId, 'language_id' => Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM_DE), 'name' => 'Gutschrift', 'created_at' => (new \DateTime())->format(Defaults::STORAGE_DATE_FORMAT)]);
1382
        $connection->insert('document_type_translation', ['document_type_id' => $creditNoteId, 'language_id' => Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM), 'name' => 'Credit note', 'created_at' => (new \DateTime())->format(Defaults::STORAGE_DATE_FORMAT)]);
1383
    }
1384
1385
    private function createNewsletterMailTemplate(Connection $connection)
1386
    {
1387
        $registerMailId = Uuid::randomBytes();
1388
        $confirmMailId = Uuid::randomBytes();
1389
1390
        $languageEn = Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM);
1391
        $languageDe = Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM_DE);
1392
1393
        $connection->insert(
1394
            'mail_template',
1395
            [
1396
                'id' => $registerMailId,
1397
                'mail_template_type_id' => Uuid::fromHexToBytes($this->getMailTypeMapping()[NewsletterSubscriptionServiceInterface::MAIL_TYPE_OPT_IN]['id']),
1398
                'system_default' => true,
1399
                'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1400
            ]
1401
        );
1402
1403
        $connection->insert(
1404
            'mail_template_translation',
1405
            [
1406
                'mail_template_id' => $registerMailId,
1407
                'language_id' => $languageEn,
1408
                'subject' => 'Newsletter',
1409
                'description' => '',
1410
                'content_html' => $this->getOptInTemplate_HTML_EN(),
1411
                'content_plain' => $this->getOptInTemplate_PLAIN_EN(),
1412
                'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1413
            ]
1414
        );
1415
1416
        $connection->insert(
1417
            'mail_template_translation',
1418
            [
1419
                'mail_template_id' => $registerMailId,
1420
                'language_id' => $languageDe,
1421
                'subject' => 'Newsletter',
1422
                'description' => '',
1423
                'content_html' => $this->getOptInTemplate_HTML_DE(),
1424
                'content_plain' => $this->getOptInTemplate_PLAIN_DE(),
1425
                'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1426
            ]
1427
        );
1428
1429
        $connection->insert(
1430
            'mail_template',
1431
            [
1432
                'id' => $confirmMailId,
1433
                'mail_template_type_id' => Uuid::fromHexToBytes($this->getMailTypeMapping()[NewsletterSubscriptionServiceInterface::MAIL_TYPE_REGISTER]['id']),
1434
                'system_default' => true,
1435
                'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1436
            ]
1437
        );
1438
1439
        $connection->insert(
1440
            'mail_template_translation',
1441
            [
1442
                'mail_template_id' => $confirmMailId,
1443
                'language_id' => $languageEn,
1444
                'subject' => 'Register',
1445
                'description' => '',
1446
                'content_html' => $this->getRegisterTemplate_HTML_EN(),
1447
                'content_plain' => $this->getRegisterTemplate_PLAIN_EN(),
1448
                'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1449
            ]
1450
        );
1451
1452
        $connection->insert(
1453
            'mail_template_translation',
1454
            [
1455
                'mail_template_id' => $confirmMailId,
1456
                'language_id' => $languageDe,
1457
                'subject' => 'Register',
1458
                'description' => '',
1459
                'content_html' => $this->getRegisterTemplate_HTML_DE(),
1460
                'content_plain' => $this->getRegisterTemplate_PLAIN_DE(),
1461
                'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1462
            ]
1463
        );
1464
    }
1465
1466
    private function getRegisterTemplate_HTML_EN()
1467
    {
1468
        return '<h3>Hello {{ firstName }} {{ lastName }}</h3>
1469
                <p>thank you very much for your registration.</p>
1470
                <p>You have successfully subscribed to our newsletter.</p>
1471
        ';
1472
    }
1473
1474
    private function getRegisterTemplate_PLAIN_EN()
1475
    {
1476
        return 'Hello {{ firstName }} {{ lastName }}
1477
            
1478
                thank you very much for your registration.
1479
            
1480
                You have successfully subscribed to our newsletter.
1481
        ';
1482
    }
1483
1484
    private function getRegisterTemplate_HTML_DE()
1485
    {
1486
        return '<h3>Hallo {{ firstName }} {{ lastName }}</h3>
1487
                <p>vielen Dank für Ihre Anmeldung.</p>
1488
                <p>Sie haben sich erfolgreich zu unserem Newsletter angemeldet.</p>
1489
        ';
1490
    }
1491
1492
    private function getRegisterTemplate_PLAIN_DE()
1493
    {
1494
        return 'Hallo {{ firstName }} {{ lastName }}
1495
            
1496
                vielen Dank für Ihre Anmeldung.
1497
            
1498
                Sie haben sich erfolgreich zu unserem Newsletter angemeldet.
1499
        ';
1500
    }
1501
1502
    private function getOptInTemplate_HTML_EN()
1503
    {
1504
        return '<h3>Hello {{ firstName }} {{ lastName }}</h3>
1505
                <p>Thank you for your interest in our newsletter!</p>
1506
                <p>In order to prevent misuse of your email address, we have sent you this confirmation email. Confirm that you wish to receive the newsletter regularly by clicking <a href="{{ url }}">here</a>.</p>
1507
                <p>If you have not subscribed to the newsletter, please ignore this email.</p>
1508
        ';
1509
    }
1510
1511
    private function getOptInTemplate_PLAIN_EN()
1512
    {
1513
        return 'Hello {{ firstName }} {{ lastName }}
1514
        
1515
                Thank you for your interest in our newsletter!
1516
                
1517
                In order to prevent misuse of your email address, we have sent you this confirmation email. Confirm that you wish to receive the newsletter regularly by clicking on the link: {{ url }}
1518
                
1519
                If you have not subscribed to the newsletter, please ignore this email.
1520
        ';
1521
    }
1522
1523
    private function getOptInTemplate_HTML_DE()
1524
    {
1525
        return '<h3>Hallo {{ firstName }} {{ lastName }}</h3>
1526
                <p>Schön, dass Sie sich für unseren Newsletter interessieren!</p>
1527
                <p>Um einem Missbrauch Ihrer E-Mail-Adresse vorzubeugen, haben wir Ihnen diese Bestätigungsmail gesendet. Bestätigen Sie, dass Sie den Newsletter regelmäßig erhalten wollen, indem Sie <a href="{{ url }}">hier</a> klicken.</p>
1528
                <p>Sollten Sie den Newsletter nicht angefordert haben, ignorieren Sie diese E-Mail.</p>
1529
        ';
1530
    }
1531
1532
    private function getOptInTemplate_PLAIN_DE()
1533
    {
1534
        return 'Hallo {{ firstName }} {{ lastName }}
1535
        
1536
                Schön, dass Sie sich für unseren Newsletter interessieren! 
1537
                
1538
                Um einem Missbrauch Ihrer E-Mail-Adresse vorzubeugen, haben wir Ihnen diese Bestätigungsmail gesendet. Bestätigen Sie, dass Sie den Newsletter regelmäßig erhalten wollen, indem Sie auf den folgenden Link klicken: {{ url }} 
1539
                
1540
                Sollten Sie den Newsletter nicht angefordert haben, ignorieren Sie diese E-Mail.
1541
        ';
1542
    }
1543
1544
    private function getMailTypeMapping(): array
1545
    {
1546
        return $this->mailTypes ?? $this->mailTypes = [
1547
            MailTemplateTypes::MAILTYPE_CUSTOMER_REGISTER => [
1548
                'id' => Uuid::randomHex(),
1549
                'name' => 'Customer registration',
1550
                'nameDe' => 'Kunden-Registrierung',
1551
            ],
1552
            NewsletterSubscriptionServiceInterface::MAIL_TYPE_OPT_IN => [
1553
                'id' => Uuid::randomHex(),
1554
                'name' => 'Newsletter double opt-in',
1555
                'nameDe' => 'Newsletter Double-Opt-In',
1556
            ],
1557
            NewsletterSubscriptionServiceInterface::MAIL_TYPE_REGISTER => [
1558
                'id' => Uuid::randomHex(),
1559
                'name' => 'Newsletter registration',
1560
                'nameDe' => 'Newsletter-Registrierung',
1561
            ],
1562
            MailTemplateTypes::MAILTYPE_ORDER_CONFIRM => [
1563
                'id' => Uuid::randomHex(),
1564
                'name' => 'Order confirmation',
1565
                'nameDe' => 'Bestellbestätigung',
1566
            ],
1567
            MailTemplateTypes::MAILTYPE_CUSTOMER_GROUP_CHANGE_ACCEPT => [
1568
                'id' => Uuid::randomHex(),
1569
                'name' => 'Customer group change accepted',
1570
                'nameDe' => 'Kundengruppenwechsel akzeptiert',
1571
            ],
1572
            MailTemplateTypes::MAILTYPE_CUSTOMER_GROUP_CHANGE_REJECT => [
1573
                'id' => Uuid::randomHex(),
1574
                'name' => 'Customer group change rejected',
1575
                'nameDe' => 'Kundengruppenwechsel abgelehnt',
1576
            ],
1577
            MailTemplateTypes::MAILTYPE_PASSWORD_CHANGE => [
1578
                'id' => Uuid::randomHex(),
1579
                'name' => 'Password changed',
1580
                'nameDe' => 'Passwort geändert',
1581
            ],
1582
            MailTemplateTypes::MAILTYPE_SEPA_CONFIRMATION => [
1583
                'id' => Uuid::randomHex(),
1584
                'name' => 'SEPA authorization',
1585
                'nameDe' => 'SEPA-Autorisierung',
1586
            ],
1587
            MailTemplateTypes::MAILTYPE_STOCK_WARNING => [
1588
                'id' => Uuid::randomHex(),
1589
                'name' => 'Product stock warning',
1590
                'nameDe' => 'Lagerbestandshinweis',
1591
            ],
1592
            MailTemplateTypes::MAILTYPE_STATE_ENTER_ORDER_DELIVERY_STATE_RETURNED_PARTIALLY => [
1593
                'id' => Uuid::randomHex(),
1594
                'name' => 'Enter order state: Open',
1595
                'nameDe' => 'Eintritt Bestellstatus: Offen',
1596
            ],
1597
1598
            MailTemplateTypes::MAILTYPE_STATE_ENTER_ORDER_DELIVERY_STATE_SHIPPED_PARTIALLY => [
1599
                'id' => Uuid::randomHex(),
1600
                'name' => 'Enter order state: Shipped (partially)',
1601
                'nameDe' => 'Eintritt Bestellstatus: Teilweise versandt',
1602
            ],
1603
1604
            MailTemplateTypes::MAILTYPE_STATE_ENTER_ORDER_DELIVERY_STATE_RETURNED => [
1605
                'id' => Uuid::randomHex(),
1606
                'name' => 'Enter order state: Returned',
1607
                'nameDe' => 'Eintritt Bestellstatus: Retour',
1608
            ],
1609
1610
            MailTemplateTypes::MAILTYPE_STATE_ENTER_ORDER_DELIVERY_STATE_SHIPPED => [
1611
                'id' => Uuid::randomHex(),
1612
                'name' => 'Enter order state: Shipped',
1613
                'nameDe' => 'Eintritt Bestellstatus: Versandt',
1614
            ],
1615
1616
            MailTemplateTypes::MAILTYPE_STATE_ENTER_ORDER_DELIVERY_STATE_CANCELLED => [
1617
                'id' => Uuid::randomHex(),
1618
                'name' => 'Enter order state: Cancelled',
1619
                'nameDe' => 'Eintritt Bestellstatus: Abgebrochen',
1620
            ],
1621
1622
            MailTemplateTypes::MAILTYPE_STATE_ENTER_ORDER_TRANSACTION_STATE_REMINDED => [
1623
                'id' => Uuid::randomHex(),
1624
                'name' => 'Enter payment state: Reminded',
1625
                'nameDe' => 'Eintritt Zahlungsstatus: Erinnert',
1626
            ],
1627
1628
            MailTemplateTypes::MAILTYPE_STATE_ENTER_ORDER_TRANSACTION_STATE_REFUNDED_PARTIALLY => [
1629
                'id' => Uuid::randomHex(),
1630
                'name' => 'Enter payment state: Refunded (partially)',
1631
                'nameDe' => 'Eintritt Zahlungsstatus: Teilweise erstattet',
1632
            ],
1633
1634
            MailTemplateTypes::MAILTYPE_STATE_ENTER_ORDER_TRANSACTION_STATE_CANCELLED => [
1635
                'id' => Uuid::randomHex(),
1636
                'name' => 'Enter payment state: Cancelled',
1637
                'nameDe' => 'Eintritt Zahlungsstatus: Abgebrochen',
1638
            ],
1639
1640
            MailTemplateTypes::MAILTYPE_STATE_ENTER_ORDER_TRANSACTION_STATE_PAID => [
1641
                'id' => Uuid::randomHex(),
1642
                'name' => 'Enter payment state: Paid',
1643
                'nameDe' => 'Eintritt Zahlungsstatus: Bezahlt',
1644
            ],
1645
1646
            MailTemplateTypes::MAILTYPE_STATE_ENTER_ORDER_TRANSACTION_STATE_REFUNDED => [
1647
                'id' => Uuid::randomHex(),
1648
                'name' => 'Enter payment state: Refunded',
1649
                'nameDe' => 'Eintritt Zahlungsstatus: Erstattet',
1650
            ],
1651
1652
            MailTemplateTypes::MAILTYPE_STATE_ENTER_ORDER_TRANSACTION_STATE_PAID_PARTIALLY => [
1653
                'id' => Uuid::randomHex(),
1654
                'name' => 'Enter payment state: Paid (partially)',
1655
                'nameDe' => 'Eintritt Zahlungsstatus: Teilweise bezahlt',
1656
            ],
1657
1658
            MailTemplateTypes::MAILTYPE_STATE_ENTER_ORDER_TRANSACTION_STATE_OPEN => [
1659
                'id' => Uuid::randomHex(),
1660
                'name' => 'Enter payment state: Open',
1661
                'nameDe' => 'Eintritt Zahlungsstatus: Offen',
1662
            ],
1663
1664
            MailTemplateTypes::MAILTYPE_STATE_ENTER_ORDER_STATE_OPEN => [
1665
                'id' => Uuid::randomHex(),
1666
                'name' => 'Enter order state: Open',
1667
                'nameDe' => 'Eintritt Bestellstatus: Offen',
1668
            ],
1669
1670
            MailTemplateTypes::MAILTYPE_STATE_ENTER_ORDER_STATE_IN_PROGRESS => [
1671
                'id' => Uuid::randomHex(),
1672
                'name' => 'Enter order state: In progress',
1673
                'nameDe' => 'Eintritt Bestellstatus: In Bearbeitung',
1674
            ],
1675
1676
            MailTemplateTypes::MAILTYPE_STATE_ENTER_ORDER_STATE_CANCELLED => [
1677
                'id' => Uuid::randomHex(),
1678
                'name' => 'Enter order state: Cancelled',
1679
                'nameDe' => 'Eintritt Bestellstatus: Abgebrochen',
1680
            ],
1681
1682
            MailTemplateTypes::MAILTYPE_STATE_ENTER_ORDER_STATE_COMPLETED => [
1683
                'id' => Uuid::randomHex(),
1684
                'name' => 'Enter order state: Done',
1685
                'nameDe' => 'Eintritt Bestellstatus: Abgeschlossen',
1686
            ],
1687
        ];
1688
    }
1689
1690
    private function createMailTemplateTypes(Connection $connection)
1691
    {
1692
        $definitionMailTypes = $this->getMailTypeMapping();
1693
1694
        $languageEn = Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM);
1695
        $languageDe = Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM_DE);
1696
1697
        foreach ($definitionMailTypes as $typeName => $mailType) {
1698
            $connection->insert(
1699
                'mail_template_type',
1700
                [
1701
                    'id' => Uuid::fromHexToBytes($mailType['id']),
1702
                    'technical_name' => $typeName,
1703
                    'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1704
                ]
1705
            );
1706
            $connection->insert(
1707
                'mail_template_type_translation',
1708
                [
1709
                    'mail_template_type_id' => Uuid::fromHexToBytes($mailType['id']),
1710
                    'name' => $mailType['name'],
1711
                    'language_id' => $languageEn,
1712
                    'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1713
                ]
1714
            );
1715
            $connection->insert(
1716
                'mail_template_type_translation',
1717
                [
1718
                    'mail_template_type_id' => Uuid::fromHexToBytes($mailType['id']),
1719
                    'name' => $mailType['nameDe'],
1720
                    'language_id' => $languageDe,
1721
                    'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1722
                ]
1723
            );
1724
        }
1725
    }
1726
1727
    private function createDocumentConfiguration(Connection $connection)
1728
    {
1729
        $stornoId = Uuid::randomBytes();
1730
1731
        $connection->insert('document_type', ['id' => $stornoId, 'technical_name' => StornoGenerator::STORNO, 'created_at' => (new \DateTime())->format(Defaults::STORAGE_DATE_FORMAT)]);
1732
        $connection->insert('document_type_translation', ['document_type_id' => $stornoId, 'language_id' => Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM_DE), 'name' => 'Stornorechnung', 'created_at' => (new \DateTime())->format(Defaults::STORAGE_DATE_FORMAT)]);
1733
        $connection->insert('document_type_translation', ['document_type_id' => $stornoId, 'language_id' => Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM), 'name' => 'Storno bill', 'created_at' => (new \DateTime())->format(Defaults::STORAGE_DATE_FORMAT)]);
1734
1735
        $stornoConfigId = Uuid::randomBytes();
1736
        $invoiceConfigId = Uuid::randomBytes();
1737
        $deliveryConfigId = Uuid::randomBytes();
1738
        $creditConfigId = Uuid::randomBytes();
1739
1740
        $invoiceId = $connection->fetchColumn('SELECT id FROM `document_type` WHERE `technical_name` = :technical_name', ['technical_name' => InvoiceGenerator::INVOICE]);
1741
        $deliverNoteId = $connection->fetchColumn('SELECT id FROM `document_type` WHERE `technical_name` = :technical_name', ['technical_name' => DeliveryNoteGenerator::DELIVERY_NOTE]);
1742
        $creditNoteId = $connection->fetchColumn('SELECT id FROM `document_type` WHERE `technical_name` = :technical_name', ['technical_name' => CreditNoteGenerator::CREDIT_NOTE]);
1743
1744
        $defaultConfig = [
1745
            'displayPrices' => true,
1746
            'displayFooter' => true,
1747
            'displayHeader' => true,
1748
            'displayLineItems' => true,
1749
            'diplayLineItemPosition' => true,
1750
            'displayPageCount' => true,
1751
            'displayCompanyAddress' => true,
1752
            'pageOrientation' => 'portrait',
1753
            'pageSize' => 'a4',
1754
            'itemsPerPage' => 10,
1755
            'companyName' => 'Muster AG',
1756
            'taxNumber' => '000111000',
1757
            'vatId' => 'XX 111 222 333',
1758
            'taxOffice' => 'Coesfeld',
1759
            'bankName' => 'Kreissparkasse Münster',
1760
            'bankIban' => 'DE11111222223333344444',
1761
            'bankBic' => 'SWSKKEFF',
1762
            'placeOfJurisdiction' => 'Coesfeld',
1763
            'placeOfFulfillment' => 'Coesfeld',
1764
            'executiveDirector' => 'Max Mustermann',
1765
            'companyAddress' => 'Muster AG - Ebbinghoff 10 - 48624 Schöppingen',
1766
        ];
1767
1768
        $deliveryNoteConfig = $defaultConfig;
1769
        $deliveryNoteConfig['displayPrices'] = false;
1770
1771
        $stornoConfig = $defaultConfig;
1772
        $stornoConfig['referencedDocumentType'] = InvoiceGenerator::INVOICE;
1773
1774
        $configJson = json_encode($defaultConfig);
1775
        $deliveryNoteConfigJson = json_encode($deliveryNoteConfig);
1776
        $stornoConfigJson = json_encode($stornoConfig);
1777
1778
        $connection->insert('document_base_config', ['id' => $stornoConfigId, 'name' => StornoGenerator::STORNO, 'global' => 1, 'filename_prefix' => StornoGenerator::STORNO . '_', 'document_type_id' => $stornoId, 'config' => $stornoConfigJson, 'created_at' => (new \DateTime())->format(Defaults::STORAGE_DATE_FORMAT)]);
1779
        $connection->insert('document_base_config', ['id' => $invoiceConfigId, 'name' => InvoiceGenerator::INVOICE, 'global' => 1, 'filename_prefix' => InvoiceGenerator::INVOICE . '_', 'document_type_id' => $invoiceId, 'config' => $configJson, 'created_at' => (new \DateTime())->format(Defaults::STORAGE_DATE_FORMAT)]);
1780
        $connection->insert('document_base_config', ['id' => $deliveryConfigId, 'name' => DeliveryNoteGenerator::DELIVERY_NOTE, 'global' => 1, 'filename_prefix' => DeliveryNoteGenerator::DELIVERY_NOTE . '_', 'document_type_id' => $deliverNoteId, 'config' => $deliveryNoteConfigJson, 'created_at' => (new \DateTime())->format(Defaults::STORAGE_DATE_FORMAT)]);
1781
        $connection->insert('document_base_config', ['id' => $creditConfigId, 'name' => CreditNoteGenerator::CREDIT_NOTE, 'global' => 1, 'filename_prefix' => CreditNoteGenerator::CREDIT_NOTE . '_', 'document_type_id' => $creditNoteId, 'config' => $configJson, 'created_at' => (new \DateTime())->format(Defaults::STORAGE_DATE_FORMAT)]);
1782
1783
        $connection->insert('document_base_config_sales_channel', ['id' => Uuid::randomBytes(), 'document_base_config_id' => $stornoConfigId, 'document_type_id' => $stornoId, 'created_at' => (new \DateTime())->format(Defaults::STORAGE_DATE_FORMAT)]);
1784
        $connection->insert('document_base_config_sales_channel', ['id' => Uuid::randomBytes(), 'document_base_config_id' => $invoiceConfigId, 'document_type_id' => $invoiceId, 'created_at' => (new \DateTime())->format(Defaults::STORAGE_DATE_FORMAT)]);
1785
        $connection->insert('document_base_config_sales_channel', ['id' => Uuid::randomBytes(), 'document_base_config_id' => $deliveryConfigId, 'document_type_id' => $deliverNoteId, 'created_at' => (new \DateTime())->format(Defaults::STORAGE_DATE_FORMAT)]);
1786
        $connection->insert('document_base_config_sales_channel', ['id' => Uuid::randomBytes(), 'document_base_config_id' => $creditConfigId, 'document_type_id' => $creditNoteId, 'created_at' => (new \DateTime())->format(Defaults::STORAGE_DATE_FORMAT)]);
1787
1788
        // number ranges
1789
        $definitionNumberRangeTypes = [
1790
            'document_invoice' => [
1791
                'id' => Uuid::randomHex(),
1792
                'global' => 0,
1793
                'nameDe' => 'Rechnung',
1794
            ],
1795
            'document_storno' => [
1796
                'id' => Uuid::randomHex(),
1797
                'global' => 0,
1798
                'nameDe' => 'Storno',
1799
            ],
1800
            'document_delivery_note' => [
1801
                'id' => Uuid::randomHex(),
1802
                'global' => 0,
1803
                'nameDe' => 'Lieferschein',
1804
            ],
1805
            'document_credit_note' => [
1806
                'id' => Uuid::randomHex(),
1807
                'global' => 0,
1808
                'nameDe' => 'Gutschrift',
1809
            ],
1810
        ];
1811
1812
        $definitionNumberRanges = [
1813
            'document_invoice' => [
1814
                'id' => Uuid::randomHex(),
1815
                'name' => 'Invoices',
1816
                'nameDe' => 'Rechnung',
1817
                'global' => 1,
1818
                'typeId' => $definitionNumberRangeTypes['document_invoice']['id'],
1819
                'pattern' => '{n}',
1820
                'start' => 1000,
1821
            ],
1822
            'document_storno' => [
1823
                'id' => Uuid::randomHex(),
1824
                'name' => 'Stornos',
1825
                'nameDe' => 'Storno',
1826
                'global' => 1,
1827
                'typeId' => $definitionNumberRangeTypes['document_storno']['id'],
1828
                'pattern' => '{n}',
1829
                'start' => 1000,
1830
            ],
1831
            'document_delivery_note' => [
1832
                'id' => Uuid::randomHex(),
1833
                'name' => 'DeliveryNotes',
1834
                'nameDe' => 'Lieferschein',
1835
                'global' => 1,
1836
                'typeId' => $definitionNumberRangeTypes['document_delivery_note']['id'],
1837
                'pattern' => '{n}',
1838
                'start' => 1000,
1839
            ],
1840
            'document_credit_note' => [
1841
                'id' => Uuid::randomHex(),
1842
                'name' => 'CreditNotes',
1843
                'nameDe' => 'Gutschrift',
1844
                'global' => 1,
1845
                'typeId' => $definitionNumberRangeTypes['document_credit_note']['id'],
1846
                'pattern' => '{n}',
1847
                'start' => 1000,
1848
            ],
1849
        ];
1850
1851
        $languageEn = Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM);
1852
        $languageDe = Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM_DE);
1853
1854
        foreach ($definitionNumberRangeTypes as $typeName => $numberRangeType) {
1855
            $connection->insert(
1856
                'number_range_type',
1857
                [
1858
                    'id' => Uuid::fromHexToBytes($numberRangeType['id']),
1859
                    'global' => $numberRangeType['global'],
1860
                    'technical_name' => $typeName,
1861
                    'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1862
                ]
1863
            );
1864
            $connection->insert(
1865
                'number_range_type_translation',
1866
                [
1867
                    'number_range_type_id' => Uuid::fromHexToBytes($numberRangeType['id']),
1868
                    'type_name' => $typeName,
1869
                    'language_id' => $languageEn,
1870
                    'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1871
                ]
1872
            );
1873
            $connection->insert(
1874
                'number_range_type_translation',
1875
                [
1876
                    'number_range_type_id' => Uuid::fromHexToBytes($numberRangeType['id']),
1877
                    'type_name' => $numberRangeType['nameDe'],
1878
                    'language_id' => $languageDe,
1879
                    'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1880
                ]
1881
            );
1882
        }
1883
1884
        foreach ($definitionNumberRanges as $typeName => $numberRange) {
1885
            $connection->insert(
1886
                'number_range',
1887
                [
1888
                    'id' => Uuid::fromHexToBytes($numberRange['id']),
1889
                    'global' => $numberRange['global'],
1890
                    'type_id' => Uuid::fromHexToBytes($numberRange['typeId']),
1891
                    'pattern' => $numberRange['pattern'],
1892
                    'start' => $numberRange['start'],
1893
                    'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1894
                ]
1895
            );
1896
            $connection->insert(
1897
                'number_range_translation',
1898
                [
1899
                    'number_range_id' => Uuid::fromHexToBytes($numberRange['id']),
1900
                    'name' => $numberRange['name'],
1901
                    'language_id' => $languageEn,
1902
                    'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1903
                ]
1904
            );
1905
            $connection->insert(
1906
                'number_range_translation',
1907
                [
1908
                    'number_range_id' => Uuid::fromHexToBytes($numberRange['id']),
1909
                    'name' => $numberRange['nameDe'],
1910
                    'language_id' => $languageDe,
1911
                    'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1912
                ]
1913
            );
1914
        }
1915
    }
1916
1917
    private function createMailEvents(Connection $connection)
1918
    {
1919
        $orderCofirmationTemplateId = Uuid::randomBytes();
1920
1921
        $connection->insert(
1922
            'mail_template',
1923
            [
1924
                'id' => $orderCofirmationTemplateId,
1925
                'mail_template_type_id' => Uuid::fromHexToBytes($this->getMailTypeMapping()[MailTemplateTypes::MAILTYPE_ORDER_CONFIRM]['id']),
1926
                'system_default' => 1,
1927
                'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1928
            ]
1929
        );
1930
1931
        $connection->insert(
1932
            'mail_template_translation',
1933
            [
1934
                'mail_template_id' => $orderCofirmationTemplateId,
1935
                'language_id' => Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM),
1936
                'subject' => 'Order confirmation',
1937
                'description' => '',
1938
                'sender_name' => 'Shop',
1939
                'content_html' => $this->getHtmlTemplateEn(),
1940
                'content_plain' => $this->getPlainTemplateEn(),
1941
                'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1942
            ]
1943
        );
1944
1945
        $connection->insert(
1946
            'mail_template_translation',
1947
            [
1948
                'mail_template_id' => $orderCofirmationTemplateId,
1949
                'language_id' => Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM_DE),
1950
                'subject' => 'Bestellbestätigung',
1951
                'description' => '',
1952
                'sender_name' => 'Shop',
1953
                'content_html' => $this->getHtmlTemplateDe(),
1954
                'content_plain' => $this->getPlainTemplateDe(),
1955
                'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1956
            ]
1957
        );
1958
1959
        $connection->insert(
1960
            'event_action',
1961
            [
1962
                'id' => Uuid::randomBytes(),
1963
                'event_name' => CheckoutOrderPlacedEvent::EVENT_NAME,
1964
                'action_name' => MailSendSubscriber::ACTION_NAME,
1965
                'config' => json_encode([
1966
                    'mail_template_type_id' => $this->getMailTypeMapping()[MailTemplateTypes::MAILTYPE_ORDER_CONFIRM]['id'],
1967
                ]),
1968
                'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1969
            ]
1970
        );
1971
1972
        $customerRegistrationTemplateId = Uuid::randomBytes();
1973
1974
        $connection->insert(
1975
            'mail_template',
1976
            [
1977
                'id' => $customerRegistrationTemplateId,
1978
                'mail_template_type_id' => Uuid::fromHexToBytes($this->getMailTypeMapping()[MailTemplateTypes::MAILTYPE_CUSTOMER_REGISTER]['id']),
1979
                'system_default' => 1,
1980
                'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1981
            ]
1982
        );
1983
1984
        $connection->insert(
1985
            'mail_template_translation',
1986
            [
1987
                'mail_template_id' => $customerRegistrationTemplateId,
1988
                'language_id' => Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM),
1989
                'subject' => 'Your Registration at {{ salesChannel.name }}',
1990
                'description' => 'Registration confirmation',
1991
                'sender_name' => '{{ salesChannel.name }}',
1992
                'content_html' => $this->getRegistrationHtmlTemplateEn(),
1993
                'content_plain' => $this->getRegistrationPlainTemplateEn(),
1994
                'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
1995
            ]
1996
        );
1997
1998
        $connection->insert(
1999
            'mail_template_translation',
2000
            [
2001
                'mail_template_id' => $customerRegistrationTemplateId,
2002
                'language_id' => Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM_DE),
2003
                'subject' => 'Deine Registrierung bei {{ salesChannel.name }}',
2004
                'description' => 'Registrierungsbestätigung',
2005
                'sender_name' => '{{ salesChannel.name }}',
2006
                'content_html' => $this->getRegistrationHtmlTemplateDe(),
2007
                'content_plain' => $this->getRegistrationPlainTemplateDe(),
2008
                'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
2009
            ]
2010
        );
2011
2012
        $passwordChangeTemplateId = Uuid::randomBytes();
2013
2014
        $connection->insert(
2015
            'mail_template',
2016
            [
2017
                'id' => $passwordChangeTemplateId,
2018
                'mail_template_type_id' => Uuid::fromHexToBytes($this->getMailTypeMapping()[MailTemplateTypes::MAILTYPE_PASSWORD_CHANGE]['id']),
2019
                'system_default' => 1,
2020
                'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
2021
            ]
2022
        );
2023
2024
        $connection->insert(
2025
            'mail_template_translation',
2026
            [
2027
                'subject' => 'Password reset - {{ salesChannel.name }}',
2028
                'description' => 'Password reset request',
2029
                'sender_name' => '{{ salesChannel.name }}',
2030
                'content_html' => $this->getPasswordChangeHtmlTemplateEn(),
2031
                'content_plain' => $this->getPasswordChangePlainTemplateEn(),
2032
                'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
2033
                'mail_template_id' => $passwordChangeTemplateId,
2034
                'language_id' => Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM),
2035
            ]
2036
        );
2037
2038
        $connection->insert(
2039
            'mail_template_translation',
2040
            [
2041
                'subject' => 'Password zurücksetzen - {{ salesChannel.name }}',
2042
                'description' => 'Passwort zurücksetzen Anfrage',
2043
                'sender_name' => '{{ salesChannel.name }}',
2044
                'content_html' => $this->getPasswordChangeHtmlTemplateDe(),
2045
                'content_plain' => $this->getPasswordChangePlainTemplateDe(),
2046
                'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
2047
                'mail_template_id' => $passwordChangeTemplateId,
2048
                'language_id' => Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM_DE),
2049
            ]
2050
        );
2051
2052
        $customerGroupChangeAcceptedTemplateId = Uuid::randomBytes();
2053
2054
        $connection->insert(
2055
            'mail_template',
2056
            [
2057
                'id' => $customerGroupChangeAcceptedTemplateId,
2058
                'mail_template_type_id' => Uuid::fromHexToBytes($this->getMailTypeMapping()[MailTemplateTypes::MAILTYPE_CUSTOMER_GROUP_CHANGE_ACCEPT]['id']),
2059
                'system_default' => 1,
2060
                'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
2061
            ]
2062
        );
2063
2064
        $connection->insert(
2065
            'mail_template_translation',
2066
            [
2067
                'subject' => 'Your merchant account has been unlocked - {{ salesChannel.name }}',
2068
                'description' => 'Customer Group Change accepted',
2069
                'sender_name' => '{{ salesChannel.name }}',
2070
                'content_html' => $this->getCustomerGroupChangeAcceptedHtmlTemplateEn(),
2071
                'content_plain' => $this->getCustomerGroupChangeAcceptedPlainTemplateEn(),
2072
                'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
2073
                'mail_template_id' => $customerGroupChangeAcceptedTemplateId,
2074
                'language_id' => Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM),
2075
            ]
2076
        );
2077
2078
        $connection->insert(
2079
            'mail_template_translation',
2080
            [
2081
                'subject' => 'Ihr Händleraccount wurde freigeschaltet - {{ salesChannel.name }}',
2082
                'description' => 'Kundengruppenwechsel freigeschaltet',
2083
                'sender_name' => '{{ salesChannel.name }}',
2084
                'content_html' => $this->getCustomerGroupChangeAcceptedHtmlTemplateDe(),
2085
                'content_plain' => $this->getCustomerGroupChangeAcceptedPlainTemplateDe(),
2086
                'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
2087
                'mail_template_id' => $customerGroupChangeAcceptedTemplateId,
2088
                'language_id' => Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM_DE),
2089
            ]
2090
        );
2091
2092
        $customerGroupChangeRejectedTemplateId = Uuid::randomBytes();
2093
2094
        $connection->insert(
2095
            'mail_template',
2096
            [
2097
                'id' => $customerGroupChangeRejectedTemplateId,
2098
                'mail_template_type_id' => Uuid::fromHexToBytes($this->getMailTypeMapping()[MailTemplateTypes::MAILTYPE_CUSTOMER_GROUP_CHANGE_REJECT]['id']),
2099
                'system_default' => 1,
2100
                'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
2101
            ]
2102
        );
2103
2104
        $connection->insert(
2105
            'mail_template_translation',
2106
            [
2107
                'subject' => 'Your trader account has not been accepted - {{ salesChannel.name }}',
2108
                'description' => 'Customer Group Change rejected',
2109
                'sender_name' => '{{ salesChannel.name }}',
2110
                'content_html' => $this->getCustomerGroupChangeRejectedHtmlTemplateEn(),
2111
                'content_plain' => $this->getCustomerGroupChangeRejectedPlainTemplateEn(),
2112
                'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
2113
                'mail_template_id' => $customerGroupChangeRejectedTemplateId,
2114
                'language_id' => Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM),
2115
            ]
2116
        );
2117
2118
        $connection->insert(
2119
            'mail_template_translation',
2120
            [
2121
                'subject' => 'Ihr Händleraccountantrag wurde abgelehnt - {{ salesChannel.name }}',
2122
                'description' => 'Kundengruppenwechsel abgelehnt',
2123
                'sender_name' => '{{ salesChannel.name }}',
2124
                'content_html' => $this->getCustomerGroupChangeRejectedHtmlTemplateDe(),
2125
                'content_plain' => $this->getCustomerGroupChangeRejectedPlainTemplateDe(),
2126
                'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
2127
                'mail_template_id' => $customerGroupChangeRejectedTemplateId,
2128
                'language_id' => Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM_DE),
2129
            ]
2130
        );
2131
2132
        $connection->insert(
2133
            'event_action',
2134
            [
2135
                'id' => Uuid::randomBytes(),
2136
                'event_name' => CustomerRegisterEvent::EVENT_NAME,
2137
                'action_name' => MailSendSubscriber::ACTION_NAME,
2138
                'config' => json_encode([
2139
                    'mail_template_type_id' => $this->getMailTypeMapping()[MailTemplateTypes::MAILTYPE_CUSTOMER_REGISTER]['id'],
2140
                ]),
2141
                'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
2142
            ]
2143
        );
2144
2145
        $connection->insert(
2146
            'event_action',
2147
            [
2148
                'id' => Uuid::randomBytes(),
2149
                'event_name' => NewsletterRegisterEvent::EVENT_NAME,
2150
                'action_name' => MailSendSubscriber::ACTION_NAME,
2151
                'config' => json_encode([
2152
                    'mail_template_type_id' => $this->getMailTypeMapping()[NewsletterSubscriptionServiceInterface::MAIL_TYPE_OPT_IN]['id'],
2153
                ]),
2154
                'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
2155
            ]
2156
        );
2157
2158
        $connection->insert(
2159
            'event_action',
2160
            [
2161
                'id' => Uuid::randomBytes(),
2162
                'event_name' => NewsletterConfirmEvent::EVENT_NAME,
2163
                'action_name' => MailSendSubscriber::ACTION_NAME,
2164
                'config' => json_encode([
2165
                    'mail_template_type_id' => $this->getMailTypeMapping()[NewsletterSubscriptionServiceInterface::MAIL_TYPE_REGISTER]['id'],
2166
                ]),
2167
                'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
2168
            ]
2169
        );
2170
    }
2171
2172
    private function getHtmlTemplateEn(): string
2173
    {
2174
        return '<div style="font-family:arial; font-size:12px;">
2175
    
2176
{% set currencyIsoCode = order.currency.isoCode %}
2177
Dear {{order.orderCustomer.salutation.displayName }} {{order.orderCustomer.lastName}},<br>
2178
<br>
2179
Thank you for your order at {{ salesChannel.name }} (Number: {{order.orderNumber}}) on {{ order.orderDate|date }}.<br>
2180
<br>
2181
<strong>Information on your order:</strong><br>
2182
<br>
2183
2184
<table width="80%" border="0" style="font-family:Arial, Helvetica, sans-serif; font-size:12px;">
2185
    <tr>
2186
        <td bgcolor="#F7F7F2" style="border-bottom:1px solid #cccccc;"><strong>Pos.</strong></td>
2187
        <td bgcolor="#F7F7F2" style="border-bottom:1px solid #cccccc;"><strong>Description</strong></td>
2188
        <td bgcolor="#F7F7F2" style="border-bottom:1px solid #cccccc;"><strong>Quantities</strong></td>
2189
        <td bgcolor="#F7F7F2" style="border-bottom:1px solid #cccccc;"><strong>Price</strong></td>
2190
        <td bgcolor="#F7F7F2" style="border-bottom:1px solid #cccccc;"><strong>Total</strong></td>
2191
    </tr>
2192
2193
    {% for lineItem in order.lineItems %}
2194
    <tr>
2195
        <td style="border-bottom:1px solid #cccccc;">{{ loop.index }} </td>
2196
        <td style="border-bottom:1px solid #cccccc;">
2197
          {{ lineItem.label|wordwrap(80) }}<br>
2198
          Art. No.: {{ lineItem.payload.productNumber|wordwrap(80) }}
2199
        </td>
2200
        <td style="border-bottom:1px solid #cccccc;">{{ lineItem.quantity }}</td>
2201
        <td style="border-bottom:1px solid #cccccc;">{{ lineItem.unitPrice|currency(currencyIsoCode) }}</td>
2202
        <td style="border-bottom:1px solid #cccccc;">{{ lineItem.totalPrice|currency(currencyIsoCode) }}</td>
2203
    </tr>
2204
    {% endfor %}
2205
</table>
2206
2207
{% set delivery =order.deliveries.first %}
2208
<p>
2209
    <br>
2210
    <br>
2211
    Shipping costs: {{order.deliveries.first.shippingCosts.totalPrice|currency(currencyIsoCode) }}<br>
2212
    Net total: {{ order.amountNet|currency(currencyIsoCode) }}<br>
2213
    {% if order.taxStatus is same as(\'net\') %}
2214
        {% for calculatedTax in order.cartPrice.calculatedTaxes %}
2215
            plus {{ calculatedTax.taxRate }}% VAT. {{ calculatedTax.tax|currency(currencyIsoCode) }}<br>
2216
        {% endfor %}
2217
        <strong>Total gross: {{ order.amountTotal|currency(currencyIsoCode) }}</strong><br>
2218
    {% endif %}
2219
    <br>
2220
    
2221
    <strong>Selected payment type:</strong> {{ order.transactions.first.paymentMethod.name }}<br>
2222
    {{ order.transactions.first.paymentMethod.description }}<br>
2223
    <br>
2224
    
2225
    <strong>Selected shipping type:</strong> {{ delivery.shippingMethod.name }}<br>
2226
    {{ delivery.shippingMethod.description }}<br>
2227
    <br>
2228
    
2229
    {% set billingAddress = order.addresses.get(order.billingAddressId) %}
2230
    <strong>Billing address:</strong><br>
2231
    {{ billingAddress.company }}<br>
2232
    {{ billingAddress.firstName }} {{ billingAddress.lastName }}<br>
2233
    {{ billingAddress.street }} <br>
2234
    {{ billingAddress.zipcode }} {{ billingAddress.city }}<br>
2235
    {{ billingAddress.country.name }}<br>
2236
    <br>
2237
    
2238
    <strong>Shipping address:</strong><br>
2239
    {{ delivery.shippingOrderAddress.company }}<br>
2240
    {{ delivery.shippingOrderAddress.firstName }} {{ delivery.shippingOrderAddress.lastName }}<br>
2241
    {{ delivery.shippingOrderAddress.street }} <br>
2242
    {{ delivery.shippingOrderAddress.zipcode}} {{ delivery.shippingOrderAddress.city }}<br>
2243
    {{ delivery.shippingOrderAddress.country.name }}<br>
2244
    <br>
2245
    {% if billingAddress.vatId %}
2246
        Your VAT-ID: {{ billingAddress.vatId }}
2247
        In case of a successful order and if you are based in one of the EU countries, you will receive your goods exempt from turnover tax.<br>
2248
    {% endif %}
2249
    
2250
    If you have any questions, do not hesitate to contact us.
2251
2252
</p>
2253
<br>
2254
</div>';
2255
    }
2256
2257
    private function getPlainTemplateEn(): string
2258
    {
2259
        return '{% set currencyIsoCode = order.currency.isoCode %}
2260
Dear {{order.orderCustomer.salutation.displayName }} {{order.orderCustomer.lastName}},
2261
2262
Thank you for your order at {{ salesChannel.name }} (Number: {{order.orderNumber}}) on {{ order.orderDate|date }}.
2263
2264
Information on your order:
2265
2266
Pos.   Art.No.			Description			Quantities			Price			Total 
2267
2268
{% for lineItem in order.lineItems %}
2269
{{ loop.index }}      {{ lineItem.payload.productNumber|wordwrap(80) }}				{{ lineItem.label|wordwrap(80) }}			{{ lineItem.quantity }}			{{ lineItem.unitPrice|currency(currencyIsoCode) }}			{{ lineItem.totalPrice|currency(currencyIsoCode) }}
2270
{% endfor %}
2271
2272
{% set delivery =order.deliveries.first %}
2273
2274
Shipping costs: {{order.deliveries.first.shippingCosts.totalPrice|currency(currencyIsoCode) }}
2275
Net total: {{ order.amountNet|currency(currencyIsoCode) }}
2276
{% if order.taxStatus is same as(\'net\') %}
2277
	{% for calculatedTax in order.cartPrice.calculatedTaxes %}
2278
		plus {{ calculatedTax.taxRate }}% VAT. {{ calculatedTax.tax|currency(currencyIsoCode) }}
2279
	{% endfor %}
2280
	Total gross: {{ order.amountTotal|currency(currencyIsoCode) }}
2281
{% endif %}
2282
2283
Selected payment type: {{ order.transactions.first.paymentMethod.name }}
2284
{{ order.transactions.first.paymentMethod.description }}
2285
2286
Selected shipping type: {{ delivery.shippingMethod.name }}
2287
{{ delivery.shippingMethod.description }}
2288
2289
{% set billingAddress = order.addresses.get(order.billingAddressId) %}
2290
Billing address:
2291
{{ billingAddress.company }}
2292
{{ billingAddress.firstName }} {{ billingAddress.lastName }}
2293
{{ billingAddress.street }}
2294
{{ billingAddress.zipcode }} {{ billingAddress.city }}
2295
{{ billingAddress.country.name }}
2296
2297
Shipping address:
2298
{{ delivery.shippingOrderAddress.company }}
2299
{{ delivery.shippingOrderAddress.firstName }} {{ delivery.shippingOrderAddress.lastName }}
2300
{{ delivery.shippingOrderAddress.street }} 
2301
{{ delivery.shippingOrderAddress.zipcode}} {{ delivery.shippingOrderAddress.city }}
2302
{{ delivery.shippingOrderAddress.country.name }}
2303
2304
{% if billingAddress.vatId %}
2305
Your VAT-ID: {{ billingAddress.vatId }}
2306
In case of a successful order and if you are based in one of the EU countries, you will receive your goods exempt from turnover tax.
2307
{% endif %}
2308
2309
If you have any questions, do not hesitate to contact us.
2310
2311
';
2312
    }
2313
2314
    private function getHtmlTemplateDe(): string
2315
    {
2316
        return '<div style="font-family:arial; font-size:12px;">
2317
    
2318
{% set currencyIsoCode = order.currency.isoCode %}
2319
Hallo {{order.orderCustomer.salutation.displayName }} {{order.orderCustomer.lastName}},<br>
2320
<br>
2321
vielen Dank für Ihre Bestellung im {{ salesChannel.name }} (Nummer: {{order.orderNumber}}) am {{ order.orderDate|date }}.<br>
2322
<br>
2323
<strong>Informationen zu Ihrer Bestellung:</strong><br>
2324
<br>
2325
2326
<table width="80%" border="0" style="font-family:Arial, Helvetica, sans-serif; font-size:12px;">
2327
    <tr>
2328
        <td bgcolor="#F7F7F2" style="border-bottom:1px solid #cccccc;"><strong>Pos.</strong></td>
2329
        <td bgcolor="#F7F7F2" style="border-bottom:1px solid #cccccc;"><strong>Bezeichnung</strong></td>
2330
        <td bgcolor="#F7F7F2" style="border-bottom:1px solid #cccccc;"><strong>Menge</strong></td>
2331
        <td bgcolor="#F7F7F2" style="border-bottom:1px solid #cccccc;"><strong>Preis</strong></td>
2332
        <td bgcolor="#F7F7F2" style="border-bottom:1px solid #cccccc;"><strong>Summe</strong></td>
2333
    </tr>
2334
2335
    {% for lineItem in order.lineItems %}
2336
    <tr>
2337
        <td style="border-bottom:1px solid #cccccc;">{{ loop.index }} </td>
2338
        <td style="border-bottom:1px solid #cccccc;">
2339
          {{ lineItem.label|wordwrap(80) }}<br>
2340
          Artikel-Nr: {{ lineItem.payload.productNumber|wordwrap(80) }}
2341
        </td>
2342
        <td style="border-bottom:1px solid #cccccc;">{{ lineItem.quantity }}</td>
2343
        <td style="border-bottom:1px solid #cccccc;">{{ lineItem.unitPrice|currency(currencyIsoCode) }}</td>
2344
        <td style="border-bottom:1px solid #cccccc;">{{ lineItem.totalPrice|currency(currencyIsoCode) }}</td>
2345
    </tr>
2346
    {% endfor %}
2347
</table>
2348
2349
{% set delivery =order.deliveries.first %}
2350
<p>
2351
    <br>
2352
    <br>
2353
    Versandkosten: {{order.deliveries.first.shippingCosts.totalPrice|currency(currencyIsoCode) }}<br>
2354
    Gesamtkosten Netto: {{ order.amountNet|currency(currencyIsoCode) }}<br>
2355
    {% if order.taxStatus is same as(\'net\') %}
2356
        {% for calculatedTax in order.cartPrice.calculatedTaxes %}
2357
            zzgl. {{ calculatedTax.taxRate }}% MwSt. {{ calculatedTax.tax|currency(currencyIsoCode) }}<br>
2358
        {% endfor %}
2359
        <strong>Gesamtkosten Brutto: {{ order.amountTotal|currency(currencyIsoCode) }}</strong><br>
2360
    {% endif %}
2361
    <br>
2362
    
2363
    <strong>Gewählte Zahlungsart:</strong> {{ order.transactions.first.paymentMethod.name }}<br>
2364
    {{ order.transactions.first.paymentMethod.description }}<br>
2365
    <br>
2366
    
2367
    <strong>Gewählte Versandtart:</strong> {{ delivery.shippingMethod.name }}<br>
2368
    {{ delivery.shippingMethod.description }}<br>
2369
    <br>
2370
    
2371
    {% set billingAddress = order.addresses.get(order.billingAddressId) %}
2372
    <strong>Rechnungsaddresse:</strong><br>
2373
    {{ billingAddress.company }}<br>
2374
    {{ billingAddress.firstName }} {{ billingAddress.lastName }}<br>
2375
    {{ billingAddress.street }} <br>
2376
    {{ billingAddress.zipcode }} {{ billingAddress.city }}<br>
2377
    {{ billingAddress.country.name }}<br>
2378
    <br>
2379
    
2380
    <strong>Lieferadresse:</strong><br>
2381
    {{ delivery.shippingOrderAddress.company }}<br>
2382
    {{ delivery.shippingOrderAddress.firstName }} {{ delivery.shippingOrderAddress.lastName }}<br>
2383
    {{ delivery.shippingOrderAddress.street }} <br>
2384
    {{ delivery.shippingOrderAddress.zipcode}} {{ delivery.shippingOrderAddress.city }}<br>
2385
    {{ delivery.shippingOrderAddress.country.name }}<br>
2386
    <br>
2387
    {% if billingAddress.vatId %}
2388
        Ihre Umsatzsteuer-ID: {{ billingAddress.vatId }}
2389
        Bei erfolgreicher Prüfung und sofern Sie aus dem EU-Ausland
2390
        bestellen, erhalten Sie Ihre Ware umsatzsteuerbefreit. <br>
2391
    {% endif %}
2392
    
2393
    Für Rückfragen stehen wir Ihnen jederzeit gerne zur Verfügung.
2394
2395
</p>
2396
<br>
2397
</div>';
2398
    }
2399
2400
    private function getPlainTemplateDe(): string
2401
    {
2402
        return '{% set currencyIsoCode = order.currency.isoCode %}
2403
Hallo {{order.orderCustomer.salutation.displayName }} {{order.orderCustomer.lastName}},
2404
2405
vielen Dank für Ihre Bestellung im {{ salesChannel.name }} (Nummer: {{order.orderNumber}}) am {{ order.orderDate|date }}.
2406
2407
Informationen zu Ihrer Bestellung:
2408
2409
Pos.   Artikel-Nr.			Beschreibung			Menge			Preis			Summe
2410
{% for lineItem in order.lineItems %}
2411
{{ loop.index }}     {{ lineItem.payload.productNumber|wordwrap(80) }}				{{ lineItem.label|wordwrap(80) }}			{{ lineItem.quantity }}			{{ lineItem.unitPrice|currency(currencyIsoCode) }}			{{ lineItem.totalPrice|currency(currencyIsoCode) }}
2412
{% endfor %}
2413
2414
{% set delivery =order.deliveries.first %}
2415
2416
Versandtkosten: {{order.deliveries.first.shippingCosts.totalPrice|currency(currencyIsoCode) }}
2417
Gesamtkosten Netto: {{ order.amountNet|currency(currencyIsoCode) }}
2418
{% if order.taxStatus is same as(\'net\') %}
2419
	{% for calculatedTax in order.cartPrice.calculatedTaxes %}
2420
		zzgl. {{ calculatedTax.taxRate }}% MwSt. {{ calculatedTax.tax|currency(currencyIsoCode) }}
2421
	{% endfor %}
2422
	Gesamtkosten Brutto: {{ order.amountTotal|currency(currencyIsoCode) }}
2423
{% endif %}
2424
2425
Gewählte Zahlungsart: {{ order.transactions.first.paymentMethod.name }}
2426
{{ order.transactions.first.paymentMethod.description }}
2427
2428
Gewählte Versandtart: {{ delivery.shippingMethod.name }}
2429
{{ delivery.shippingMethod.description }}
2430
2431
{% set billingAddress = order.addresses.get(order.billingAddressId) %}
2432
Rechnungsadresse:
2433
{{ billingAddress.company }}
2434
{{ billingAddress.firstName }} {{ billingAddress.lastName }}
2435
{{ billingAddress.street }}
2436
{{ billingAddress.zipcode }} {{ billingAddress.city }}
2437
{{ billingAddress.country.name }}
2438
2439
Lieferadresse:
2440
{{ delivery.shippingOrderAddress.company }}
2441
{{ delivery.shippingOrderAddress.firstName }} {{ delivery.shippingOrderAddress.lastName }}
2442
{{ delivery.shippingOrderAddress.street }} 
2443
{{ delivery.shippingOrderAddress.zipcode}} {{ delivery.shippingOrderAddress.city }}
2444
{{ delivery.shippingOrderAddress.country.name }}
2445
2446
{% if billingAddress.vatId %}
2447
Ihre Umsatzsteuer-ID: {{ billingAddress.vatId }}
2448
Bei erfolgreicher Prüfung und sofern Sie aus dem EU-Ausland
2449
bestellen, erhalten Sie Ihre Ware umsatzsteuerbefreit.
2450
{% endif %}
2451
2452
Für Rückfragen stehen wir Ihnen jederzeit gerne zur Verfügung.
2453
2454
';
2455
    }
2456
2457
    private function getRegistrationHtmlTemplateEn(): string
2458
    {
2459
        return '<div style="font-family:arial; font-size:12px;">
2460
            <p>
2461
                Dear {{ customer.salutation.displayName }} {{ customer.lastName }},<br/>
2462
                <br/>
2463
                thank you for your registration with our Shop.<br/>
2464
                You will gain access via the email address <strong>{{ customer.email }}</strong> and the password you have chosen.<br/>
2465
                You can change your password anytime.
2466
            </p>
2467
        </div>';
2468
    }
2469
2470
    private function getRegistrationPlainTemplateEn(): string
2471
    {
2472
        return 'Dear {{ customer.salutation.displayName }} {{ customer.lastName }},
2473
                
2474
                thank you for your registration with our Shop.
2475
                You will gain access via the email address {{ customer.email }} and the password you have chosen.
2476
                You can change your password anytime.        
2477
        ';
2478
    }
2479
2480
    private function getRegistrationHtmlTemplateDe(): string
2481
    {
2482
        return '<div style="font-family:arial; font-size:12px;">
2483
            <p>
2484
                Hallo {{ customer.salutation.displayName }} {{ customer.lastName }},<br/>
2485
                <br/>
2486
                vielen Dank für Ihre Anmeldung in unserem Shop.<br/>
2487
                Sie erhalten Zugriff über Ihre E-Mail-Adresse <strong>{{ customer.email }}</strong> und dem von Ihnen gewählten Kennwort.<br/>
2488
                Sie können Ihr Kennwort jederzeit nachträglich ändern.
2489
            </p>
2490
        </div>';
2491
    }
2492
2493
    private function getRegistrationPlainTemplateDe(): string
2494
    {
2495
        return 'Hallo {{ customer.salutation.displayName }} {{ customer.lastName }},
2496
                
2497
                vielen Dank für Ihre Anmeldung in unserem Shop.
2498
                Sie erhalten Zugriff über Ihre E-Mail-Adresse {{ customer.email }} und dem von Ihnen gewählten Kennwort.
2499
                Sie können Ihr Kennwort jederzeit nachträglich ändern.
2500
';
2501
    }
2502
2503
    private function getPasswordChangeHtmlTemplateEn(): string
2504
    {
2505
        return '<div style="font-family:arial; font-size:12px;">
2506
    <p>
2507
        Dear {{ customer.salutation.displayName }} {{ customer.lastName }},<br/>
2508
        <br/>
2509
        there has been a request to reset you Password in the Shop {{ salesChannel.name }}
2510
        Please confirm the link below to specify a new password.<br/>
2511
        <br/>
2512
        <a href="{{ urlResetPassword }}">Reset passwort</a><br/>
2513
        <br/>
2514
        This link is valid for the next 2 hours. After that you have to request a new confirmation link.<br/>
2515
        If you do not want to reset your password, please ignore this email. No changes will be made.
2516
    </p>
2517
</div>';
2518
    }
2519
2520
    private function getPasswordChangePlainTemplateEn(): string
2521
    {
2522
        return '
2523
        Dear {{ customer.salutation.displayName }} {{ customer.lastName }},
2524
2525
        there has been a request to reset you Password in the Shop {{ salesChannel.name }}
2526
        Please confirm the link below to specify a new password.
2527
2528
        Reset password: {{ urlResetPassword }}
2529
2530
        This link is valid for the next 2 hours. After that you have to request a new confirmation link.
2531
        If you do not want to reset your password, please ignore this email. No changes will be made.
2532
    ';
2533
    }
2534
2535
    private function getPasswordChangeHtmlTemplateDe(): string
2536
    {
2537
        return '<div style="font-family:arial; font-size:12px;">
2538
    <p>
2539
        Hallo {{ customer.salutation.displayName }} {{ customer.lastName }},<br/>
2540
        <br/>
2541
        im Shop {{ salesChannel.name }} wurde eine Anfrage gestellt, um Ihr Passwort zurück zu setzen.
2542
        Bitte bestätigen Sie den unten stehenden Link, um ein neues Passwort zu definieren.<br/>
2543
        <br/>
2544
        <a href="{{ urlResetPassword }}">Passwort zurücksetzen</a><br/>
2545
        <br/>
2546
        Dieser Link ist nur für die nächsten 2 Stunden gültig. Danach muss das Zurücksetzen des Passwortes erneut beantragt werden.
2547
        Falls Sie Ihr Passwort nicht zurücksetzen möchten, ignorieren Sie diese E-Mail - es wird dann keine Änderung vorgenommen.
2548
    </p>
2549
</div>';
2550
    }
2551
2552
    private function getPasswordChangePlainTemplateDe(): string
2553
    {
2554
        return '
2555
        Hallo {{ customer.salutation.displayName }} {{ customer.lastName }},
2556
    
2557
        im Shop {{ salesChannel.name }} wurde eine Anfrage gestellt, um Ihr Passwort zurück zu setzen.
2558
        Bitte bestätigen Sie den unten stehenden Link, um ein neues Passwort zu definieren.
2559
2560
        Passwort zurücksetzen: {{ urlResetPassword }}
2561
2562
        Dieser Link ist nur für die nächsten 2 Stunden gültig. Danach muss das Zurücksetzen des Passwortes erneut beantragt werden.
2563
        Falls Sie Ihr Passwort nicht zurücksetzen möchten, ignorieren Sie diese E-Mail - es wird dann keine Änderung vorgenommen.
2564
';
2565
    }
2566
2567
    private function getCustomerGroupChangeAcceptedHtmlTemplateEn(): string
2568
    {
2569
        return '<div style="font-family:arial; font-size:12px;">
2570
    <p>
2571
        Hello,<br/>
2572
        <br/>
2573
        your merchant account at {{ salesChannel.name }} has been unlocked.<br/>
2574
        From now on, we will charge you the net purchase price.
2575
    </p>
2576
</div>';
2577
    }
2578
2579
    private function getCustomerGroupChangeAcceptedPlainTemplateEn(): string
2580
    {
2581
        return '
2582
        Hello,
2583
2584
        your merchant account at {{ salesChannel.name }} has been unlocked.
2585
        From now on, we will charge you the net purchase price.
2586
    ';
2587
    }
2588
2589
    private function getCustomerGroupChangeAcceptedHtmlTemplateDe(): string
2590
    {
2591
        return '<div style="font-family:arial; font-size:12px;">
2592
    <p>
2593
        Hallo,<br/>
2594
        <br/>
2595
        ihr Händlerkonto bei {{ salesChannel.name }} wurde freigeschaltet.<br/>
2596
        Von nun an werden wir Ihnen den Netto-Preis berechnen.
2597
    </p>
2598
</div>';
2599
    }
2600
2601
    private function getCustomerGroupChangeAcceptedPlainTemplateDe(): string
2602
    {
2603
        return '
2604
        Hallo,
2605
    
2606
        ihr Händlerkonto bei {{ salesChannel.name }} wurde freigeschaltet.
2607
        Von nun an werden wir Ihnen den Netto-Preis berechnen.
2608
    ';
2609
    }
2610
2611
    private function getCustomerGroupChangeRejectedHtmlTemplateEn(): string
2612
    {
2613
        return '<div style="font-family:arial; font-size:12px;">
2614
    <p>
2615
        Hello,<br/>
2616
		<br/>
2617
        thank you for your interest in our trade prices. 
2618
        Unfortunately, we do not have a trading license yet so that we cannot accept you as a merchant.<br/>
2619
        In case of further questions please do not hesitate to contact us via telephone, fax or email.
2620
    </p>
2621
</div>';
2622
    }
2623
2624
    private function getCustomerGroupChangeRejectedPlainTemplateEn(): string
2625
    {
2626
        return '
2627
        Hello,
2628
2629
        thank you for your interest in our trade prices. Unfortunately, 
2630
        we do not have a trading license yet so that we cannot accept you as a merchant.
2631
        In case of further questions please do not hesitate to contact us via telephone, fax or email.
2632
    ';
2633
    }
2634
2635
    private function getCustomerGroupChangeRejectedHtmlTemplateDe(): string
2636
    {
2637
        return '<div style="font-family:arial; font-size:12px;">
2638
    <p>
2639
        Hallo,<br/>
2640
        <br/>
2641
        elen Dank für ihr Interesse an unseren Großhandelspreisen. Leider liegt uns bisher keine <br/>
2642
        Händlerauthentifizierung vor, und daher können wir Ihre Anfrage nicht bestätigen. <br/>
2643
        Bei weiteren Fragen kontaktieren Sie uns gerne per Telefon, Fax oder E-Mail. <br/>
2644
    </p>
2645
</div>';
2646
    }
2647
2648
    private function getCustomerGroupChangeRejectedPlainTemplateDe(): string
2649
    {
2650
        return '
2651
        Hallo,
2652
2653
        vielen Dank für ihr Interesse an unseren Großhandelspreisen. Leider liegt uns bisher keine 
2654
        Händlerauthentifizierung vor, und daher können wir Ihre Anfrage nicht bestätigen.
2655
        Bei weiteren Fragen kontaktieren Sie uns gerne per Telefon, Fax oder E-Mail.
2656
    ';
2657
    }
2658
2659
    private function createNumberRanges(Connection $connection): void
2660
    {
2661
        $definitionNumberRangeTypes = [
2662
            'product' => [
2663
                'id' => Uuid::randomHex(),
2664
                'global' => 1,
2665
                'nameDe' => 'Produkt',
2666
            ],
2667
            'order' => [
2668
                'id' => Uuid::randomHex(),
2669
                'global' => 0,
2670
                'nameDe' => 'Bestellung',
2671
            ],
2672
            'customer' => [
2673
                'id' => Uuid::randomHex(),
2674
                'global' => 0,
2675
                'nameDe' => 'Kunde',
2676
            ],
2677
        ];
2678
2679
        $definitionNumberRanges = [
2680
            'product' => [
2681
                'id' => Uuid::randomHex(),
2682
                'name' => 'Products',
2683
                'nameDe' => 'Produkte',
2684
                'global' => 1,
2685
                'typeId' => $definitionNumberRangeTypes['product']['id'],
2686
                'pattern' => 'SW{n}',
2687
                'start' => 10000,
2688
            ],
2689
            'order' => [
2690
                'id' => Uuid::randomHex(),
2691
                'name' => 'Orders',
2692
                'nameDe' => 'Bestellungen',
2693
                'global' => 1,
2694
                'typeId' => $definitionNumberRangeTypes['order']['id'],
2695
                'pattern' => '{n}',
2696
                'start' => 10000,
2697
            ],
2698
            'customer' => [
2699
                'id' => Uuid::randomHex(),
2700
                'name' => 'Customers',
2701
                'nameDe' => 'Kunden',
2702
                'global' => 1,
2703
                'typeId' => $definitionNumberRangeTypes['customer']['id'],
2704
                'pattern' => '{n}',
2705
                'start' => 10000,
2706
            ],
2707
        ];
2708
2709
        $languageEn = Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM);
2710
        $languageDe = Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM_DE);
2711
2712
        foreach ($definitionNumberRangeTypes as $typeName => $numberRangeType) {
2713
            $connection->insert(
2714
                'number_range_type',
2715
                [
2716
                    'id' => Uuid::fromHexToBytes($numberRangeType['id']),
2717
                    'global' => $numberRangeType['global'],
2718
                    'technical_name' => $typeName,
2719
                    'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
2720
                ]
2721
            );
2722
            $connection->insert(
2723
                'number_range_type_translation',
2724
                [
2725
                    'number_range_type_id' => Uuid::fromHexToBytes($numberRangeType['id']),
2726
                    'type_name' => $typeName,
2727
                    'language_id' => $languageEn,
2728
                    'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
2729
                ]
2730
            );
2731
            $connection->insert(
2732
                'number_range_type_translation',
2733
                [
2734
                    'number_range_type_id' => Uuid::fromHexToBytes($numberRangeType['id']),
2735
                    'type_name' => $numberRangeType['nameDe'],
2736
                    'language_id' => $languageDe,
2737
                    'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
2738
                ]
2739
            );
2740
        }
2741
2742
        foreach ($definitionNumberRanges as $typeName => $numberRange) {
2743
            $connection->insert(
2744
                'number_range',
2745
                [
2746
                    'id' => Uuid::fromHexToBytes($numberRange['id']),
2747
                    'global' => $numberRange['global'],
2748
                    'type_id' => Uuid::fromHexToBytes($numberRange['typeId']),
2749
                    'pattern' => $numberRange['pattern'],
2750
                    'start' => $numberRange['start'],
2751
                    'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
2752
                ]
2753
            );
2754
            $connection->insert(
2755
                'number_range_translation',
2756
                [
2757
                    'number_range_id' => Uuid::fromHexToBytes($numberRange['id']),
2758
                    'name' => $numberRange['name'],
2759
                    'language_id' => $languageEn,
2760
                    'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
2761
                ]
2762
            );
2763
            $connection->insert(
2764
                'number_range_translation',
2765
                [
2766
                    'number_range_id' => Uuid::fromHexToBytes($numberRange['id']),
2767
                    'name' => $numberRange['nameDe'],
2768
                    'language_id' => $languageDe,
2769
                    'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
2770
                ]
2771
            );
2772
        }
2773
    }
2774
2775
    private function createCmsPages(Connection $connection): void
2776
    {
2777
        $languageEn = Uuid::fromHexToBytes(Defaults::LANGUAGE_SYSTEM);
2778
        $versionId = Uuid::fromHexToBytes(Defaults::LIVE_VERSION);
2779
2780
        // cms page
2781
        $page = ['id' => Uuid::randomBytes(), 'type' => 'product_list', 'locked' => 1, 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)];
2782
        $pageEng = ['cms_page_id' => $page['id'], 'language_id' => $languageEn, 'name' => 'Default category layout', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT)];
2783
2784
        $connection->insert('cms_page', $page);
2785
        $connection->insert('cms_page_translation', $pageEng);
2786
2787
        // cms blocks
2788
        $blocks = [
2789
            [
2790
                'id' => Uuid::randomBytes(),
2791
                'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
2792
                'cms_page_id' => $page['id'],
2793
                'locked' => 1,
2794
                'position' => 1,
2795
                'type' => 'product-listing',
2796
                'name' => 'Category listing',
2797
                'sizing_mode' => 'boxed',
2798
                'margin_top' => '20px',
2799
                'margin_bottom' => '20px',
2800
                'margin_left' => '20px',
2801
                'margin_right' => '20px',
2802
                'background_media_mode' => 'cover',
2803
            ],
2804
            [
2805
                'id' => Uuid::randomBytes(),
2806
                'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
2807
                'cms_page_id' => $page['id'],
2808
                'locked' => 1,
2809
                'position' => 0,
2810
                'type' => 'image-text',
2811
                'name' => 'Category info',
2812
                'sizing_mode' => 'boxed',
2813
                'margin_top' => '20px',
2814
                'margin_bottom' => '20px',
2815
                'margin_left' => '20px',
2816
                'margin_right' => '20px',
2817
                'background_media_mode' => 'cover',
2818
            ],
2819
        ];
2820
2821
        foreach ($blocks as $block) {
2822
            $connection->insert('cms_block', $block);
2823
        }
2824
2825
        // cms slots
2826
        $slots = [
2827
            ['id' => Uuid::randomBytes(), 'locked' => 1, 'cms_block_id' => $blocks[0]['id'], 'type' => 'product-listing', 'slot' => 'content', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT), 'version_id' => $versionId],
2828
            ['id' => Uuid::randomBytes(), 'locked' => 1, 'cms_block_id' => $blocks[1]['id'], 'type' => 'image', 'slot' => 'left', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT), 'version_id' => $versionId],
2829
            ['id' => Uuid::randomBytes(), 'locked' => 1, 'cms_block_id' => $blocks[1]['id'], 'type' => 'text', 'slot' => 'right', 'created_at' => date(Defaults::STORAGE_DATE_FORMAT), 'version_id' => $versionId],
2830
        ];
2831
2832
        $slotTranslations = [
2833
            [
2834
                'cms_slot_id' => $slots[0]['id'],
2835
                'cms_slot_version_id' => $versionId,
2836
                'language_id' => $languageEn,
2837
                'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
2838
                'config' => json_encode([
2839
                    'boxLayout' => ['source' => 'static', 'value' => 'standard'],
2840
                ]),
2841
            ],
2842
            [
2843
                'cms_slot_id' => $slots[1]['id'],
2844
                'cms_slot_version_id' => $versionId,
2845
                'language_id' => $languageEn,
2846
                'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
2847
                'config' => json_encode([
2848
                    'media' => ['source' => 'mapped', 'value' => 'category.media'],
2849
                    'displayMode' => ['source' => 'static', 'value' => 'cover'],
2850
                    'url' => ['source' => 'static', 'value' => null],
2851
                    'newTab' => ['source' => 'static', 'value' => false],
2852
                    'minHeight' => ['source' => 'static', 'value' => '320px'],
2853
                ]),
2854
            ],
2855
            [
2856
                'cms_slot_id' => $slots[2]['id'],
2857
                'cms_slot_version_id' => $versionId,
2858
                'language_id' => $languageEn,
2859
                'created_at' => date(Defaults::STORAGE_DATE_FORMAT),
2860
                'config' => json_encode([
2861
                    'content' => ['source' => 'mapped', 'value' => 'category.description'],
2862
                ]),
2863
            ],
2864
        ];
2865
2866
        foreach ($slots as $slot) {
2867
            $connection->insert('cms_slot', $slot);
2868
        }
2869
2870
        foreach ($slotTranslations as $translation) {
2871
            $connection->insert('cms_slot_translation', $translation);
2872
        }
2873
2874
        $connection->executeUpdate('UPDATE `category` SET `cms_page_id` = :pageId', ['pageId' => $page['id']]);
2875
    }
2876
}
2877