Issues (2366)

Branch: master

Security Analysis    not enabled

This project does not seem to handle request data directly as such no vulnerable execution paths were found.

  Cross-Site Scripting
Cross-Site Scripting enables an attacker to inject code into the response of a web-request that is viewed by other users. It can for example be used to bypass access controls, or even to take over other users' accounts.
  File Exposure
File Exposure allows an attacker to gain access to local files that he should not be able to access. These files can for example include database credentials, or other configuration files.
  File Manipulation
File Manipulation enables an attacker to write custom data to files. This potentially leads to injection of arbitrary code on the server.
  Object Injection
Object Injection enables an attacker to inject an object into PHP code, and can lead to arbitrary code execution, file exposure, or file manipulation attacks.
  Code Injection
Code Injection enables an attacker to execute arbitrary code on the server.
  Response Splitting
Response Splitting can be used to send arbitrary responses.
  File Inclusion
File Inclusion enables an attacker to inject custom files into PHP's file loading mechanism, either explicitly passed to include, or for example via PHP's auto-loading mechanism.
  Command Injection
Command Injection enables an attacker to inject a shell command that is execute with the privileges of the web-server. This can be used to expose sensitive data, or gain access of your server.
  SQL Injection
SQL Injection enables an attacker to execute arbitrary SQL code on your database server gaining access to user data, or manipulating user data.
  XPath Injection
XPath Injection enables an attacker to modify the parts of XML document that are read. If that XML document is for example used for authentication, this can lead to further vulnerabilities similar to SQL Injection.
  LDAP Injection
LDAP Injection enables an attacker to inject LDAP statements potentially granting permission to run unauthorized queries, or modify content inside the LDAP tree.
  Header Injection
  Other Vulnerability
This category comprises other attack vectors such as manipulating the PHP runtime, loading custom extensions, freezing the runtime, or similar.
  Regex Injection
Regex Injection enables an attacker to execute arbitrary code in your PHP process.
  XML Injection
XML Injection enables an attacker to read files on your local filesystem including configuration files, or can be abused to freeze your web-server process.
  Variable Injection
Variable Injection enables an attacker to overwrite program variables with custom data, and can lead to further vulnerabilities.
Unfortunately, the security analysis is currently not available for your project. If you are a non-commercial open-source project, please contact support to gain access.

Eccube/Controller/Admin/Order/EditController.php (2 issues)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
/*
3
 * This file is part of EC-CUBE
4
 *
5
 * Copyright(c) 2000-2015 LOCKON CO.,LTD. All Rights Reserved.
6
 *
7
 * http://www.lockon.co.jp/
8
 *
9
 * This program is free software; you can redistribute it and/or
10
 * modify it under the terms of the GNU General Public License
11
 * as published by the Free Software Foundation; either version 2
12
 * of the License, or (at your option) any later version.
13
 *
14
 * This program is distributed in the hope that it will be useful,
15
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
 * GNU General Public License for more details.
18
 *
19
 * You should have received a copy of the GNU General Public License
20
 * along with this program; if not, write to the Free Software
21
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22
 */
