Test Failed
Push — master ( 23cc6e...476483 )
by Alexey
05:28
created

Ecommerce::cartPayRecive()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 14
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 20

Importance

Changes 0
Metric Value
cc 4
eloc 10
nc 4
nop 1
dl 0
loc 14
ccs 0
cts 12
cp 0
crap 20
rs 9.2
c 0
b 0
f 0
1
<?php
2
3
/**
4
 * Ecommerce module
5
 *
6
 * @author Alexey Krupskiy <[email protected]>
7
 * @link http://inji.ru/
8
 * @copyright 2015 Alexey Krupskiy
9
 * @license https://github.com/injitools/cms-Inji/blob/master/LICENSE
10
 */
11
12
class Ecommerce extends Module {
13
14
    public function init() {
15
        App::$primary->view->customAsset('js', '/moduleAsset/Ecommerce/js/cart.js');
16
        if (class_exists('Users\User') && Users\User::$cur->id) {
17
            $favs = !empty($_COOKIE['ecommerce_favitems']) ? json_decode($_COOKIE['ecommerce_favitems'], true) : [];
18
            if ($favs) {
19
                foreach ($favs as $itemId) {
20
                    $fav = \Ecommerce\Favorite::get([['user_id', Users\User::$cur->id], ['item_id', (int) $itemId]]);
21
                    if (!$fav) {
22
                        $item = \Ecommerce\Item::get((int) $itemId);
23
                        if ($item) {
24
                            $fav = new \Ecommerce\Favorite([
25
                                'user_id' => Users\User::$cur->id,
26
                                'item_id' => $itemId
27
                            ]);
28
                            $fav->save();
29
                        }
30
                    }
31
                }
32
                if (!headers_sent()) {
33
                    setcookie("ecommerce_favitems", json_encode([]), time() + 360000, "/");
34
                }
35
            }
36
        }
37
    }
38
39
    public function getPayTypeHandlers($forSelect = false) {
40
        if (!$forSelect) {
41
            return $this->getSnippets('payTypeHandler');
42
        }
43
        $handlers = ['' => 'Не выбрано'];
44
        foreach ($this->getSnippets('payTypeHandler') as $key => $handler) {
45
            if (empty($handler)) {
46
                continue;
47
            }
48
            $handlers[$key] = $handler['name'];
49
        }
50
        return $handlers;
51
    }
52
53
    public function cartPayRecive($data) {
54
        $cart = Ecommerce\Cart::get($data['pay']->data);
55
        if ($cart) {
56
            $payed = true;
57
            foreach ($cart->pays as $pay) {
58
                if ($pay->pay_status_id != 2) {
59
                    $payed = false;
60
                    break;
61
                }
62
            }
63
            $cart->payed = $payed;
64
            $cart->save();
65
        }
66
    }
67
68
    /**
69
     * @param array $data
70
     * @param \Ecommerce\Cart $cart
71
     * @return bool|\Ecommerce\UserAdds
72
     */
73 View Code Duplication
    public function parseFields($data, $cart) {
74
        $user = \Users\User::get($cart->user_id);
75
        $fields = \Ecommerce\UserAdds\Field::getList();
76
        if ($user) {
77
            $name = '';
78
            foreach ($fields as $field) {
79
                if ($field->save && !empty($data[$field->id])) {
80
                    $name .= htmlspecialchars($data[$field->id]) . ' ';
81
                }
82
            }
83
            $name = trim($name);
84
85
            $userAdds = Ecommerce\UserAdds::get([['user_id', $cart->user->id], ['name', $name]]);
86
            if (!$userAdds) {
87
                $userAdds = new Ecommerce\UserAdds();
88
                $userAdds->user_id = $cart->user->id;
89
                $userAdds->name = $name;
90
                $userAdds->save();
91
            }
92
            foreach ($fields as $field) {
93
                if (!$field->save) {
94
                    continue;
95
                }
96
                if (!isset($userAdds->values[$field->id]) && !empty($data[$field->id])) {
97
                    $userAddsValue = new Ecommerce\UserAdds\Value();
98
                    $userAddsValue->value = htmlspecialchars($data[$field->id]);
99
                    $userAddsValue->useradds_field_id = $field->id;
100
                    $userAddsValue->useradds_id = $userAdds->id;
101
                    $userAddsValue->save();
102
                } elseif (!empty($data[$field->id])) {
103
                    $userAddsValue = $userAdds->values[$field->id];
104
                    $userAddsValue->value = htmlspecialchars($data[$field->id]);
105
                    $userAddsValue->save();
106
                }
107
            }
108
        }
109
110
        foreach ($fields as $field) {
111
            if (!isset($cart->infos[$field->id]) && !empty($data[$field->id])) {
112
                $info = new \Ecommerce\Cart\Info();
113
                $info->name = $field->name;
114
                $info->value = htmlspecialchars($data[$field->id]);
115
                $info->useradds_field_id = $field->id;
116
                $info->cart_id = $cart->id;
117
                $info->save();
118
            } elseif (!empty($data[$field->id])) {
119
                $info = $cart->infos[$field->id];
120
                $info->value = htmlspecialchars($data[$field->id]);
121
                $info->save();
122
            }
123
            if (isset($info) && $user && $field->userfield) {
124
                $relations = [];
125
                if (strpos($field->userfield, ':')) {
126
                    $path = explode(':', $field->userfield);
127
                    if (!$user->{$path[0]}->{$path[1]}) {
128
                        $user->{$path[0]}->{$path[1]} = $info->value;
129
                        $relations[$path[0]] = $path[0];
130
                    }
131
                } else {
132
                    if (!$user->{$field->userfield}) {
133
                        $user->{$field->userfield} = $info->value;
134
                    }
135
                }
136
137
                foreach ($relations as $rel) {
138
                    $user->$rel->save();
139
                }
140
                $user->save();
141
            }
142
        }
143
        return isset($userAdds) ? $userAdds : false;
144
    }
145
146
    /**
147
     * @param array $data
148
     * @param \Ecommerce\Cart $cart
149
     * @param \Ecommerce\Delivery\Field[] $fields
150
     * @return bool|\Ecommerce\Delivery\Save
151
     */
152 View Code Duplication
    public function parseDeliveryFields($data, $cart, $fields) {
153
        $user = \Users\User::get($cart->user_id);
154
        if ($user) {
155
            $name = '';
156
            foreach ($fields as $field) {
157
                if ($field->save && !empty($data[$field->id])) {
158
                    $name .= htmlspecialchars($data[$field->id]) . ' ';
159
                }
160
            }
161
            $name = trim($name);
162
163
            $save = Ecommerce\Delivery\Save::get([['user_id', $cart->user->id], ['name', $name]]);
164
            if (!$save) {
165
                $save = new Ecommerce\Delivery\Save();
166
                $save->user_id = $cart->user->id;
167
                $save->name = $name;
168
                $save->save();
169
            }
170
            foreach ($fields as $field) {
171
                if (!$field->save) {
172
                    continue;
173
                }
174
                if (!isset($save->values[$field->id]) && !empty($data[$field->id])) {
175
                    $saveValue = new Ecommerce\Delivery\Value();
176
                    $saveValue->value = htmlspecialchars($data[$field->id]);
177
                    $saveValue->delivery_field_id = $field->id;
178
                    $saveValue->delivery_save_id = $save->id;
179
                    $saveValue->save();
180
                } elseif (!empty($data[$field->id])) {
181
                    $saveValue = $save->values[$field->id];
182
                    $saveValue->value = htmlspecialchars($data[$field->id]);
183
                    $saveValue->save();
184
                }
185
            }
186
        }
187
        foreach ($fields as $field) {
188
            if (!isset($cart->deliveryInfos[$field->id]) && !empty($data[$field->id])) {
189
                $info = new \Ecommerce\Cart\DeliveryInfo();
190
                $info->name = $field->name;
191
                $info->value = htmlspecialchars($data[$field->id]);
192
                $info->delivery_field_id = $field->id;
193
                $info->cart_id = $cart->id;
194
                $info->save();
195
            } elseif (!empty($data[$field->id])) {
196
                $info = $cart->deliveryInfos[$field->id];
197
                $info->value = htmlspecialchars($data[$field->id]);
198
                $info->save();
199
            }
200
201
            if (isset($info) && $user && $field->userfield) {
202
                $relations = [];
203
                if (strpos($field->userfield, ':')) {
204
                    $path = explode(':', $field->userfield);
205
                    if (!$user->{$path[0]}->{$path[1]}) {
206
                        $user->{$path[0]}->{$path[1]} = $info->value;
207
                        $relations[$path[0]] = $path[0];
208
                    }
209
                } else {
210
                    if (!$user->{$field->userfield}) {
211
                        $user->{$field->userfield} = $info->value;
212
                    }
213
                }
214
                foreach ($relations as $rel) {
215
                    $user->$rel->save();
216
                }
217
                $user->save();
218
            }
219
        }
220
        return isset($save) ? $save : false;
221
    }
222
223
    /**
224
     * @param bool $create
225
     * @return \Ecommerce\Cart
226
     */
227
    public function getCurCart($create = true) {
228
        $cart = false;
229
        if (!empty($_SESSION['cart']['cart_id'])) {
230
            $cart = Ecommerce\Cart::get((int) $_SESSION['cart']['cart_id']);
0 ignored issues
show
Bug Compatibility introduced by
The expression \Ecommerce\Cart::get((in...ON['cart']['cart_id']); of type boolean|Model adds the type boolean to the return on line 251 which is incompatible with the return type documented by Ecommerce::getCurCart of type Ecommerce\Cart.
Loading history...
231
            if ($cart->checkPrices()) {
232
                $cart->save();
233
            }
234
        }
235
        if (!$cart && $create) {
236
            $cart = new Ecommerce\Cart();
237
            $cart->cart_status_id = 1;
238
            $cart->user_id = Users\User::$cur->id;
239
            $userCard = \Ecommerce\Card\Item::get(\Users\User::$cur->id, 'user_id');
240
            if ($userCard) {
241
                $cart->card_item_id = $userCard->id;
242
            }
243
            $cart->save();
244
            $_SESSION['cart']['cart_id'] = $cart->id;
245
        }
246
        $defaultDelivery = \Ecommerce\Delivery::get(1, 'default');
247
        if ($defaultDelivery && !$cart->delivery_id) {
248
            $cart->delivery_id = $defaultDelivery->id;
249
            $cart->save();
250
        }
251
        return $cart;
252
    }
253
254
    /**
255
     * Getting items params with params
256
     *
257
     * @param array $params
258
     * @return array
259
     */
260
    public function getItemsParams($params = [], $saveFilterOptions = []) {
261
        $filtersOptions = !empty($params['filters']['options']) ? $params['filters']['options'] : [];
262
        $params['filters'] = [];
263
        foreach ($filtersOptions as $optionId => $filter) {
264
            if (in_array($optionId, $saveFilterOptions)) {
265
                $params['filters']['options'][$optionId] = $filter;
266
            }
267
        }
268
        $selectOptions = Ecommerce\OptionsParser::parse($params);
269
        $selectOptions['array'] = true;
270
        $items = Ecommerce\Item::getList($selectOptions);
271
        if (!$items) {
272
            return [];
273
        }
274
        $cols = array_keys(App::$cur->db->getTableCols(\Ecommerce\Item\Option::table()));
275
        $cols[] = \Ecommerce\Item\Param::colPrefix() . \Ecommerce\Item::index();
276
        $selectOptions = ['where' => ['view', 1],
277
            'join' => [
278
                [Ecommerce\Item\Param::table(), \Ecommerce\Item\Option::index() . ' = ' . Ecommerce\Item\Param::colPrefix() . \Ecommerce\Item\Option::index() . ' and ' . Ecommerce\Item\Param::colPrefix() . Ecommerce\Item::index() . ' IN (' . implode(',', array_keys($items)) . ')', 'inner'],
279
            ],
280
            'distinct' => true,
281
            'cols' => implode(',', $cols)
282
        ];
283
        $options = Ecommerce\Item\Option::getList($selectOptions);
284
        return $options;
285
    }
286
287
    /**
288
     * Getting items with params
289
     *
290
     * @param array $params
291
     * @return array
292
     */
293
    public function getItems($params = []) {
294
        $selectOptions = Ecommerce\OptionsParser::parse($params);
295
        $items = Ecommerce\Item::getList($selectOptions);
296
        return $items;
297
    }
298
299
    /**
300
     * Return count of items with params
301
     *
302
     * @param array $params
303
     * @return int
304
     */
305
    public function getItemsCount($params = []) {
306
        $selectOptions = Ecommerce\OptionsParser::parse($params);
307
        $selectOptions['distinct'] = \Ecommerce\Item::index();
308
        $counts = Ecommerce\Item::getCount($selectOptions);
309
        if (is_array($counts)) {
310
            $sum = 0;
311
            foreach ($counts as $count) {
312
                $sum += $count['count'];
313
            }
314
            return $sum;
315
        }
316
        return $counts;
317
    }
318
319 View Code Duplication
    public function viewsCategoryList($inherit = true) {
320
        $return = [];
321
        if ($inherit) {
322
            $return['inherit'] = 'Как у родителя';
323
        }
324
        $return['itemList'] = 'Список товаров';
325
        $conf = App::$primary->view->template->config;
326
        if (!empty($conf['files']['modules']['Ecommerce'])) {
327
            foreach ($conf['files']['modules']['Ecommerce'] as $file) {
328
                if ($file['type'] == 'Category') {
329
                    $return[$file['file']] = $file['name'];
330
                }
331
            }
332
        }
333
        return $return;
334
    }
335
336 View Code Duplication
    public function templatesCategoryList() {
337
        $return = [
338
            'inherit' => 'Как у родителя',
339
            'current' => 'Текущая тема'
340
        ];
341
342
        $conf = App::$primary->view->template->config;
343
344
        if (!empty($conf['files']['aditionTemplateFiels'])) {
345
            foreach ($conf['files']['aditionTemplateFiels'] as $file) {
346
                $return[$file['file']] = '- ' . $file['name'];
347
            }
348
        }
349
        return $return;
350
    }
351
352
    public function cartStatusDetector($event) {
353
        $cart = $event['eventObject'];
354
        if (!empty($cart->_changedParams['cart_cart_status_id'])) {
355
            $cart->date_status = date('Y-m-d H:i:s');
356
            $event = new Ecommerce\Cart\Event(['cart_id' => $cart->id, 'user_id' => \Users\User::$cur->id, 'cart_event_type_id' => 5, 'info' => $cart->cart_status_id]);
357
            $event->save();
358
359
            $prev_status_id = $cart->_changedParams['cart_cart_status_id'];
360
            $now_status_id = $cart->cart_status_id;
361
362
            $status = Ecommerce\Cart\Status::getList(['where' => ['id', implode(',', [$prev_status_id, $now_status_id]), 'IN']]);
363
364
            $prefix = isset(App::$cur->ecommerce->config['orderPrefix']) ? $config = App::$cur->ecommerce->config['orderPrefix'] : '';
365
            \App::$cur->users->AddUserActivity($cart->user_id, 3, "Статус вашего заказа номер {$prefix}{$cart->id} изменился с {$status[$prev_status_id]->name} на {$status[$now_status_id]->name}");
366
367
            if ($cart->cart_status_id == 5) {
368
                Inji::$inst->event('ecommerceCartClosed', $cart);
369
            }
370
        }
371
        return $cart;
372
    }
373
374
    public function cardTrigger($event) {
375
        $cart = $event['eventObject'];
376
        if ($cart->card) {
377
            $sum = 0;
378
            foreach ($cart->cartItems as $cartItem) {
379
                $sum += $cartItem->final_price * $cartItem->count;
380
            }
381
            $cardItemHistory = new Ecommerce\Card\Item\History();
382
            $cardItemHistory->amount = $sum;
383
            $cardItemHistory->card_item_id = $cart->card_item_id;
384
            $cardItemHistory->save();
385
            $cart->card->sum += $sum;
386
            $cart->card->save();
387
        }
388
        return $cart;
389
    }
390
391
    public function bonusTrigger($event) {
392
        $cart = $event['eventObject'];
393
        foreach ($cart->cartItems as $cartItem) {
394
            foreach ($cartItem->price->offer->bonuses as $bonus) {
395
                if ($bonus->limited && $bonus->left <= 0) {
396
                    continue;
397
                } elseif ($bonus->limited && $bonus->left > 0) {
398
                    $bonus->left -= 1;
399
                    $bonus->save();
400
                }
401
                switch ($bonus->type) {
402
                    case 'currency':
403
                        $currency = \Money\Currency::get($bonus->value);
404
                        $wallets = App::$cur->money->getUserWallets($cart->user->id);
405
                        $wallets[$currency->id]->diff($bonus->count, 'Бонус за покупку');
406
                        break;
407
                }
408
            }
409
        }
410
        return $cart;
411
    }
412
413
    public function sitemap() {
414
        $map = [];
415
        $zeroItems = \Ecommerce\Item::getList(['where' => ['category_id', 0], 'array' => true, 'cols' => ['item_id', 'item_name']]);
416
        foreach ($zeroItems as $item) {
417
            $map[] = [
418
                'name' => $item['item_name'],
419
                'url' => [
420
                    'loc' => (!empty($_SERVER['HTTPS']) ? 'https' : 'http') . '://' . INJI_DOMAIN_NAME . '/ecommerce/view/' . $item['item_id']
421
                ],
422
            ];
423
        }
424
425
        $categorys = \Ecommerce\Category::getList(['where' => ['parent_id', 0]]);
426
        $scan = function ($category, $scan) {
427
            $map = [];
428
429
            foreach ($category->items(['array' => true, 'cols' => ['item_id', 'item_name']]) as $item) {
430
                $map[] = [
431
                    'name' => $item['item_name'],
432
                    'url' => [
433
                        'loc' => (!empty($_SERVER['HTTPS']) ? 'https' : 'http') . '://' . INJI_DOMAIN_NAME . '/ecommerce/view/' . $item['item_id']
434
                    ],
435
                ];
436
            }
437
            foreach ($category->catalogs as $child) {
438
                $map = array_merge($map, $scan($child, $scan));
439
            }
440
            return $map;
441
        };
442
        foreach ($categorys as $category) {
443
            $map = array_merge($map, $scan($category, $scan));
444
        }
445
        return $map;
446
    }
447
448
    public function getFavoriteCount() {
449
        if (Users\User::$cur->id) {
450
            return \Ecommerce\Favorite::getCount(['user_id', Users\User::$cur->id]);
451 View Code Duplication
        } else {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
452
            $favs = !empty($_COOKIE['ecommerce_favitems']) ? json_decode($_COOKIE['ecommerce_favitems'], true) : [];
453
            return count($favs);
454
        }
455
    }
456
457
    public function siteSearch($search) {
458
        //items pages
459
        $count = $this->getItemsCount([
460
            'search' => trim($search),
461
        ]);
462
        //items
463
        $items = $this->getItems([
464
            'start' => 0,
465
            'count' => 10,
466
            'search' => trim($search),
467
        ]);
468
        $searchResult = [];
469
        foreach ($items as $item) {
470
            $details = '<div>';
471
            if ($item->image) {
472
                $details .= "<img style='margin-right:10px;margin-bottom:10px;' class='pull-left' src ='" . Statics::file($item->image->path, '70x70', 'q') . "' />";
473
            }
474
            $details .= '<b>' . $item->category->name . '</b><br />';
475
            $shortdes = mb_substr($item->description, 0, 200);
476
            $shortdes = mb_substr($shortdes, 0, mb_strrpos($shortdes, ' '));
477
            $details .= $shortdes;
478
            if (mb_strlen($item->description) > $shortdes) {
479
                $details .= '...';
480
            }
481
            $details .= '<div class="clearfix"></div> </div>';
482
            $searchResult[] = [
483
                'title' => $item->name(),
484
                'details' => $details,
485
                'href' => '/ecommerce/view/' . $item->id
486
            ];
487
        }
488
        return ['name' => 'Онлайн магазин', 'count' => $count, 'result' => $searchResult, 'detailSearch' => '/ecommerce/itemList?search=' . $search];
489
    }
490
491
    public function priceTypes() {
492
        $payTypes = ['custom' => 'Настраиваемая стоимость'];
493
        foreach ($this->getObjects('Ecommerce\\DeliveryHelper') as $className) {
494
            $payTypes[$className] = $className::$name;
495
        }
496
        return $payTypes;
497
    }
498
}