Test Failed
Push — master ( 84d0c3...657dff )
by Alexey
05:26
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
class Ecommerce extends Module {
12
13
    public function init() {
14
        App::$primary->view->customAsset('js', '/moduleAsset/Ecommerce/js/cart.js');
15
        if (Users\User::$cur->id) {
16
            $favs = !empty($_COOKIE['ecommerce_favitems']) ? json_decode($_COOKIE['ecommerce_favitems'], true) : [];
17
            if ($favs) {
18
                foreach ($favs as $itemId) {
19
                    $fav = \Ecommerce\Favorite::get([['user_id', Users\User::$cur->id], ['item_id', (int) $itemId]]);
20
                    if (!$fav) {
21
                        $item = \Ecommerce\Item::get((int) $itemId);
22
                        if ($item) {
23
                            $fav = new \Ecommerce\Favorite([
24
                                'user_id' => Users\User::$cur->id,
25
                                'item_id' => $itemId
26
                            ]);
27
                            $fav->save();
28
                        }
29
                    }
30
                }
31
                if(!headers_sent()){
32
                    setcookie("ecommerce_favitems", json_encode([]), time() + 360000, "/");
33
                }
34
            }
35
        }
36
    }
37
38
    public function getPayTypeHandlers($forSelect = false) {
39
        if (!$forSelect) {
40
            return $this->getSnippets('payTypeHandler');
41
        }
42
        $handlers = ['' => 'Не выбрано'];
43
        foreach ($this->getSnippets('payTypeHandler') as $key => $handler) {
44
            if (empty($handler)) {
45
                continue;
46
            }
47
            $handlers[$key] = $handler['name'];
48
        }
49
        return $handlers;
50
    }
51
52
    public function cartPayRecive($data) {
53
        $cart = Ecommerce\Cart::get($data['pay']->data);
54
        if ($cart) {
55
            $payed = true;
56
            foreach ($cart->pays as $pay) {
57
                if ($pay->pay_status_id != 2) {
58
                    $payed = false;
59
                    break;
60
                }
61
            }
62
            $cart->payed = $payed;
63
            $cart->save();
64
        }
65
    }
66
67 View Code Duplication
    public function parseFields($data, $cart) {
68
        $fields = \Ecommerce\UserAdds\Field::getList();
69
        $name = '';
70
        foreach ($fields as $field) {
71
            if ($field->save && !empty($data[$field->id])) {
72
                $name .= htmlspecialchars($data[$field->id]) . ' ';
73
            }
74
        }
75
        $name = trim($name);
76
77
        $userAdds = Ecommerce\UserAdds::get([['user_id', $cart->user->id], ['name', $name]]);
78
        if (!$userAdds) {
79
            $userAdds = new Ecommerce\UserAdds();
80
            $userAdds->user_id = $cart->user->id;
81
            $userAdds->name = $name;
82
            $userAdds->save();
83
            foreach ($fields as $field) {
84
                if (!$field->save) {
85
                    continue;
86
                }
87
                $userAddsValue = new Ecommerce\UserAdds\Value();
88
                $userAddsValue->value = htmlspecialchars($data[$field->id]);
89
                $userAddsValue->useradds_field_id = $field->id;
90
                $userAddsValue->useradds_id = $userAdds->id;
91
                $userAddsValue->save();
92
            }
93
        }
94
        $user = \Users\User::get($cart->user_id);
95
        foreach ($fields as $field) {
96
            $info = new \Ecommerce\Cart\Info();
97
            $info->name = $field->name;
98
            $info->value = htmlspecialchars($data[$field->id]);
99
            $info->useradds_field_id = $field->id;
100
            $info->cart_id = $cart->id;
101
            $info->save();
102
            $relations = [];
103
            if ($field->userfield) {
104
                if (strpos($field->userfield, ':')) {
105
                    $path = explode(':', $field->userfield);
106
                    if (!$user->{$path[0]}->{$path[1]}) {
107
                        $user->{$path[0]}->{$path[1]} = $info->value;
108
                        $relations[$path[0]] = $path[0];
109
                    }
110
                } else {
111
                    if (!$user->{$field->userfield}) {
112
                        $user->{$field->userfield} = $info->value;
113
                    }
114
                }
115
            }
116
            foreach ($relations as $rel) {
117
                $user->$rel->save();
118
            }
119
            $user->save();
120
        }
121
        return $userAdds;
122
    }
123
124 View Code Duplication
    public function parseDeliveryFields($data, $cart, $fields) {
125
        $name = '';
126
        foreach ($fields as $field) {
127
            if ($field->save && !empty($data[$field->id])) {
128
                $name .= htmlspecialchars($data[$field->id]) . ' ';
129
            }
130
        }
131
        $name = trim($name);
132
133
        $save = Ecommerce\Delivery\Save::get([['user_id', $cart->user->id], ['name', $name]]);
134
        if (!$save) {
135
            $save = new Ecommerce\Delivery\Save();
136
            $save->user_id = $cart->user->id;
137
            $save->name = $name;
138
            $save->save();
139
            foreach ($fields as $field) {
140
                if (!$field->save) {
141
                    continue;
142
                }
143
                $saveValue = new Ecommerce\Delivery\Value();
144
                $saveValue->value = htmlspecialchars($data[$field->id]);
145
                $saveValue->delivery_field_id = $field->id;
146
                $saveValue->delivery_save_id = $save->id;
147
                $saveValue->save();
148
            }
149
        }
150
        $user = \Users\User::get($cart->user_id);
151
        foreach ($fields as $field) {
152
            $info = new \Ecommerce\Cart\DeliveryInfo();
153
            $info->name = $field->name;
154
            $info->value = htmlspecialchars($data[$field->id]);
155
            $info->delivery_field_id = $field->id;
156
            $info->cart_id = $cart->id;
157
            $info->save();
158
            $relations = [];
159
            if ($field->userfield) {
160
                if (strpos($field->userfield, ':')) {
161
                    $path = explode(':', $field->userfield);
162
                    if (!$user->{$path[0]}->{$path[1]}) {
163
                        $user->{$path[0]}->{$path[1]} = $info->value;
164
                        $relations[$path[0]] = $path[0];
165
                    }
166
                } else {
167
                    if (!$user->{$field->userfield}) {
168
                        $user->{$field->userfield} = $info->value;
169
                    }
170
                }
171
            }
172
            foreach ($relations as $rel) {
173
                $user->$rel->save();
174
            }
175
            $user->save();
176
        }
177
        return $save;
178
    }
179
180
    public function getCurCart($create = true) {
181
        $cart = false;
182
        if (!empty($_SESSION['cart']['cart_id'])) {
183
            $cart = Ecommerce\Cart::get((int) $_SESSION['cart']['cart_id']);
184
        }
185
        if (!$cart && $create) {
186
            $cart = new Ecommerce\Cart();
187
            $cart->cart_status_id = 1;
188
            $cart->user_id = Users\User::$cur->id;
189
            $userCard = \Ecommerce\Card\Item::get(\Users\User::$cur->id, 'user_id');
190
            if ($userCard) {
191
                $cart->card_item_id = $userCard->id;
192
            }
193
            $cart->save();
194
            $_SESSION['cart']['cart_id'] = $cart->id;
195
        }
196
        return $cart;
197
    }
198
199
    /**
200
     * Getting items params with params
201
     * 
202
     * @param array $params
203
     * @return array
204
     */
205
    public function getItemsParams($params = []) {
206
        $params['filters'] = [];
207
        $selectOptions = Ecommerce\OptionsParser::parse($params);
208
        $items = Ecommerce\Item::getList($selectOptions);
209
        if (!$items) {
210
            return [];
211
        }
212
        $items = Ecommerce\Item\Param::getList([
213
                    'where' => ['item_id', array_keys($items), 'IN'],
214
                    'join' => [[Ecommerce\Item\Option::table(), Ecommerce\Item\Option::index() . ' = ' . \Ecommerce\Item\Param::colPrefix() . Ecommerce\Item\Option::index() . ' and ' . \Ecommerce\Item\Option::colPrefix() . 'searchable = 1', 'inner']],
215
                    'distinct' => \Ecommerce\Item\Option::index()
216
        ]);
217
        return $items;
218
    }
219
220
    /**
221
     * Getting items with params
222
     * 
223
     * @param array $params
224
     * @return array
225
     */
226
    public function getItems($params = []) {
227
        $selectOptions = Ecommerce\OptionsParser::parse($params);
228
        $items = Ecommerce\Item::getList($selectOptions);
229
        return $items;
230
    }
231
232
    /**
233
     * Return count of items with params
234
     * 
235
     * @param array $params
236
     * @return int
237
     */
238
    public function getItemsCount($params = []) {
239
        $selectOptions = Ecommerce\OptionsParser::parse($params);
240
        $selectOptions['distinct'] = \Ecommerce\Item::index();
241
        $counts = Ecommerce\Item::getCount($selectOptions);
242
        if (is_array($counts)) {
243
            $sum = 0;
244
            foreach ($counts as $count) {
245
                $sum += $count['count'];
246
            }
247
            return $sum;
248
        }
249
        return $counts;
250
    }
251
252 View Code Duplication
    public function viewsCategoryList($inherit = true) {
253
        $return = [];
254
        if ($inherit) {
255
            $return['inherit'] = 'Как у родителя';
256
        }
257
        $return['itemList'] = 'Список товаров';
258
        $conf = App::$primary->view->template->config;
259
        if (!empty($conf['files']['modules']['Ecommerce'])) {
260
            foreach ($conf['files']['modules']['Ecommerce'] as $file) {
261
                if ($file['type'] == 'Category') {
262
                    $return[$file['file']] = $file['name'];
263
                }
264
            }
265
        }
266
        return $return;
267
    }
268
269 View Code Duplication
    public function templatesCategoryList() {
270
        $return = [
271
            'inherit' => 'Как у родителя',
272
            'current' => 'Текущая тема'
273
        ];
274
275
        $conf = App::$primary->view->template->config;
276
277
        if (!empty($conf['files']['aditionTemplateFiels'])) {
278
            foreach ($conf['files']['aditionTemplateFiels'] as $file) {
279
                $return[$file['file']] = '- ' . $file['name'];
280
            }
281
        }
282
        return $return;
283
    }
284
285
    public function cartStatusDetector($event) {
286
        $cart = $event['eventObject'];
287
        if (!empty($cart->_changedParams['cart_cart_status_id'])) {
288
            $cart->date_status = date('Y-m-d H:i:s');
289
            $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]);
290
            $event->save();
291
292
            $prev_status_id = $cart->_changedParams['cart_cart_status_id'];
293
            $now_status_id = $cart->cart_status_id;
294
295
            $status = Ecommerce\Cart\Status::getList(['where' => ['id', implode(',', [$prev_status_id, $now_status_id]), 'IN']]);
296
297
            $prefix = isset(App::$cur->ecommerce->config['orderPrefix']) ? $config = App::$cur->ecommerce->config['orderPrefix'] : '';
298
            \App::$cur->users->AddUserActivity($cart->user_id, 3, "Статус вашего заказа номер {$prefix}{$cart->id} изменился с {$status[$prev_status_id]->name} на {$status[$now_status_id]->name}");
299
300
            if ($cart->cart_status_id == 5) {
301
                Inji::$inst->event('ecommerceCartClosed', $cart);
302
            }
303
        }