23
24
namespace Eccube\Controller\Admin\Order;
25
26
use Doctrine\Common\Collections\ArrayCollection;
27
use Eccube\Application;
28
use Eccube\Common\Constant;
29
use Eccube\Controller\AbstractController;
30
use Eccube\Entity\Master\DeviceType;
31
use Eccube\Entity\OrderDetail;
32
use Eccube\Entity\ShipmentItem;
33
use Eccube\Entity\Shipping;
34
use Eccube\Event\EccubeEvents;
35
use Eccube\Event\EventArgs;
36
use Symfony\Component\Form\FormError;
37 4
use Symfony\Component\HttpFoundation\Request;
38
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
39 4
40 4
class EditController extends AbstractController
41
{
42
    public function index(Application $app, Request $request, $id = null)
43
    {
44
        /* @var $softDeleteFilter \Eccube\Doctrine\Filter\SoftDeleteFilter */
45
        $softDeleteFilter = $app['orm.em']->getFilters()->getFilter('soft_delete');
46
        $softDeleteFilter->setExcludes(array(
47
            'Eccube\Entity\ProductClass',
48
            'Eccube\Entity\Product',
49
        ));
50 2
51
        $TargetOrder = null;
52
        $OriginOrder = null;
53 4
54
        if (is_null($id)) {
55
            // 空のエンティティを作成.
56 4
            $TargetOrder = $this->newOrder($app);
57
        } else {
58 2
            $TargetOrder = $app['eccube.repository.order']->find($id);
59
            if (is_null($TargetOrder)) {
60
                throw new NotFoundHttpException();
61
            }
62
        }
63
64
        // 編集前の受注情報を保持
65
        $OriginOrder = clone $TargetOrder;
66
        $OriginalOrderDetails = new ArrayCollection();
67
        // 編集前のお届け先情報を保持
68
        $OriginalShippings = new ArrayCollection();
69
        // 編集前のお届け先のアイテム情報を保持
70
        $OriginalShipmentItems = new ArrayCollection();
71
72 2
        // Save previous value before calculate
73 2
        $arrOldOrder = array();
74
75
        /** @var $OrderDetail OrderDetail*/
76
        foreach ($TargetOrder->getOrderDetails() as $OrderDetail) {
77
            $OriginalOrderDetails->add($OrderDetail);
78
            $arrOldOrder['OrderDetails'][$OrderDetail->getId()]['quantity'] = $OrderDetail->getQuantity();
79
        }
80
81
        // 編集前の情報を保持
82
        /** @var $tmpOriginalShippings Shipping*/
83
        foreach ($TargetOrder->getShippings() as $key => $tmpOriginalShippings) {
84
            $arrOldOrder['Shippings'][$key]['shipping_delivery_date'] = $tmpOriginalShippings->getShippingDeliveryDate();
85
            /** @var $tmpOriginalShipmentItem ShipmentItem*/
86
            foreach ($tmpOriginalShippings->getShipmentItems() as $tmpOriginalShipmentItem) {
87
                // アイテム情報
88
                $OriginalShipmentItems->add($tmpOriginalShipmentItem);
89
                $arrOldOrder['Shippings'][$key]['ShipmentItems'][$tmpOriginalShipmentItem->getId()]['quantity'] = $tmpOriginalShipmentItem->getQuantity();
90
            }
91
            // お届け先情報
92
            $OriginalShippings->add($tmpOriginalShippings);
93
        }
94
95
        $builder = $app['form.factory']
96
            ->createBuilder('order', $TargetOrder);
97
98
        $event = new EventArgs(
99
            array(
100
                'builder' => $builder,
101
                'OriginOrder' => $OriginOrder,
102
                'TargetOrder' => $TargetOrder,
103
                'OriginOrderDetails' => $OriginalOrderDetails,
104
            ),
105
            $request
106
        );
107
        $app['eccube.event.dispatcher']->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_INDEX_INITIALIZE, $event);
108
109
        $form = $builder->getForm();
110
111
        if ('POST' === $request->getMethod()) {
112
            $form->handleRequest($request);
113
114
            $event = new EventArgs(
115
                array(
116
                    'builder' => $builder,
117
                    'OriginOrder' => $OriginOrder,
118
                    'TargetOrder' => $TargetOrder,
119
                    'OriginOrderDetails' => $OriginalOrderDetails,
120
                ),
121
                $request
122
            );
123
            $app['eccube.event.dispatcher']->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_INDEX_PROGRESS, $event);
124
125
            // 入力情報にもとづいて再計算.
126
            $this->calculate($app, $TargetOrder);
127
128
            // 登録ボタン押下
129
            switch ($request->get('mode')) {
130
                case 'register':
131
132
                    log_info('受注登録開始', array($TargetOrder->getId()));
133
134
                    if ($TargetOrder->getTotal() > $app['config']['max_total_fee']) {
135
                        log_info('受注登録入力チェックエラー', array($TargetOrder->getId()));
136
                        $form['charge']->addError(new FormError('合計金額の上限を超えております。'));
137
                    } elseif ($form->isValid()) {
138
139
                        $BaseInfo = $app['eccube.repository.base_info']->get();
140
141
                        // お支払い方法の更新
142
                        $TargetOrder->setPaymentMethod($TargetOrder->getPayment()->getMethod());
143
144
                        // 配送業者・お届け時間の更新
145
                        $Shippings = $TargetOrder->getShippings();
146
                        foreach ($Shippings as $Shipping) {
147
                            $Shipping->setShippingDeliveryName($Shipping->getDelivery()->getName());
148
                            if (!is_null($Shipping->getDeliveryTime())) {
149
                                $Shipping->setShippingDeliveryTime($Shipping->getDeliveryTime()->getDeliveryTime());
150
                            } else {
151
                                $Shipping->setShippingDeliveryTime(null);
152
                            }
153
                        }
154
155
156
                        // 受注日/発送日/入金日の更新.
157
                        $this->updateDate($app, $TargetOrder, $OriginOrder);
158
159
                        // 受注明細で削除されているものをremove
160
                        foreach ($OriginalOrderDetails as $OrderDetail) {
161
                            if (false === $TargetOrder->getOrderDetails()->contains($OrderDetail)) {
162
                                $app['orm.em']->remove($OrderDetail);
163
                            }
164
                        }
165
166
167
                        if ($BaseInfo->getOptionMultipleShipping() == Constant::ENABLED) {
168
                            foreach ($TargetOrder->getOrderDetails() as $OrderDetail) {
169
                                /** @var $OrderDetail \Eccube\Entity\OrderDetail */
170
                                $OrderDetail->setOrder($TargetOrder);
171
                            }
172
173
                            /** @var \Eccube\Entity\Shipping $Shipping */
174
                            foreach ($Shippings as $Shipping) {
175
                                $shipmentItems = $Shipping->getShipmentItems();
176
                                /** @var \Eccube\Entity\ShipmentItem $ShipmentItem */
177
                                foreach ($shipmentItems as $ShipmentItem) {
178
                                    // 削除予定から商品アイテムを外す
179 2
                                    $OriginalShipmentItems->removeElement($ShipmentItem);
180
                                    $ShipmentItem->setOrder($TargetOrder);
181
                                    $ShipmentItem->setShipping($Shipping);
182
                                    $app['orm.em']->persist($ShipmentItem);
183
                                }
184
                                // 削除予定からお届け先情報を外す
185
                                $OriginalShippings->removeElement($Shipping);
186
                                $Shipping->setOrder($TargetOrder);
187
                                $app['orm.em']->persist($Shipping);
188
                            }
189
                            // 商品アイテムを削除する
190
                            foreach ($OriginalShipmentItems as $OriginalShipmentItem) {
191
                                $app['orm.em']->remove($OriginalShipmentItem);
192
                            }
193
                            // お届け先情報削除する
194
                            foreach ($OriginalShippings as $OriginalShipping) {
195
                                $app['orm.em']->remove($OriginalShipping);
196 2
                            }
197
                        } else {
198
199
                            $NewShipmentItems = new ArrayCollection();
200
201
                            foreach ($TargetOrder->getOrderDetails() as $OrderDetail) {
202
                                /** @var $OrderDetail \Eccube\Entity\OrderDetail */
203
                                $OrderDetail->setOrder($TargetOrder);
204
205
                                $NewShipmentItem = new ShipmentItem();
206
                                $NewShipmentItem
207
                                    ->setProduct($OrderDetail->getProduct())
208
                                    ->setProductClass($OrderDetail->getProductClass())
209
                                    ->setProductName($OrderDetail->getProduct()->getName())
210
                                    ->setProductCode($OrderDetail->getProductClass()->getCode())
211 4
                                    ->setClassCategoryName1($OrderDetail->getClassCategoryName1())
212
                                    ->setClassCategoryName2($OrderDetail->getClassCategoryName2())
213
                                    ->setClassName1($OrderDetail->getClassName1())
214
                                    ->setClassName2($OrderDetail->getClassName2())
215
                                    ->setPrice($OrderDetail->getPrice())
216
                                    ->setQuantity($OrderDetail->getQuantity())
217
                                    ->setOrder($TargetOrder);
218
                                $NewShipmentItems[] = $NewShipmentItem;
219
220 4
                            }
221 4
                            // 配送商品の更新. delete/insert.
222 4
                            $Shippings = $TargetOrder->getShippings();
223 4
                            foreach ($Shippings as $Shipping) {
224
                                $ShipmentItems = $Shipping->getShipmentItems();
225
                                foreach ($ShipmentItems as $ShipmentItem) {
226
                                    $app['orm.em']->remove($ShipmentItem);
227
                                }
228 4
                                $ShipmentItems->clear();
229
                                foreach ($NewShipmentItems as $NewShipmentItem) {
230
                                    $NewShipmentItem->setShipping($Shipping);
231
                                    $ShipmentItems->add($NewShipmentItem);
232
                                }
233
                            }
234
                        }
235
236
                        $Customer = $TargetOrder->getCustomer();
237
                        if ($Customer) {
238
                            // 受注情報の会員情報を更新
239
                            $TargetOrder->setSex($Customer->getSex());
240
                            $TargetOrder->setJob($Customer->getJob());
241
                            $TargetOrder->setBirth($Customer->getBirth());
242
                        }
243
244
                        $app['orm.em']->persist($TargetOrder);
245
                        $app['orm.em']->flush();
246
247
                        if ($Customer) {
248
                            // 会員の場合、購入回数、購入金額などを更新
249
                            $app['eccube.repository.customer']->updateBuyData($app, $Customer, $TargetOrder->getOrderStatus()->getId());
250
                        }
251
252
                        $event = new EventArgs(
253
                            array(
254
                                'form' => $form,
255
                                'OriginOrder' => $OriginOrder,
256
                                'TargetOrder' => $TargetOrder,
257
                                'OriginOrderDetails' => $OriginalOrderDetails,
258
                                'Customer' => $Customer,
259
                            ),
260
                            $request
261
                        );
262
                        $app['eccube.event.dispatcher']->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_INDEX_COMPLETE, $event);
263
264
                        $app->addSuccess('admin.order.save.complete', 'admin');
265
266
                        log_info('受注登録完了', array($TargetOrder->getId()));
267
268
                        return $app->redirect($app->url('admin_order_edit', array('id' => $TargetOrder->getId())));
269
                    }
270
271
                    break;
272
273
                case 'add_delivery':
274
                    // お届け先情報の新規追加
275
276
                    $form = $builder->getForm();
277
278
                    $Shipping = new \Eccube\Entity\Shipping();
279
                    $Shipping->setDelFlg(Constant::DISABLED);
280
281
                    $TargetOrder->addShipping($Shipping);
282
283
                    $Shipping->setOrder($TargetOrder);
284
285
                    $form->setData($TargetOrder);
286
287
                    break;
288
289
                default:
290
                    break;
291
            }
