-
Notifications
You must be signed in to change notification settings - Fork 97
/
SC_Helper_Purchase.php
1514 lines (1362 loc) · 54.9 KB
/
SC_Helper_Purchase.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?php
/*
* This file is part of EC-CUBE
*
* Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
*
* http://www.ec-cube.co.jp/
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/**
* 商品購入関連のヘルパークラス.
*
* TODO 購入時強制会員登録機能(#521)の実装を検討
* TODO dtb_customer.buy_times, dtb_customer.buy_total の更新
*
* @package Helper
* @author Kentaro Ohkouchi
* @version $Id$
*/
class SC_Helper_Purchase
{
public $arrShippingKey = array(
'name01', 'name02', 'kana01', 'kana02', 'company_name',
'sex', 'zip01', 'zip02', 'country_id', 'zipcode', 'pref', 'addr01', 'addr02',
'tel01', 'tel02', 'tel03', 'fax01', 'fax02', 'fax03',
);
/**
* 受注を完了する.
*
* 下記のフローで受注を完了する.
*
* 1. トランザクションを開始する
* 2. カートの内容を検証する.
* 3. 受注一時テーブルから受注データを読み込む
* 4. ユーザーがログインしている場合はその他の発送先へ登録する
* 5. 受注データを受注テーブルへ登録する
* 6. トランザクションをコミットする
*
* 実行中に, 何らかのエラーが発生した場合, 処理を中止しエラーページへ遷移する
*
* 決済モジュールを使用する場合は対応状況を「決済処理中」に設定し,
* 決済完了後「新規受付」に変更すること
*
* @param integer $orderStatus 受注処理を完了する際に設定する対応状況
* @return void
*/
public function completeOrder($orderStatus = ORDER_NEW)
{
$objQuery = SC_Query_Ex::getSingletonInstance();
$objSiteSession = new SC_SiteSession_Ex();
$objCartSession = new SC_CartSession_Ex();
$objCustomer = new SC_Customer_Ex();
$customerId = $objCustomer->getValue('customer_id');
$objQuery->begin();
if (!$objSiteSession->isPrePage()) {
// エラー時は、正当なページ遷移とは認めない
$objSiteSession->setNowPage('');
SC_Utils_Ex::sfDispSiteError(PAGE_ERROR, $objSiteSession);
}
$uniqId = $objSiteSession->getUniqId();
$this->verifyChangeCart($uniqId, $objCartSession);
$orderTemp = $this->getOrderTemp($uniqId);
$orderTemp['status'] = $orderStatus;
$cartkey = $objCartSession->getKey();
$order_id = $this->registerOrderComplete($orderTemp, $objCartSession, $cartkey);
$isMultiple = SC_Helper_Purchase::isMultiple();
$shippingTemp = &$this->getShippingTemp($isMultiple);
foreach ($shippingTemp as $shippingId => $val) {
$this->registerShipmentItem($order_id, $shippingId, $val['shipment_item']);
}
$this->registerShipping($order_id, $shippingTemp);
$objQuery->commit();
//会員情報の最終購入日、購入合計を更新
if ($customerId > 0) {
SC_Customer_Ex::updateOrderSummary($customerId);
}
$this->cleanupSession($order_id, $objCartSession, $objCustomer, $cartkey);
GC_Utils_Ex::gfPrintLog('order complete. order_id=' . $order_id);
}
/**
* 受注をキャンセルする.
*
* 受注完了後の受注をキャンセルする.
* この関数は, 主に決済モジュールにて, 受注をキャンセルする場合に使用する.
*
* 対応状況を引数 $orderStatus で指定した値に変更する.
* (デフォルト ORDER_CANCEL)
* 引数 $is_delete が true の場合は, 受注データを論理削除する.
* 商品の在庫数は, 受注前の在庫数に戻される.
*
* @param integer $order_id 受注ID
* @param integer $orderStatus 対応状況
* @param boolean $is_delete 受注データを論理削除する場合 true
* @return void
*/
public static function cancelOrder($order_id, $orderStatus = ORDER_CANCEL, $is_delete = false)
{
$objQuery = SC_Query_Ex::getSingletonInstance();
$in_transaction = $objQuery->inTransaction();
if (!$in_transaction) {
$objQuery->begin();
}
$arrParams = array();
$arrParams['status'] = $orderStatus;
if ($is_delete) {
$arrParams['del_flg'] = 1;
}
static::registerOrder($order_id, $arrParams);
$arrOrderDetail = static::getOrderDetail($order_id);
foreach ($arrOrderDetail as $arrDetail) {
$objQuery->update(
'dtb_products_class',
array(),
'product_class_id = ?',
array($arrDetail['product_class_id']),
array('stock' => 'stock + ?'),
array($arrDetail['quantity'])
);
}
if (!$in_transaction) {
$objQuery->commit();
}
}
/**
* 受注をキャンセルし, カートをロールバックして, 受注一時IDを返す.
*
* 受注完了後の受注をキャンセルし, カートの状態を受注前の状態へ戻す.
* この関数は, 主に, 決済モジュールに遷移した後, 購入確認画面へ戻る場合に使用する.
*
* 対応状況を引数 $orderStatus で指定した値に変更する.
* (デフォルト ORDER_CANCEL)
* 引数 $is_delete が true の場合は, 受注データを論理削除する.
* 商品の在庫数, カートの内容は受注前の状態に戻される.
*
* @param integer $order_id 受注ID
* @param integer $orderStatus 対応状況
* @param boolean $is_delete 受注データを論理削除する場合 true
* @return string 受注一時ID
*/
public static function rollbackOrder($order_id, $orderStatus = ORDER_CANCEL, $is_delete = false)
{
$objQuery = SC_Query_Ex::getSingletonInstance();
$in_transaction = $objQuery->inTransaction();
if (!$in_transaction) {
$objQuery->begin();
}
static::cancelOrder($order_id, $orderStatus, $is_delete);
$arrOrderTemp = static::getOrderTempByOrderId($order_id);
$objSiteSession = new SC_SiteSession_Ex();
$uniqid = $objSiteSession->getUniqId();
if (!empty($arrOrderTemp)) {
$tempSession = unserialize($arrOrderTemp['session']);
$_SESSION = array_merge($_SESSION, $tempSession === false ? [] : $tempSession);
$objCartSession = new SC_CartSession_Ex();
$objCustomer = new SC_Customer_Ex();
// 新たに受注一時情報を保存する
$objSiteSession->unsetUniqId();
$uniqid = $objSiteSession->getUniqId();
$arrOrderTemp['del_flg'] = 0;
static::saveOrderTemp($uniqid, $arrOrderTemp, $objCustomer);
static::verifyChangeCart($uniqid, $objCartSession);
$objSiteSession->setRegistFlag();
}
if (!$in_transaction) {
$objQuery->commit();
}
return $uniqid;
}
/**
* カートに変化が無いか検証する.
*
* ユニークIDとセッションのユニークIDを比較し, 異なる場合は
* エラー画面を表示する.
*
* カートが空の場合, 購入ボタン押下後にカートが変更された場合は
* カート画面へ遷移する.
*
* @param string $uniqId ユニークID
* @param SC_CartSession $objCartSession
* @return void
*/
public static function verifyChangeCart($uniqId, &$objCartSession)
{
$cartKey = $objCartSession->getKey();
// カート内が空でないか
if (SC_Utils_Ex::isBlank($cartKey)) {
SC_Response_Ex::sendRedirect(CART_URL);
exit;
}
// 初回のみカートの内容を保存
$objCartSession->saveCurrentCart($uniqId, $cartKey);
/*
* POSTのユニークIDとセッションのユニークIDを比較
*(ユニークIDがPOSTされていない場合はスルー)
*/
if (!SC_SiteSession_Ex::checkUniqId()) {
SC_Utils_Ex::sfDispSiteError(CANCEL_PURCHASE);
exit;
}
// 購入ボタンを押してから変化がないか
$quantity = $objCartSession->getTotalQuantity($cartKey);
if ($objCartSession->checkChangeCart($cartKey) || !($quantity > 0)) {
SC_Response_Ex::sendRedirect(CART_URL);
exit;
}
}
/**
* 受注一時情報を取得する.
*
* @param integer $uniqId 受注一時情報ID
* @return array 受注一時情報の配列
*/
public static function getOrderTemp($uniqId)
{
$objQuery = SC_Query_Ex::getSingletonInstance();
return $objQuery->getRow('*', 'dtb_order_temp', 'order_temp_id = ?', array($uniqId));
}
/**
* 受注IDをキーにして受注一時情報を取得する.
*
* @param integer $order_id 受注ID
* @return array 受注一時情報の配列
*/
public static function getOrderTempByOrderId($order_id)
{
$objQuery = SC_Query_Ex::getSingletonInstance();
return $objQuery->getRow('*', 'dtb_order_temp', 'order_id = ?', array($order_id));
}
/**
* 受注一時情報を保存する.
*
* 既存のデータが存在しない場合は新規保存. 存在する場合は更新する.
*
* @param integer $uniqId 受注一時情報ID
* @param array $params 登録する受注情報の配列
* @param SC_Customer $objCustomer SC_Customer インスタンス
* @return void
*/
public static function saveOrderTemp($uniqId, $params, &$objCustomer = NULL)
{
if (SC_Utils_Ex::isBlank($uniqId)) {
return;
}
$params['device_type_id'] = SC_Display_Ex::detectDevice();
$objQuery = SC_Query_Ex::getSingletonInstance();
// 存在するカラムのみを対象とする
$cols = $objQuery->listTableFields('dtb_order_temp');
$sqlval = array();
foreach ($params as $key => $val) {
if (in_array($key, $cols)) {
$sqlval[$key] = $val;
}
}
$sqlval['session'] = serialize($_SESSION);
if (!empty($objCustomer)) {
// 注文者の情報を常に最新に保つ
static::copyFromCustomer($sqlval, $objCustomer);
}
$exists = SC_Helper_Purchase_Ex::getOrderTemp($uniqId);
//国ID追加
$sqlval['order_country_id'] = ($sqlval['order_country_id']) ? $sqlval['order_country_id'] : DEFAULT_COUNTRY_ID;
if (SC_Utils_Ex::isBlank($exists)) {
$sqlval['order_temp_id'] = $uniqId;
$sqlval['create_date'] = 'CURRENT_TIMESTAMP';
$objQuery->insert('dtb_order_temp', $sqlval);
} else {
$objQuery->update('dtb_order_temp', $sqlval, 'order_temp_id = ?', array($uniqId));
}
}
/**
* 配送情報をセッションから取得する.
*
* @param bool $has_shipment_item 配送商品を保有している配送先のみ返す。
*/
public static function getShippingTemp($has_shipment_item = false)
{
// ダウンロード商品の場合setされていないので空の配列を返す.
if (!isset($_SESSION['shipping'])) return array();
if ($has_shipment_item) {
$arrReturn = array();
foreach ($_SESSION['shipping'] as $key => $arrVal) {
if (is_array($arrVal['shipment_item']) && count($arrVal['shipment_item']) == 0) continue;
$arrReturn[$key] = $arrVal;
}
return $arrReturn;
}
return $_SESSION['shipping'];
}
/**
* 配送商品をクリア(消去)する
*
* @param integer $shipping_id 配送先ID
* @return void
*/
public function clearShipmentItemTemp($shipping_id = null)
{
if (is_null($shipping_id)) {
foreach ($_SESSION['shipping'] as $key => $value) {
$this->clearShipmentItemTemp($key);
}
} else {
if (!isset($_SESSION['shipping'][$shipping_id])) return;
if (!is_array($_SESSION['shipping'][$shipping_id])) return;
unset($_SESSION['shipping'][$shipping_id]['shipment_item']);
}
}
/**
* 配送商品を設定する.
*
* @param integer $shipping_id 配送先ID
* @param integer $product_class_id 商品規格ID
* @param integer $quantity 数量
* @return void
*/
public function setShipmentItemTemp($shipping_id, $product_class_id, $quantity)
{
// 配列が長くなるので, リファレンスを使用する
$arrItems = &$_SESSION['shipping'][$shipping_id]['shipment_item'][$product_class_id];
$arrItems['shipping_id'] = $shipping_id;
$arrItems['product_class_id'] = $product_class_id;
$arrItems['quantity'] = $quantity;
$objProduct = new SC_Product_Ex();
// カート情報から読みこめば済むと思うが、一旦保留。むしろ、カート情報も含め、セッション情報を縮小すべきかもしれない。
/*
$objCartSession = new SC_CartSession_Ex();
$cartKey = $objCartSession->getKey();
// 詳細情報を取得
$cartItems = $objCartSession->getCartList($cartKey);
*/
if (empty($arrItems['productsClass'])) {
$product = &$objProduct->getDetailAndProductsClass($product_class_id);
$arrItems['productsClass'] = $product;
}
$arrItems['price'] = $arrItems['productsClass']['price02'];
$inctax = SC_Helper_TaxRule_Ex::sfCalcIncTax(
$arrItems['price'],
$arrItems['productsClass']['product_id'],
$arrItems['productsClass']['product_class_id']
);
$arrItems['total_inctax'] = $inctax * $arrItems['quantity'];
}
/**
* 配送先都道府県の配列を返す.
* @param boolean $is_multiple
*/
public static function getShippingPref($is_multiple)
{
$results = array();
foreach (SC_Helper_Purchase_Ex::getShippingTemp($is_multiple) as $val) {
$results[] = $val['shipping_pref'];
}
return $results;
}
/**
* 複数配送指定の購入かどうか.
*
* @return boolean 複数配送指定の購入の場合 true
*/
public function isMultiple()
{
return count(SC_Helper_Purchase_Ex::getShippingTemp(true)) >= 2;
}
/**
* 配送情報をセッションに保存する.
*
* XXX マージする理由が不明(なんとなく便利な気はするけど)。分かる方コメントに残してください。
* @param array $arrSrc 配送情報の連想配列
* @param integer $shipping_id 配送先ID
* @return void
*/
public static function saveShippingTemp($arrSrc, $shipping_id = 0)
{
// 配送商品は引き継がない
unset($arrSrc['shipment_item']);
if (!isset($_SESSION['shipping'][$shipping_id])) {
$_SESSION['shipping'][$shipping_id] = array();
}
$_SESSION['shipping'][$shipping_id] = array_merge($_SESSION['shipping'][$shipping_id], $arrSrc);
$_SESSION['shipping'][$shipping_id]['shipping_id'] = $shipping_id;
}
/**
* セッションの配送情報を破棄する.
*
* @deprecated 2.12.0 から EC-CUBE 本体では使用していない。
* @return void
*/
public static function unsetShippingTemp()
{
SC_Helper_Purchase_Ex::unsetAllShippingTemp(true);
}
/**
* セッションの配送情報を全て破棄する
*
* @param bool $multiple_temp 複数お届け先の画面戻り処理用の情報も破棄するか
* @return void
*/
public static function unsetAllShippingTemp($multiple_temp = false)
{
unset($_SESSION['shipping']);
if ($multiple_temp) {
unset($_SESSION['multiple_temp']);
}
}
/**
* セッションの配送情報を個別に破棄する
*
* @param integer $shipping_id 配送先ID
* @return void
*/
public static function unsetOneShippingTemp($shipping_id)
{
unset($_SESSION['shipping'][$shipping_id]);
}
/**
* 会員情報を受注情報にコピーする.
*
* ユーザーがログインしていない場合は何もしない.
* 会員情報を $dest の order_* へコピーする.
* customer_id は強制的にコピーされる.
*
* @param array $dest コピー先の配列
* @param SC_Customer $objCustomer SC_Customer インスタンス
* @param string $prefix コピー先の接頭辞. デフォルト order
* @param array $keys コピー対象のキー
* @return void
*/
public static function copyFromCustomer(
&$dest,
&$objCustomer,
$prefix = 'order',
$keys = array(
'name01', 'name02', 'kana01', 'kana02', 'company_name',
'sex', 'zip01', 'zip02', 'country_id', 'zipcode', 'pref', 'addr01', 'addr02',
'tel01', 'tel02', 'tel03', 'fax01', 'fax02', 'fax03',
'job', 'birth', 'email',
)
) {
if ($objCustomer->isLoginSuccess(true)) {
foreach ($keys as $key) {
if (in_array($key, $keys)) {
$dest[$prefix . '_' . $key] = $objCustomer->getValue($key);
}
}
if ((SC_Display_Ex::detectDevice() == DEVICE_TYPE_MOBILE)
&& in_array('email', $keys)
) {
$email_mobile = $objCustomer->getValue('email_mobile');
if (empty($email_mobile)) {
$dest[$prefix . '_email'] = $objCustomer->getValue('email');
} else {
$dest[$prefix . '_email'] = $email_mobile;
}
}
$dest['customer_id'] = $objCustomer->getValue('customer_id');
$dest['update_date'] = 'CURRENT_TIMESTAMP';
}
}
/**
* 受注情報を配送情報にコピーする.
*
* 受注情報($src)を $dest の order_* へコピーする.
*
* TODO 汎用的にして SC_Utils へ移動
*
* @param array $dest コピー先の配列
* @param array $src コピー元の配列
* @param array $arrKey コピー対象のキー
* @param string $prefix コピー先の接頭辞. デフォルト shipping
* @param string $src_prefix コピー元の接頭辞. デフォルト order
* @return void
*/
public function copyFromOrder(&$dest, $src, $prefix = 'shipping', $src_prefix = 'order', $arrKey = null)
{
if (is_null($arrKey)) {
$arrKey = $this->arrShippingKey;
}
if (!SC_Utils_Ex::isBlank($prefix)) {
$prefix = $prefix . '_';
}
if (!SC_Utils_Ex::isBlank($src_prefix)) {
$src_prefix = $src_prefix . '_';
}
foreach ($arrKey as $key) {
if (isset($src[$src_prefix . $key])) {
$dest[$prefix . $key] = $src[$src_prefix . $key];
}
}
}
/**
* 配送情報のみ抜き出す。
*
* @param string $arrSrc 元となる配列
* @return void
*/
public function extractShipping($arrSrc)
{
$arrKey = array();
foreach ($this->arrShippingKey as $key) {
$arrKey[] = 'shipping_' . $key;
}
return SC_Utils_Ex::sfArrayIntersectKeys($arrSrc, $arrKey);
}
/**
* お届け日一覧を取得する.
* @param SC_CartSession $objCartSess
* @param integer $product_type_id
*/
public function getDelivDate(&$objCartSess, $product_type_id)
{
$cartList = $objCartSess->getCartList($product_type_id);
$delivDateIds = array();
foreach ($cartList as $item) {
$delivDateIds[] = $item['productsClass']['deliv_date_id'];
}
$max_date = max($delivDateIds);
//発送目安
switch ($max_date) {
//即日発送
case '1':
$start_day = 1;
break;
//1-2日後
case '2':
$start_day = 3;
break;
//3-4日後
case '3':
$start_day = 5;
break;
//1週間以降
case '4':
$start_day = 8;
break;
//2週間以降
case '5':
$start_day = 15;
break;
//3週間以降
case '6':
$start_day = 22;
break;
//1ヶ月以降
case '7':
$start_day = 32;
break;
//2ヶ月以降
case '8':
$start_day = 62;
break;
//お取り寄せ(商品入荷後)
case '9':
$start_day = '';
break;
default:
//お届け日が設定されていない場合
$start_day = '';
break;
}
//お届け可能日のスタート値から、お届け日の配列を取得する
$arrDelivDate = $this->getDateArray($start_day, DELIV_DATE_END_MAX);
return $arrDelivDate;
}
/**
* お届け可能日のスタート値から, お届け日の配列を取得する.
*/
public function getDateArray($start_day, $end_day)
{
$masterData = new SC_DB_MasterData_Ex();
$arrWDAY = $masterData->getMasterData('mtb_wday');
$arrDate = array();
//お届け可能日のスタート値がセットされていれば
if ($start_day >= 1) {
$now_time = time();
$max_day = $start_day + $end_day;
// 集計
for ($i = $start_day; $i < $max_day; $i++) {
// 基本時間から日数を追加していく
$tmp_time = $now_time + ($i * 24 * 3600);
list($y, $m, $d, $w) = explode(' ', date('Y m d w', $tmp_time));
$val = sprintf('%04d/%02d/%02d(%s)', $y, $m, $d, $arrWDAY[$w]);
$arrDate[$val] = $val;
}
} else {
$arrDate = false;
}
return $arrDate;
}
/**
* 配送情報の登録を行う.
*
* $arrParam のうち, dtb_shipping テーブルに存在するカラムのみを登録する.
*
* TODO UPDATE/INSERT にする
*
* @param integer $order_id 受注ID
* @param array $arrParams 配送情報の連想配列
* @param boolean $convert_shipping_date yyyy/mm/dd(EEE) 形式の配送日付を変換する場合 true
* @return void
*/
public static function registerShipping($order_id, $arrParams, $convert_shipping_date = true)
{
$objQuery = SC_Query_Ex::getSingletonInstance();
$table = 'dtb_shipping';
$where = 'order_id = ?';
if ($objQuery->count($table, $where, [$order_id]) > 0) {
$objQuery->delete($table, $where, array($order_id));
}
foreach ($arrParams as $key => $arrShipping) {
$arrValues = $objQuery->extractOnlyColsOf($table, $arrShipping);
// 配送日付を timestamp に変換
if (
!SC_Utils_Ex::isBlank($arrValues['shipping_date'])
&& $convert_shipping_date
) {
$d = mb_strcut($arrValues['shipping_date'], 0, 10);
$arrDate = explode('/', $d);
$ts = mktime(0, 0, 0, $arrDate[1], $arrDate[2], $arrDate[0]);
$arrValues['shipping_date'] = date('Y-m-d', $ts);
}
// 非会員購入の場合は shipping_id が存在しない
if (!isset($arrValues['shipping_id'])) {
$arrValues['shipping_id'] = $key;
}
$arrValues['order_id'] = $order_id;
$arrValues['create_date'] = 'CURRENT_TIMESTAMP';
$arrValues['update_date'] = 'CURRENT_TIMESTAMP';
//国ID追加
/*いらないかもしれないんでとりあえずコメントアウト
$arrValues['shipping_country_id'] = DEFAULT_COUNTRY_ID;
*/
$objQuery->insert($table, $arrValues);
}
$sql_sub = <<< __EOS__
SELECT deliv_time
FROM dtb_delivtime
WHERE time_id = dtb_shipping.time_id
AND deliv_id = (SELECT dtb_order.deliv_id FROM dtb_order WHERE order_id = dtb_shipping.order_id)
__EOS__;
$objQuery->update(
'dtb_shipping',
array(),
$where,
array($order_id),
array('shipping_time' => "($sql_sub)")
);
}
/**
* 配送商品を登録する.
*
* @param integer $order_id 受注ID
* @param integer $shipping_id 配送先ID
* @param array $arrParams 配送商品の配列
* @return void
*/
public static function registerShipmentItem($order_id, $shipping_id, $arrParams)
{
$objQuery = SC_Query_Ex::getSingletonInstance();
$table = 'dtb_shipment_item';
$where = 'order_id = ? AND shipping_id = ?';
$objQuery->delete($table, $where, array($order_id, $shipping_id));
$objProduct = new SC_Product_Ex();
foreach ($arrParams as $arrValues) {
if (SC_Utils_Ex::isBlank($arrValues['product_class_id'])) {
continue;
}
$d = $objProduct->getDetailAndProductsClass($arrValues['product_class_id']);
$name = SC_Utils_Ex::isBlank($arrValues['product_name'])
? $d['name']
: $arrValues['product_name'];
$code = SC_Utils_Ex::isBlank($arrValues['product_code'])
? $d['product_code']
: $arrValues['product_code'];
$cname1 = SC_Utils_Ex::isBlank($arrValues['classcategory_name1'])
? $d['classcategory_name1']
: $arrValues['classcategory_name1'];
$cname2 = SC_Utils_Ex::isBlank($arrValues['classcategory_name2'])
? $d['classcategory_name2']
: $arrValues['classcategory_name2'];
$price = SC_Utils_Ex::isBlank($arrValues['price'])
? $d['price']
: $arrValues['price'];
$arrValues['order_id'] = $order_id;
$arrValues['shipping_id'] = $shipping_id;
$arrValues['product_name'] = $name;
$arrValues['product_code'] = $code;
$arrValues['classcategory_name1'] = $cname1;
$arrValues['classcategory_name2'] = $cname2;
$arrValues['price'] = $price;
$arrExtractValues = $objQuery->extractOnlyColsOf($table, $arrValues);
$objQuery->insert($table, $arrExtractValues);
}
}
/**
* 受注登録を完了する.
*
* 引数の受注情報を受注テーブル及び受注詳細テーブルに登録する.
* 登録後, 受注一時テーブルに削除フラグを立てる.
*
* @param array $orderParams 登録する受注情報の配列
* @param SC_CartSession $objCartSession カート情報のインスタンス
* @param integer $cartKey 登録を行うカート情報のキー
* @return integer 受注ID
*/
public function registerOrderComplete($orderParams, &$objCartSession, $cartKey)
{
$objQuery = SC_Query_Ex::getSingletonInstance();
// 不要な変数を unset
$unsets = array(
'mailmaga_flg', 'deliv_check', 'point_check', 'password',
'reminder', 'reminder_answer', 'mail_flag', 'session'
);
foreach ($unsets as $unset) {
unset($orderParams[$unset]);
}
// 対応状況の指定が無い場合は新規受付
if (SC_Utils_Ex::isBlank($orderParams['status'])) {
$orderParams['status'] = ORDER_NEW;
}
$orderParams['del_flg'] = '0';
$orderParams['create_date'] = 'CURRENT_TIMESTAMP';
$orderParams['update_date'] = 'CURRENT_TIMESTAMP';
$this->registerOrder($orderParams['order_id'], $orderParams);
// 詳細情報を取得
$cartItems = $objCartSession->getCartList($cartKey, $orderParams['order_pref'], $orderParams['order_country_id']);
// 詳細情報を生成
$objProduct = new SC_Product_Ex();
$i = 0;
$arrDetail = array();
foreach ($cartItems as $item) {
$p = &$item['productsClass'];
$arrDetail[$i]['order_id'] = $orderParams['order_id'];
$arrDetail[$i]['product_id'] = $p['product_id'];
$arrDetail[$i]['product_class_id'] = $p['product_class_id'];
$arrDetail[$i]['product_name'] = $p['name'];
$arrDetail[$i]['product_code'] = $p['product_code'];
$arrDetail[$i]['classcategory_name1'] = $p['classcategory_name1'];
$arrDetail[$i]['classcategory_name2'] = $p['classcategory_name2'];
$arrDetail[$i]['point_rate'] = $item['point_rate'];
$arrDetail[$i]['price'] = $item['price'];
$arrDetail[$i]['quantity'] = $item['quantity'];
$arrDetail[$i]['tax_rate'] = $item['tax_rate'];
$arrDetail[$i]['tax_rule'] = $item['tax_rule'];
$arrDetail[$i]['tax_adjust'] = $item['tax_adjust'];
// 在庫の減少処理
if (!$objProduct->reduceStock($p['product_class_id'], $item['quantity'])) {
$objQuery->rollback();
SC_Utils_Ex::sfDispSiteError(SOLD_OUT, '', true);
}
$i++;
}
$this->registerOrderDetail($orderParams['order_id'], $arrDetail);
$objQuery->update(
'dtb_order_temp',
array('del_flg' => 1),
'order_temp_id = ?',
array(SC_SiteSession_Ex::getUniqId())
);
return $orderParams['order_id'];
}
/**
* 受注情報を登録する.
*
* 既に受注IDが存在する場合は, 受注情報を更新する.
* 引数の受注IDが, 空白又は null の場合は, 新しく受注IDを発行して登録する.
*
* @param integer $order_id 受注ID
* @param array $arrParams 受注情報の連想配列
* @return integer 受注ID
*/
public static function registerOrder($order_id, $arrParams)
{
$table = 'dtb_order';
$where = 'order_id = ?';
$objQuery = SC_Query_Ex::getSingletonInstance();
$arrValues = $objQuery->extractOnlyColsOf($table, $arrParams);
$exists = $objQuery->exists($table, $where, array($order_id));
if ($exists) {
static::sfUpdateOrderStatus(
$order_id,
$arrValues['status'],
$arrValues['add_point'],
$arrValues['use_point'],
$arrValues
);
static::sfUpdateOrderNameCol($order_id);
$arrValues['update_date'] = 'CURRENT_TIMESTAMP';
$objQuery->update($table, $arrValues, $where, array($order_id));
} else {
if (SC_Utils_Ex::isBlank($order_id)) {
$order_id = static::getNextOrderID();
}
/*
* 新規受付の場合は対応状況 null で insert し,
* sfUpdateOrderStatus で引数で受け取った値に変更する.
*/
$status = $arrValues['status'];
$arrValues['status'] = null;
$arrValues['order_id'] = $order_id;
$arrValues['customer_id'] =
SC_Utils_Ex::isBlank($arrValues['customer_id'])
? 0 : $arrValues['customer_id'];
$arrValues['create_date'] = 'CURRENT_TIMESTAMP';
$arrValues['update_date'] = 'CURRENT_TIMESTAMP';
$objQuery->insert($table, $arrValues);
static::sfUpdateOrderStatus(
$order_id,
$status,
$arrValues['add_point'],
$arrValues['use_point'],
$arrValues
);
static::sfUpdateOrderNameCol($order_id);
}
return $order_id;
}
/**
* 受注詳細情報を登録する.
*
* 既に, 該当の受注が存在する場合は, 受注情報を削除し, 登録する.
*
* @param integer $order_id 受注ID
* @param array $arrParams 受注情報の連想配列
* @return void
*/
public static function registerOrderDetail($order_id, $arrParams)
{
$table = 'dtb_order_detail';
$where = 'order_id = ?';
$objQuery = SC_Query_Ex::getSingletonInstance();
$objQuery->delete($table, $where, array($order_id));
foreach ($arrParams as $arrDetail) {
$arrValues = $objQuery->extractOnlyColsOf($table, $arrDetail);
$arrValues['order_detail_id'] = $objQuery->nextVal('dtb_order_detail_order_detail_id');
$arrValues['order_id'] = $order_id;
$objQuery->insert($table, $arrValues);
}
}
/**
* 受注情報を取得する.
*
* @param integer $order_id 受注ID
* @param integer $customer_id 会員ID
* @return array 受注情報の配列
*/
public static function getOrder($order_id, $customer_id = null)
{
$objQuery = SC_Query_Ex::getSingletonInstance();
$where = 'order_id = ?';
$arrValues = array($order_id);
if (!SC_Utils_Ex::isBlank($customer_id)) {
$where .= ' AND customer_id = ?';
$arrValues[] = $customer_id;
}
return $objQuery->getRow('*', 'dtb_order', $where, $arrValues);
}
/**
* 受注詳細を取得する.
*
* @param integer $order_id 受注ID
* @param boolean $has_order_status 対応状況, 入金日も含める場合 true
* @return array 受注詳細の配列
*/
public static function getOrderDetail($order_id, $has_order_status = true)
{
$objQuery = SC_Query_Ex::getSingletonInstance();
$dbFactory = SC_DB_DBFactory_Ex::getInstance();
$col = <<< __EOS__
T3.product_id,
T3.product_class_id as product_class_id,
T3.product_type_id AS product_type_id,
T2.product_code,
T2.product_name,
T2.classcategory_name1 AS classcategory_name1,
T2.classcategory_name2 AS classcategory_name2,
T2.price,
T2.quantity,
T2.point_rate,
T2.tax_rate,
T2.tax_rule,
__EOS__;
if ($has_order_status) {
$col .= 'T1.status AS status, T1.payment_date AS payment_date,';
}
$col .= <<< __EOS__
CASE WHEN
EXISTS(
SELECT * FROM dtb_products
WHERE product_id = T3.product_id