Issues (2407)

application/controller/checkout/confirm.php (5 issues)

1
<?php
2
3
/* 	Divine CMS - Open source CMS for widespread use.
4
    Copyright (c) 2019 Mykola Burakov ([email protected])
5
6
    See SOURCE.txt for other and additional information.
7
8
    This file is part of Divine CMS.
9
10
    This program is free software: you can redistribute it and/or modify
11
    it under the terms of the GNU General Public License as published by
12
    the Free Software Foundation, either version 3 of the License, or
13
    (at your option) any later version.
14
15
    This program is distributed in the hope that it will be useful,
16
    but WITHOUT ANY WARRANTY; without even the implied warranty of
17
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
    GNU General Public License for more details.
19
20
    You should have received a copy of the GNU General Public License
21
    along with this program. If not, see <http://www.gnu.org/licenses/>. */
22
23
class ControllerCheckoutConfirm extends \Divine\Engine\Core\Controller
0 ignored issues
show
Coding Style Compatibility introduced by
PSR1 recommends that each class must be in a namespace of at least one level to avoid collisions.

You can fix this by adding a namespace to your class:

namespace YourVendor;

class YourClass { }

When choosing a vendor namespace, try to pick something that is not too generic to avoid conflicts with other libraries.

Loading history...
24
{
25
    public function index()
0 ignored issues
show
Expected 2 blank lines before function; 0 found
Loading history...
26
    {
27
        $redirect = '';
28
29
        if ($this->cart->hasShipping()) {
30
            // Validate if shipping address has been set.
31
            if (!isset($this->session->data['shipping_address'])) {
32
                $redirect = $this->url->link('checkout/checkout', '', true);
33
            }
34
35
            // Validate if shipping method has been set.
36
            if (!isset($this->session->data['shipping_method'])) {
37
                $redirect = $this->url->link('checkout/checkout', '', true);
38
            }
39
        } else {
40
            unset($this->session->data['shipping_address']);
41
            unset($this->session->data['shipping_method']);
42
            unset($this->session->data['shipping_methods']);
43
        }
44
45
        // Validate if payment address has been set.
46
        if (!isset($this->session->data['payment_address'])) {
47
            $redirect = $this->url->link('checkout/checkout', '', true);
48
        }
49
50
        // Validate if payment method has been set.
51
        if (!isset($this->session->data['payment_method'])) {
52
            $redirect = $this->url->link('checkout/checkout', '', true);
53
        }
54
55
        // Validate cart has products and has stock.
56
        if ((!$this->cart->hasProducts()) || (!$this->cart->hasStock() && !$this->config->get('config_stock_checkout'))) {
57
            $redirect = $this->url->link('checkout/cart');
58
        }
59
60
        // Validate minimum quantity requirements.
61
        $products = $this->cart->getProducts();
62
63
        foreach ($products as $product) {
64
            $product_total = 0;
65
66
            foreach ($products as $product_2) {
67
                if ($product_2['product_id'] == $product['product_id']) {
68
                    $product_total += $product_2['quantity'];
69
                }
70
            }
71
72
            if ($product['minimum'] > $product_total) {
73
                $redirect = $this->url->link('checkout/cart');
74
75
                break;
76
            }
77
        }
78
79
        if (!$redirect) {
80
            $order_data = array();
81
82
            $totals = array();
83
            $total = 0;
84
85
            // Because __call can not keep var references so we put them into an array.
86
            $total_data = array(
87
                'totals' => &$totals,
88
                'total'  => &$total
89
            );
90
91
            $this->load->model('extension/extension');
92
93
            $sort_order = array();
94
95
            $results = $this->model_extension_extension->getExtensions('total');
96
97
            foreach ($results as $key => $value) {
98
                $sort_order[$key] = $this->config->get($value['code'] . '_sort_order');
99
            }
100
101
            array_multisort($sort_order, SORT_ASC, $results);
102
103
            foreach ($results as $result) {
104
                if ($this->config->get($result['code'] . '_status')) {
105
                    $this->load->model('extension/total/' . $result['code']);
106
107
                    // We have to put the totals in an array so that they pass by reference.
108
                    $this->{'model_extension_total_' . $result['code']}->getTotal($total_data);
109
                }
110
            }
111
112
            $sort_order = array();
113
114
            foreach ($totals as $key => $value) {
115
                $sort_order[$key] = $value['sort_order'];
116
            }
117
118
            array_multisort($sort_order, SORT_ASC, $totals);
119
120
            $order_data['totals'] = $totals;
121
122
            $this->load->language('checkout/checkout');
123
124
            $order_data['invoice_prefix'] = $this->config->get('config_invoice_prefix');
125
            $order_data['store_name'] = $this->config->get('config_name');
126
127
            $order_data['store_url'] = '/';
128
129
            if ($this->customer->isLogged()) {
130
                $this->load->model('account/customer');
131
132
                $customer_info = $this->model_account_customer->getCustomer($this->customer->getId());
133
134
                $order_data['customer_id'] = $this->customer->getId();
135
                $order_data['customer_group_id'] = $customer_info['customer_group_id'];
136
                $order_data['firstname'] = $customer_info['firstname'];
137
                $order_data['lastname'] = $customer_info['lastname'];
138
                $order_data['email'] = $customer_info['email'];
139
                $order_data['telephone'] = $customer_info['telephone'];
140
                $order_data['fax'] = $customer_info['fax'];
141
                $order_data['custom_field'] = json_decode($customer_info['custom_field'], true);
142
            } elseif (isset($this->session->data['guest'])) {
143
                $order_data['customer_id'] = 0;
144
                $order_data['customer_group_id'] = $this->session->data['guest']['customer_group_id'];
145
                $order_data['firstname'] = $this->session->data['guest']['firstname'];
146
                $order_data['lastname'] = $this->session->data['guest']['lastname'];
147
                $order_data['email'] = $this->session->data['guest']['email'];
148
                $order_data['telephone'] = $this->session->data['guest']['telephone'];
149
                $order_data['fax'] = $this->session->data['guest']['fax'];
150
                $order_data['custom_field'] = $this->session->data['guest']['custom_field'];
151
            }
152
153
            $order_data['payment_firstname'] = $this->session->data['payment_address']['firstname'];
154
            $order_data['payment_lastname'] = $this->session->data['payment_address']['lastname'];
155
            $order_data['payment_company'] = $this->session->data['payment_address']['company'];
156
            $order_data['payment_address_1'] = $this->session->data['payment_address']['address_1'];
157
            $order_data['payment_address_2'] = $this->session->data['payment_address']['address_2'];
158
            $order_data['payment_city'] = $this->session->data['payment_address']['city'];
159
            $order_data['payment_postcode'] = $this->session->data['payment_address']['postcode'];
160
            $order_data['payment_zone'] = $this->session->data['payment_address']['zone'];
161
            $order_data['payment_zone_id'] = $this->session->data['payment_address']['zone_id'];
162
            $order_data['payment_country'] = $this->session->data['payment_address']['country'];
163
            $order_data['payment_country_id'] = $this->session->data['payment_address']['country_id'];
164
            $order_data['payment_address_format'] = $this->session->data['payment_address']['address_format'];
165
            $order_data['payment_custom_field'] = (isset($this->session->data['payment_address']['custom_field']) ? $this->session->data['payment_address']['custom_field'] : array());
166
167
            if (isset($this->session->data['payment_method']['title'])) {
168
                $order_data['payment_method'] = $this->session->data['payment_method']['title'];
169
            } else {
170
                $order_data['payment_method'] = '';
171
            }
172
173
            if (isset($this->session->data['payment_method']['code'])) {
174
                $order_data['payment_code'] = $this->session->data['payment_method']['code'];
175
            } else {
176
                $order_data['payment_code'] = '';
177
            }
178
179
            if ($this->cart->hasShipping()) {
180
                $order_data['shipping_firstname'] = $this->session->data['shipping_address']['firstname'];
181
                $order_data['shipping_lastname'] = $this->session->data['shipping_address']['lastname'];
182
                $order_data['shipping_company'] = $this->session->data['shipping_address']['company'];
183
                $order_data['shipping_address_1'] = $this->session->data['shipping_address']['address_1'];
184
                $order_data['shipping_address_2'] = $this->session->data['shipping_address']['address_2'];
185
                $order_data['shipping_city'] = $this->session->data['shipping_address']['city'];
186
                $order_data['shipping_postcode'] = $this->session->data['shipping_address']['postcode'];
187
                $order_data['shipping_zone'] = $this->session->data['shipping_address']['zone'];
188
                $order_data['shipping_zone_id'] = $this->session->data['shipping_address']['zone_id'];
189
                $order_data['shipping_country'] = $this->session->data['shipping_address']['country'];
190
                $order_data['shipping_country_id'] = $this->session->data['shipping_address']['country_id'];
191
                $order_data['shipping_address_format'] = $this->session->data['shipping_address']['address_format'];
192
                $order_data['shipping_custom_field'] = (isset($this->session->data['shipping_address']['custom_field']) ? $this->session->data['shipping_address']['custom_field'] : array());
193
194
                if (isset($this->session->data['shipping_method']['title'])) {
195
                    $order_data['shipping_method'] = $this->session->data['shipping_method']['title'];
196
                } else {
197
                    $order_data['shipping_method'] = '';
198
                }
199
200
                if (isset($this->session->data['shipping_method']['code'])) {
201
                    $order_data['shipping_code'] = $this->session->data['shipping_method']['code'];
202
                } else {
203
                    $order_data['shipping_code'] = '';
204
                }
205
            } else {
206
                $order_data['shipping_firstname'] = '';
207
                $order_data['shipping_lastname'] = '';
208
                $order_data['shipping_company'] = '';
209
                $order_data['shipping_address_1'] = '';
210
                $order_data['shipping_address_2'] = '';
211
                $order_data['shipping_city'] = '';
212
                $order_data['shipping_postcode'] = '';
213
                $order_data['shipping_zone'] = '';
214
                $order_data['shipping_zone_id'] = '';
215
                $order_data['shipping_country'] = '';
216
                $order_data['shipping_country_id'] = '';
217
                $order_data['shipping_address_format'] = '';
218
                $order_data['shipping_custom_field'] = array();
219
                $order_data['shipping_method'] = '';
220
                $order_data['shipping_code'] = '';
221
            }
222
223
            $order_data['products'] = array();
224
225
            foreach ($this->cart->getProducts() as $product) {
226
                $option_data = array();
227
228
                foreach ($product['option'] as $option) {
229
                    $option_data[] = array(
230
                        'product_option_id'       => $option['product_option_id'],
231
                        'product_option_value_id' => $option['product_option_value_id'],
232
                        'option_id'               => $option['option_id'],
233
                        'option_value_id'         => $option['option_value_id'],
234
                        'name'                    => $option['name'],
235
                        'value'                   => $option['value'],
236
                        'type'                    => $option['type']
237
                    );
238
                }
239
240
                $order_data['products'][] = array(
241
                    'product_id' => $product['product_id'],
242
                    'name'       => $product['name'],
243
                    'model'      => $product['model'],
244
                    'option'     => $option_data,
245
                    'download'   => $product['download'],
246
                    'quantity'   => $product['quantity'],
247
                    'subtract'   => $product['subtract'],
248
                    'price'      => $product['price'],
249
                    'total'      => $product['total'],
250
                    'reward'     => $product['reward']
251
                );
252
            }
253
254
            $order_data['comment'] = $this->session->data['comment'];
255
            $order_data['total'] = $total_data['total'];
256
257
            if (isset($this->request->cookie['tracking'])) {
258
                $order_data['tracking'] = $this->request->cookie['tracking'];
259
260
                $subtotal = $this->cart->getSubTotal();
0 ignored issues
show
The assignment to $subtotal is dead and can be removed.
Loading history...
261
262
                $order_data['commission'] = 0;
263
264
                // Marketing
265
                $this->load->model('checkout/marketing');
266
267
                $marketing_info = $this->model_checkout_marketing->getMarketingByCode($this->request->cookie['tracking']);
268
269
                if ($marketing_info) {
270
                    $order_data['marketing_id'] = $marketing_info['marketing_id'];
271
                } else {
272
                    $order_data['marketing_id'] = 0;
273
                }
274
            } else {
275
                $order_data['commission'] = 0;
276
                $order_data['marketing_id'] = 0;
277
                $order_data['tracking'] = '';
278
            }
279
280
            $order_data['language_id'] = $this->config->get('config_language_id');
281
            $order_data['currency_id'] = $this->currency->getId($this->session->data['currency']);
282
            $order_data['currency_code'] = $this->session->data['currency'];
283
            $order_data['currency_value'] = $this->currency->getValue($this->session->data['currency']);
284
            $order_data['ip'] = $this->request->server['REMOTE_ADDR'];
285
286
            if (!empty($this->request->server['HTTP_X_FORWARDED_FOR'])) {
287
                $order_data['forwarded_ip'] = $this->request->server['HTTP_X_FORWARDED_FOR'];
288
            } elseif (!empty($this->request->server['HTTP_CLIENT_IP'])) {
289
                $order_data['forwarded_ip'] = $this->request->server['HTTP_CLIENT_IP'];
290
            } else {
291
                $order_data['forwarded_ip'] = '';
292
            }
293
294
            if (isset($this->request->server['HTTP_USER_AGENT'])) {
295
                $order_data['user_agent'] = $this->request->server['HTTP_USER_AGENT'];
296
            } else {
297
                $order_data['user_agent'] = '';
298
            }
299
300
            if (isset($this->request->server['HTTP_ACCEPT_LANGUAGE'])) {
301
                $order_data['accept_language'] = $this->request->server['HTTP_ACCEPT_LANGUAGE'];
302
            } else {
303
                $order_data['accept_language'] = '';
304
            }
305
306
            $this->load->model('checkout/order');
307
308
            $this->session->data['order_id'] = $this->model_checkout_order->addOrder($order_data);
309
310
            $data['column_name'] = $this->language->get('column_name');
0 ignored issues
show
Comprehensibility Best Practice introduced by
$data was never initialized. Although not strictly required by PHP, it is generally a good practice to add $data = array(); before regardless.
Loading history...
311
            $data['column_model'] = $this->language->get('column_model');
312
            $data['column_quantity'] = $this->language->get('column_quantity');
313
            $data['column_price'] = $this->language->get('column_price');
314
            $data['column_total'] = $this->language->get('column_total');
315
316
            $this->load->model('tool/upload');
317
318
            $data['products'] = array();
319
320
            foreach ($this->cart->getProducts() as $product) {
321
                $option_data = array();
322
323
                foreach ($product['option'] as $option) {
324
                    if ($option['type'] != 'file') {
325
                        $value = $option['value'];
326
                    } else {
327
                        $upload_info = $this->model_tool_upload->getUploadByCode($option['value']);
328
329
                        if ($upload_info) {
330
                            $value = $upload_info['name'];
331
                        } else {
332
                            $value = '';
333
                        }
334
                    }
335
336
                    $option_data[] = array(
337
                        'name'  => $option['name'],
338
                        'value' => (\voku\helper\UTF8::strlen($value) > 20 ? \voku\helper\UTF8::substr($value, 0, 20) . '..' : $value)
0 ignored issues
show
Are you sure voku\helper\UTF8::substr($value, 0, 20) of type false|string can be used in concatenation? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

338
                        'value' => (\voku\helper\UTF8::strlen($value) > 20 ? /** @scrutinizer ignore-type */ \voku\helper\UTF8::substr($value, 0, 20) . '..' : $value)
Loading history...
339
                    );
340
                }
341
342
                $data['products'][] = array(
343
                    'cart_id'    => $product['cart_id'],
344
                    'product_id' => $product['product_id'],
345
                    'name'       => $product['name'],
346
                    'model'      => $product['model'],
347
                    'option'     => $option_data,
348
                    'quantity'   => $product['quantity'],
349
                    'subtract'   => $product['subtract'],
350
                    'price'      => $this->currency->format($product['price'], $this->session->data['currency']),
351
                    'total'      => $this->currency->format($product['price'] * $product['quantity'], $this->session->data['currency']),
352
                    'href'       => $this->url->link('product/product', 'product_id=' . $product['product_id'])
353
                );
354
            }
355
356
            $data['totals'] = array();
357
358
            foreach ($order_data['totals'] as $total) {
359
                $data['totals'][] = array(
360
                    'title' => $total['title'],
361
                    'text'  => $this->currency->format($total['value'], $this->session->data['currency'])
362
                );
363
            }
364
365
            $data['payment'] = $this->load->controller('extension/payment/' . $this->session->data['payment_method']['code']);
366
        } else {
367
            $data['redirect'] = $redirect;
368
        }
369
370
        $this->response->setOutput($this->load->view('checkout/confirm', $data));
371
    }
372
}
373