292
        }
293
294
        // 会員検索フォーム
295
        $builder = $app['form.factory']
296
            ->createBuilder('admin_search_customer');
297
298
        $event = new EventArgs(
299
            array(
300
                'builder' => $builder,
301
                'OriginOrder' => $OriginOrder,
302
                'TargetOrder' => $TargetOrder,
303
                'OriginOrderDetails' => $OriginalOrderDetails,
304
            ),
305
            $request
306
        );
307
        $app['eccube.event.dispatcher']->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_CUSTOMER_INITIALIZE, $event);
308
309
        $searchCustomerModalForm = $builder->getForm();
310
311
        // 商品検索フォーム
312
        $builder = $app['form.factory']
313
            ->createBuilder('admin_search_product');
314
315
        $event = new EventArgs(
316
            array(
317
                'builder' => $builder,
318
                'OriginOrder' => $OriginOrder,
319
                'TargetOrder' => $TargetOrder,
320
                'OriginOrderDetails' => $OriginalOrderDetails,
321
            ),
322
            $request
323
        );
324
        $app['eccube.event.dispatcher']->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_PRODUCT_INITIALIZE, $event);
325
326
        $searchProductModalForm = $builder->getForm();
327
328
        // 配送業者のお届け時間
329
        $times = array();
330
        $deliveries = $app['eccube.repository.delivery']->findAll();