304
        return $cart;
305
    }
306
307
    public function cardTrigger($event) {
308
        $cart = $event['eventObject'];
309
        if ($cart->card) {
310
            $sum = 0;
311
            foreach ($cart->cartItems as $cartItem) {
312
                $sum += $cartItem->final_price * $cartItem->count;
313
            }
314
            $cardItemHistory = new Ecommerce\Card\Item\History();
315
            $cardItemHistory->amount = $sum;
316
            $cardItemHistory->card_item_id = $cart->card_item_id;
317
            $cardItemHistory->save();
318
            $cart->card->sum += $sum;
319
            $cart->card->save();
320
        }
321
        return $cart;
322
    }
323
324
    public function bonusTrigger($event) {
325
        $cart = $event['eventObject'];
326
        foreach ($cart->cartItems as $cartItem) {
327
            foreach ($cartItem->price->offer->bonuses as $bonus) {
328
                if ($bonus->limited && $bonus->left <= 0) {
329
                    continue;
330
                } elseif ($bonus->limited && $bonus->left > 0) {
331
                    $bonus->left -= 1;
332
                    $bonus->save();
333
                }
334
                switch ($bonus->type) {
335
                    case 'currency':
336
                        $currency = \Money\Currency::get($bonus->value);
337
                        $wallets = App::$cur->money->getUserWallets($cart->user->id);
338
                        $wallets[$currency->id]->diff($bonus->count, 'Бонус за покупку');
339
                        break;
340
                }
341
            }
342
        }
343
        return $cart;
344
    }