331
        foreach ($deliveries as $Delivery) {
332
            $deliveryTiems = $Delivery->getDeliveryTimes();
333
            foreach ($deliveryTiems as $DeliveryTime) {
334
                $times[$Delivery->getId()][$DeliveryTime->getId()] = $DeliveryTime->getDeliveryTime();
335
            }
336
        }
337
338
        return $app->render('Order/edit.twig', array(
339
            'form' => $form->createView(),
340
            'searchCustomerModalForm' => $searchCustomerModalForm->createView(),
341
            'searchProductModalForm' => $searchProductModalForm->createView(),
342
            'Order' => $TargetOrder,
343
            'id' => $id,
344
            'shippingDeliveryTimes' => $app['serializer']->serialize($times, 'json'),
345
            'arrOldOrder' => $arrOldOrder,
346
        ));
347
    }
348
349
    /**
350
     * 顧客情報を検索する.
351
     *
352
     * @param Application $app
353
     * @param Request $request
354
     * @return \Symfony\Component\HttpFoundation\JsonResponse
355
     */
356
    public function searchCustomer(Application $app, Request $request)
357
    {
358
        if ($request->isXmlHttpRequest()) {
359
            $app['monolog']->addDebug('search customer start.');
360
361
            $searchData = array(
362 2
                'multi' => $request->get('search_word'),
363
            );
364
365
            $qb = $app['eccube.repository.customer']->getQueryBuilderBySearchData($searchData);
366
367
            $event = new EventArgs(
368
                array(
369
                    'qb' => $qb,
370
                    'data' => $searchData,
371
                ),
372
                $request
373
            );
374 2
            $app['eccube.event.dispatcher']->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_CUSTOMER_SEARCH, $event);
375
376
            $Customers = $qb->getQuery()->getResult();
377
378
379
            if (empty($Customers)) {
380
                $app['monolog']->addDebug('search customer not found.');
381
            }
382
383 2
            $data = array();
384
385 2
            $formatTel = '%s-%s-%s';
386 2
            $formatName = '%s%s(%s%s)';
387 View Code Duplication
            foreach ($Customers as $Customer) {
388
                $data[] = array(
389
                    'id' => $Customer->getId(),
390
                    'name' => sprintf($formatName, $Customer->getName01(), $Customer->getName02(), $Customer->getKana01(),
391
                        $Customer->getKana02()),
392
                    'tel' => sprintf($formatTel, $Customer->getTel01(), $Customer->getTel02(), $Customer->getTel03()),
393
                    'email' => $Customer->getEmail(),
394
                );
395
            }
396
397
            $event = new EventArgs(
398
                array(
399
                    'data' => $data,
400
                    'Customers' => $Customers,
401
                ),
402
                $request
403
            );
404
            $app['eccube.event.dispatcher']->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_CUSTOMER_COMPLETE, $event);
405
            $data = $event->getArgument('data');
406
407
            return $app->json($data);
408
        }
409
    }
410
411
    /**
412
     * 顧客情報を検索する.
413
     *
414
     * @param Application $app
415
     * @param Request $request
0 ignored issues
show
Expected 5 spaces after parameter type; 1 found
Loading history...
416
     * @param integer $page_no
0 ignored issues
show
Expected 5 spaces after parameter type; 1 found
Loading history...
417
     * @return \Symfony\Component\HttpFoundation\JsonResponse
418 1
     */
419
    public function searchCustomerHtml(Application $app, Request $request, $page_no = null)
420
    {
421
        if ($request->isXmlHttpRequest()) {
422 1
            $app['monolog']->addDebug('search customer start.');
423
            $page_count = $app['config']['default_page_count'];
424
            $session = $app['session'];
425
426
            if ('POST' === $request->getMethod()) {
427
428
                $page_no = 1;
429
430
                $searchData = array(
431
                    'multi' => $request->get('search_word'),
432
                );
433
434
                $session->set('eccube.admin.order.customer.search', $searchData);
435
                $session->set('eccube.admin.order.customer.search.page_no', $page_no);
436
            } else {
437
                $searchData = (array)$session->get('eccube.admin.order.customer.search');
438
                if (is_null($page_no)) {
439
                    $page_no = intval($session->get('eccube.admin.order.customer.search.page_no'));
440
                } else {
441
                    $session->set('eccube.admin.order.customer.search.page_no', $page_no);
442
                }
443
            }
444
445
            $qb = $app['eccube.repository.customer']->getQueryBuilderBySearchData($searchData);
446
447 1
            $event = new EventArgs(
448
                array(
449
                    'qb' => $qb,
450
                    'data' => $searchData,
451
                ),
452
                $request
453
            );
454
            $app['eccube.event.dispatcher']->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_CUSTOMER_SEARCH, $event);
455
456
            /** @var \Knp\Component\Pager\Pagination\SlidingPagination $pagination */
457
            $pagination = $app['paginator']()->paginate(
458
                $qb,
459
                $page_no,
460
                $page_count,
461
                array('wrap-queries' => true)
462
            );
463
464
            /** @var $Customers \Eccube\Entity\Customer[] */
465
            $Customers = $pagination->getItems();
466
467
            if (empty($Customers)) {
468
                $app['monolog']->addDebug('search customer not found.');
469
            }
470
471
            $data = array();
472
473
            $formatTel = '%s-%s-%s';
474
            $formatName = '%s%s(%s%s)';
475 View Code Duplication
            foreach ($Customers as $Customer) {
476
                $data[] = array(
477
                    'id' => $Customer->getId(),
478
                    'name' => sprintf($formatName, $Customer->getName01(), $Customer->getName02(), $Customer->getKana01(),
479
                        $Customer->getKana02()),
480
                    'tel' => sprintf($formatTel, $Customer->getTel01(), $Customer->getTel02(), $Customer->getTel03()),
481
                    'email' => $Customer->getEmail(),
482
                );
483
            }
484
485
            $event = new EventArgs(
486
                array(
487
                    'data' => $data,
488
                    'Customers' => $pagination,
489
                ),
490
                $request
491
            );
492
            $app['eccube.event.dispatcher']->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_CUSTOMER_COMPLETE, $event);