345
346 View Code Duplication
    public function sitemap() {
347
        $map = [];
348
        $zeroItems = \Ecommerce\Item::getList(['where' => ['category_id', 0]]);
349
        foreach ($zeroItems as $item) {
350
            $map[] = [
351
                'name' => $item->name,
352
                'url' => [
353
                    'loc' => (!empty($_SERVER['HTTPS']) ? 'https' : 'http') . '://' . INJI_DOMAIN_NAME . ($item->getHref())
354
                ],
355
            ];
356
        }
357
358
        $categorys = \Ecommerce\Category::getList(['where' => ['parent_id', 0]]);
359
        $scan = function($category, $scan) {
360
            $map = [];
361
362
            foreach ($category->items as $item) {
363
                $map[] = [
364
                    'name' => $item->name,
365
                    'url' => [
366
                        'loc' => (!empty($_SERVER['HTTPS']) ? 'https' : 'http') . '://' . INJI_DOMAIN_NAME . ($item->getHref())
367
                    ],
368
                ];
369
            }
370
            foreach ($category->catalogs as $child) {
371
                $map = array_merge($map, $scan($child, $scan));
372
            }
373
            return $map;
374
        };
375
        foreach ($categorys as $category) {
376
            $map = array_merge($map, $scan($category, $scan));
377
        }
378
        return $map;
379
    }
380
}