493
            $data = $event->getArgument('data');
494
495
            return $app->render('Order/search_customer.twig', array(
496
                'data' => $data,
497
                'pagination' => $pagination,
498
            ));
499
        }
500
    }
501
502
    /**
503
     * 顧客情報を検索する.
504
     *
505
     * @param Application $app
506
     * @param Request $request
507
     * @return \Symfony\Component\HttpFoundation\JsonResponse
508
     */
509
    public function searchCustomerById(Application $app, Request $request)
510
    {
511
        if ($request->isXmlHttpRequest()) {
512
            $app['monolog']->addDebug('search customer by id start.');
513
514
            /** @var $Customer \Eccube\Entity\Customer */
515
            $Customer = $app['eccube.repository.customer']
516
                ->find($request->get('id'));
517
518
            $event = new EventArgs(
519
                array(
520
                    'Customer' => $Customer,
521
                ),
522
                $request
523
            );
524
            $app['eccube.event.dispatcher']->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_CUSTOMER_BY_ID_INITIALIZE, $event);
525
526
            if (is_null($Customer)) {
527
                $app['monolog']->addDebug('search customer by id not found.');
528
529
                return $app->json(array(), 404);
530
            }
531
532
            $app['monolog']->addDebug('search customer by id found.');
533
534
            $data = array(
535
                'id' => $Customer->getId(),
536
                'name01' => $Customer->getName01(),
537
                'name02' => $Customer->getName02(),
538
                'kana01' => $Customer->getKana01(),
539
                'kana02' => $Customer->getKana02(),
540
                'zip01' => $Customer->getZip01(),
541
                'zip02' => $Customer->getZip02(),
542
                'pref' => is_null($Customer->getPref()) ? null : $Customer->getPref()->getId(),
543
                'addr01' => $Customer->getAddr01(),
544
                'addr02' => $Customer->getAddr02(),
545
                'email' => $Customer->getEmail(),
546
                'tel01' => $Customer->getTel01(),
547
                'tel02' => $Customer->getTel02(),
548
                'tel03' => $Customer->getTel03(),
549
                'fax01' => $Customer->getFax01(),
550
                'fax02' => $Customer->getFax02(),
551
                'fax03' => $Customer->getFax03(),
552
                'company_name' => $Customer->getCompanyName(),
553
            );
554
555
            $event = new EventArgs(
556
                array(
557
                    'data' => $data,
558
                    'Customer' => $Customer,
559
                ),
560
                $request
561
            );
562
            $app['eccube.event.dispatcher']->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_CUSTOMER_BY_ID_COMPLETE, $event);
563
            $data = $event->getArgument('data');
564
565
            return $app->json($data);
566
        }
567
    }
568
569
    public function searchProduct(Application $app, Request $request, $page_no = null)
570
    {
571
        if ($request->isXmlHttpRequest()) {
572
            $app['monolog']->addDebug('search product start.');
573
            $page_count = $app['config']['default_page_count'];
574
            $session = $app['session'];
575
576
            if ('POST' === $request->getMethod()) {
577
578
                $page_no = 1;
579
580
                $searchData = array(
581
                    'id' => $request->get('id'),
582
                );
583
584
                if ($categoryId = $request->get('category_id')) {
585
                    $Category = $app['eccube.repository.category']->find($categoryId);
586
                    $searchData['category_id'] = $Category;
587
                }
588
589
                $session->set('eccube.admin.order.product.search', $searchData);
590
                $session->set('eccube.admin.order.product.search.page_no', $page_no);
591
            } else {
592
                $searchData = (array)$session->get('eccube.admin.order.product.search');
593
                if (is_null($page_no)) {
594
                    $page_no = intval($session->get('eccube.admin.order.product.search.page_no'));
595
                } else {
596
                    $session->set('eccube.admin.order.product.search.page_no', $page_no);
597
                }
598
            }
599
600
            $qb = $app['eccube.repository.product']
601
                ->getQueryBuilderBySearchDataForAdmin($searchData);
602
603
            $event = new EventArgs(
604
                array(
605
                    'qb' => $qb,
606
                    'searchData' => $searchData,
607
                ),
608
                $request
609
            );
610
            $app['eccube.event.dispatcher']->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_PRODUCT_SEARCH, $event);
611
612
            /** @var \Knp\Component\Pager\Pagination\SlidingPagination $pagination */
613
            $pagination = $app['paginator']()->paginate(
614
                $qb,
615
                $page_no,
616
                $page_count,
617
                array('wrap-queries' => true)
618
            );
619
620
            /** @var $Products \Eccube\Entity\Product[] */
621
            $Products = $pagination->getItems();
622
623
            if (empty($Products)) {
624
                $app['monolog']->addDebug('search product not found.');
625
            }
626
627
            $forms = array();
628
            foreach ($Products as $Product) {
629
                /* @var $builder \Symfony\Component\Form\FormBuilderInterface */
630
                $builder = $app['form.factory']->createNamedBuilder('', 'add_cart', null, array(
631
                    'product' => $Product,
632
                ));
633
                $addCartForm = $builder->getForm();
634
                $forms[$Product->getId()] = $addCartForm->createView();
635
            }
636
637
            $event = new EventArgs(
638
                array(
639
                    'forms' => $forms,
640
                    'Products' => $Products,
641
                    'pagination' => $pagination,
642
                ),
643
                $request
644
            );
645
            $app['eccube.event.dispatcher']->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_PRODUCT_COMPLETE, $event);
646
647
            return $app->render('Order/search_product.twig', array(
648
                'forms' => $forms,
649
                'Products' => $Products,
650
                'pagination' => $pagination,
651
            ));
652
        }
653
    }
654
655
    protected function newOrder(Application $app)
656
    {
657
        $Order = new \Eccube\Entity\Order();
658
        $Shipping = new \Eccube\Entity\Shipping();
659
        $Shipping->setDelFlg(0);
660
        $Order->addShipping($Shipping);
661
        $Shipping->setOrder($Order);
662
663
        // device type
664
        $DeviceType = $app['eccube.repository.master.device_type']->find(DeviceType::DEVICE_TYPE_ADMIN);
665
        $Order->setDeviceType($DeviceType);
666
667
        return $Order;
668
    }
669
670
    /**
671
     * フォームからの入直内容に基づいて、受注情報の再計算を行う
672
     *
673
     * @param $app
674
     * @param $Order
675
     */
676
    protected function calculate($app, \Eccube\Entity\Order $Order)
677
    {
678
        $taxtotal = 0;
679
        $subtotal = 0;
680
681
        // 受注明細データの税・小計を再計算
682
        /** @var $OrderDetails \Eccube\Entity\OrderDetail[] */
683
        $OrderDetails = $Order->getOrderDetails();
684
        foreach ($OrderDetails as $OrderDetail) {
685
            // 税
686
            $tax = $app['eccube.service.tax_rule']
687
                ->calcTax($OrderDetail->getPrice(), $OrderDetail->getTaxRate(), $OrderDetail->getTaxRule());
688
            $OrderDetail->setPriceIncTax($OrderDetail->getPrice() + $tax);
689
690
            $taxtotal += $tax * $OrderDetail->getQuantity();
691
692
            // 小計
693
            $subtotal += $OrderDetail->getTotalPrice();
694
        }
695
696
        $shippings = $Order->getShippings();
697
        /** @var \Eccube\Entity\Shipping $Shipping */
698
        foreach ($shippings as $Shipping) {
699
            $Shipping->setDelFlg(Constant::DISABLED);
700
        }
701
702
        // 受注データの税・小計・合計を再計算
703
        $Order->setTax($taxtotal);
704
        $Order->setSubtotal($subtotal);
705
        $Order->setTotal($subtotal + $Order->getCharge() + $Order->getDeliveryFeeTotal() - $Order->getDiscount());
706
        // お支払い合計は、totalと同一金額(2系ではtotal - point)
707
        $Order->setPaymentTotal($Order->getTotal());
708
    }
709
710
    /**
711
     * 受注ステータスに応じて, 受注日/入金日/発送日を更新する,
712
     * 発送済ステータスが設定された場合は, お届け先情報の発送日も更新を行う.
713
     *
714
     * 編集の場合
715
     * - 受注ステータスが他のステータスから発送済へ変更された場合に発送日を更新
716
     * - 受注ステータスが他のステータスから入金済へ変更された場合に入金日を更新
717
     *
718
     * 新規登録の場合
719
     * - 受注日を更新
720
     * - 受注ステータスが発送済に設定された場合に発送日を更新
721
     * - 受注ステータスが入金済に設定された場合に入金日を更新
722
     *
723
     *
724
     * @param $app
725
     * @param $TargetOrder
726
     * @param $OriginOrder
727
     */
728
    protected function updateDate($app, $TargetOrder, $OriginOrder)
729
    {
730
        $dateTime = new \DateTime();
731
732
        // 編集
733
        if ($TargetOrder->getId()) {
734
            // 発送済
735
            if ($TargetOrder->getOrderStatus()->getId() == $app['config']['order_deliv']) {
736
                // 編集前と異なる場合のみ更新
737
                if ($TargetOrder->getOrderStatus()->getId() != $OriginOrder->getOrderStatus()->getId()) {
738
                    $TargetOrder->setCommitDate($dateTime);
739
                    // お届け先情報の発送日も更新する.
740
                    $Shippings = $TargetOrder->getShippings();
741
                    foreach ($Shippings as $Shipping) {
742
                        $Shipping->setShippingCommitDate($dateTime);
743
                    }
744
                }
745
                // 入金済
746
            } elseif ($TargetOrder->getOrderStatus()->getId() == $app['config']['order_pre_end']) {
747
                // 編集前と異なる場合のみ更新
748
                if ($TargetOrder->getOrderStatus()->getId() != $OriginOrder->getOrderStatus()->getId()) {
749
                    $TargetOrder->setPaymentDate($dateTime);
750
                }
751
            }
752
            // 新規
753
        } else {
754
            // 発送済
755
            if ($TargetOrder->getOrderStatus()->getId() == $app['config']['order_deliv']) {
756
                $TargetOrder->setCommitDate($dateTime);
757
                // お届け先情報の発送日も更新する.
758
                $Shippings = $TargetOrder->getShippings();
759
                foreach ($Shippings as $Shipping) {
760
                    $Shipping->setShippingCommitDate($dateTime);
761
                }
762
                // 入金済
763
            } elseif ($TargetOrder->getOrderStatus()->getId() == $app['config']['order_pre_end']) {
764
                $TargetOrder->setPaymentDate($dateTime);
765
            }
766
            // 受注日時
767
            $TargetOrder->setOrderDate($dateTime);
768
        }
769
    }
770
}
771