| Conditions | 40 |
| Paths | > 20000 |
| Total Lines | 256 |
| Code Lines | 154 |
| Lines | 0 |
| Ratio | 0 % |
| Changes | 0 | ||
Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.
For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.
Commonly applied refactorings include:
If many parameters/temporary variables are present:
| 1 | <?php |
||
| 45 | public function index(Application $app, Request $request) |
||
| 46 | { |
||
| 47 | // カートチェック |
||
| 48 | $response = $app->forward($app->path("shopping/checkToCart")); |
||
| 49 | if ($response->isRedirection() || $response->getContent()) { |
||
| 50 | return $response; |
||
| 51 | } |
||
| 52 | |||
| 53 | /** @var \Eccube\Entity\Order $Order */ |
||
| 54 | $Order = $app['eccube.service.shopping']->getOrder($app['config']['order_processing']); |
||
| 55 | if (!$Order) { |
||
| 56 | log_info('購入処理中の受注情報がないため購入エラー'); |
||
| 57 | $app->addError('front.shopping.order.error'); |
||
| 58 | return $app->redirect($app->url('shopping_error')); |
||
| 59 | } |
||
| 60 | |||
| 61 | // 処理しやすいようにすべてのShippingItemをまとめる |
||
| 62 | $ShipmentItems = array(); |
||
| 63 | foreach ($Order->getShippings() as $Shipping) { |
||
| 64 | foreach ($Shipping->getProductOrderItems() as $ShipmentItem) { |
||
| 65 | $ShipmentItems[] = $ShipmentItem; |
||
| 66 | } |
||
| 67 | } |
||
| 68 | |||
| 69 | // Orderに含まれる商品ごとの数量を求める |
||
| 70 | $ItemQuantitiesByClassId = array(); |
||
| 71 | foreach ($ShipmentItems as $item) { |
||
| 72 | $itemId = $item->getProductClass()->getId(); |
||
| 73 | $quantity = $item->getQuantity(); |
||
| 74 | if (array_key_exists($itemId, $ItemQuantitiesByClassId)) { |
||
| 75 | $ItemQuantitiesByClassId[$itemId] += $quantity; |
||
| 76 | } else { |
||
| 77 | $ItemQuantitiesByClassId[$itemId] = $quantity; |
||
| 78 | } |
||
| 79 | } |
||
| 80 | |||
| 81 | // FormBuilder用に商品ごとにShippingItemをまとめる |
||
| 82 | $ShipmentItemsForFormBuilder = array(); |
||
| 83 | $tmpAddedClassIds = array(); |
||
| 84 | foreach ($ShipmentItems as $item) { |
||
| 85 | $itemId = $item->getProductClass()->getId(); |
||
| 86 | if (!in_array($itemId, $tmpAddedClassIds)) { |
||
| 87 | $ShipmentItemsForFormBuilder[] = $item; |
||
| 88 | $tmpAddedClassIds[] = $itemId; |
||
| 89 | } |
||
| 90 | } |
||
| 91 | |||
| 92 | // Form生成 |
||
| 93 | $builder = $app->form(); |
||
| 94 | $builder |
||
| 95 | ->add('shipping_multiple', CollectionType::class, array( |
||
| 96 | 'entry_type' => ShippingMultipleType::class, |
||
| 97 | 'data' => $ShipmentItemsForFormBuilder, |
||
| 98 | 'allow_add' => true, |
||
| 99 | 'allow_delete' => true, |
||
| 100 | )); |
||
| 101 | // Event |
||
| 102 | $event = new EventArgs( |
||
| 103 | array( |
||
| 104 | 'builder' => $builder, |
||
| 105 | 'Order' => $Order, |
||
| 106 | ), |
||
| 107 | $request |
||
| 108 | ); |
||
| 109 | $app['eccube.event.dispatcher']->dispatch(EccubeEvents::FRONT_SHOPPING_SHIPPING_MULTIPLE_INITIALIZE, $event); |
||
| 110 | |||
| 111 | $form = $builder->getForm(); |
||
| 112 | $form->handleRequest($request); |
||
| 113 | |||
| 114 | $errors = array(); |
||
| 115 | if ($form->isSubmitted() && $form->isValid()) { |
||
| 116 | |||
| 117 | log_info('複数配送設定処理開始', array($Order->getId())); |
||
| 118 | |||
| 119 | $data = $form['shipping_multiple']; |
||
| 120 | |||
| 121 | // フォームの入力から、送り先ごとに商品の数量を集計する |
||
| 122 | $arrShipmentItemTemp = array(); |
||
| 123 | foreach ($data as $mulitples) { |
||
| 124 | $ShipmentItem = $mulitples->getData(); |
||
| 125 | foreach ($mulitples as $items) { |
||
| 126 | foreach ($items as $item) { |
||
| 127 | $cusAddId = $this->getCustomerAddressId($item['customer_address']->getData()); |
||
| 128 | $itemId = $ShipmentItem->getProductClass()->getId(); |
||
| 129 | $quantity = $item['quantity']->getData(); |
||
| 130 | |||
| 131 | if (isset($arrShipmentItemTemp[$cusAddId]) && array_key_exists($itemId, $arrShipmentItemTemp[$cusAddId])) { |
||
| 132 | $arrShipmentItemTemp[$cusAddId][$itemId] = $arrShipmentItemTemp[$cusAddId][$itemId] + $quantity; |
||
| 133 | } else { |
||
| 134 | $arrShipmentItemTemp[$cusAddId][$itemId] = $quantity; |
||
| 135 | } |
||
| 136 | } |
||
| 137 | } |
||
| 138 | } |
||
| 139 | |||
| 140 | // フォームの入力から、商品ごとの数量を集計する |
||
| 141 | $itemQuantities = array(); |
||
| 142 | foreach ($arrShipmentItemTemp as $FormItemByAddress) { |
||
| 143 | foreach ($FormItemByAddress as $itemId => $quantity) { |
||
| 144 | if (array_key_exists($itemId, $itemQuantities)) { |
||
| 145 | $itemQuantities[$itemId] = $itemQuantities[$itemId] + $quantity; |
||
| 146 | } else { |
||
| 147 | $itemQuantities[$itemId] = $quantity; |
||
| 148 | } |
||
| 149 | } |
||
| 150 | } |
||
| 151 | |||
| 152 | // 「Orderに含まれる商品ごとの数量」と「フォームに入力された商品ごとの数量」が一致しているかの確認 |
||
| 153 | // 数量が異なっているならエラーを表示する |
||
| 154 | foreach ($ItemQuantitiesByClassId as $key => $value) { |
||
| 155 | if (array_key_exists($key, $itemQuantities)) { |
||
| 156 | if ($itemQuantities[$key] != $value) { |
||
| 157 | $errors[] = array('message' => $app->trans('shopping.multiple.quantity.diff')); |
||
| 158 | |||
| 159 | // 対象がなければエラー |
||
| 160 | log_info('複数配送設定入力チェックエラー', array($Order->getId())); |
||
| 161 | return $app->render('Shopping/shipping_multiple.twig', array( |
||
| 162 | 'form' => $form->createView(), |
||
| 163 | 'shipmentItems' => $ShipmentItemsForFormBuilder, |
||
| 164 | 'compItemQuantities' => $ItemQuantitiesByClassId, |
||
| 165 | 'errors' => $errors, |
||
| 166 | )); |
||
| 167 | } |
||
| 168 | } |
||
| 169 | } |
||
| 170 | |||
| 171 | // -- ここから先がお届け先を再生成する処理 -- |
||
| 172 | |||
| 173 | // お届け先情報をすべて削除 |
||
| 174 | foreach ($Order->getShippings() as $Shipping) { |
||
| 175 | $app['orm.em']->remove($Shipping); |
||
| 176 | } |
||
| 177 | |||
| 178 | // お届け先のリストを作成する |
||
| 179 | $ShippingList = array(); |
||
| 180 | foreach ($data as $mulitples) { |
||
| 181 | $ShipmentItem = $mulitples->getData(); |
||
| 182 | $ProductClass = $ShipmentItem->getProductClass(); |
||
| 183 | $Delivery = $ShipmentItem->getShipping()->getDelivery(); |
||
| 184 | $productTypeId = $ProductClass->getProductType()->getId(); |
||
| 185 | |||
| 186 | foreach ($mulitples as $items) { |
||
| 187 | foreach ($items as $item) { |
||
| 188 | $CustomerAddress = $this->getCustomerAddress($app, $item['customer_address']->getData()); |
||
| 189 | $cusAddId = $this->getCustomerAddressId($item['customer_address']->getData()); |
||
| 190 | |||
| 191 | $Shipping = new Shipping(); |
||
| 192 | $Shipping |
||
| 193 | ->setFromCustomerAddress($CustomerAddress) |
||
| 194 | ->setDelivery($Delivery) |
||
| 195 | ->setDelFlg(Constant::DISABLED); |
||
| 196 | |||
| 197 | $ShippingList[$cusAddId][$productTypeId] = $Shipping; |
||
| 198 | } |
||
| 199 | } |
||
| 200 | } |
||
| 201 | // お届け先のリストを保存 |
||
| 202 | foreach ($ShippingList as $ShippingListByAddress) { |
||
| 203 | foreach ($ShippingListByAddress as $Shipping) { |
||
| 204 | $app['orm.em']->persist($Shipping); |
||
| 205 | } |
||
| 206 | } |
||
| 207 | |||
| 208 | $ProductOrderType = $app['eccube.repository.master.order_item_type']->find(OrderItemType::PRODUCT); |
||
| 209 | |||
| 210 | // お届け先に、配送商品の情報(ShipmentItem)を関連付ける |
||
| 211 | foreach ($data as $mulitples) { |
||
| 212 | $ShipmentItem = $mulitples->getData(); |
||
| 213 | $ProductClass = $ShipmentItem->getProductClass(); |
||
| 214 | $Product = $ShipmentItem->getProduct(); |
||
| 215 | $productTypeId = $ProductClass->getProductType()->getId(); |
||
| 216 | $productClassId = $ProductClass->getId(); |
||
| 217 | |||
| 218 | foreach ($mulitples as $items) { |
||
| 219 | foreach ($items as $item) { |
||
| 220 | $cusAddId = $this->getCustomerAddressId($item['customer_address']->getData()); |
||
| 221 | |||
| 222 | // お届け先から商品の数量を取得 |
||
| 223 | $quantity = 0; |
||
| 224 | if (isset($arrShipmentItemTemp[$cusAddId]) && array_key_exists($productClassId, $arrShipmentItemTemp[$cusAddId])) { |
||
| 225 | $quantity = $arrShipmentItemTemp[$cusAddId][$productClassId]; |
||
| 226 | unset($arrShipmentItemTemp[$cusAddId][$productClassId]); |
||
| 227 | } else { |
||
| 228 | // この配送先には送る商品がないのでスキップ(通常ありえない) |
||
| 229 | continue; |
||
| 230 | } |
||
| 231 | |||
| 232 | // 関連付けるお届け先のインスタンスを取得 |
||
| 233 | $Shipping = $ShippingList[$cusAddId][$productTypeId]; |
||
| 234 | |||
| 235 | // インスタンスを生成して保存 |
||
| 236 | $ShipmentItem = new ShipmentItem(); |
||
| 237 | $ShipmentItem->setShipping($Shipping) |
||
| 238 | ->setOrder($Order) |
||
| 239 | ->setProductClass($ProductClass) |
||
| 240 | ->setProduct($Product) |
||
| 241 | ->setProductName($Product->getName()) |
||
| 242 | ->setProductCode($ProductClass->getCode()) |
||
| 243 | ->setPrice($ProductClass->getPrice02()) |
||
| 244 | ->setQuantity($quantity) |
||
| 245 | ->setOrderItemType($ProductOrderType); |
||
| 246 | |||
| 247 | $ClassCategory1 = $ProductClass->getClassCategory1(); |
||
| 248 | if (!is_null($ClassCategory1)) { |
||
| 249 | $ShipmentItem->setClasscategoryName1($ClassCategory1->getName()); |
||
| 250 | $ShipmentItem->setClassName1($ClassCategory1->getClassName()->getName()); |
||
| 251 | } |
||
| 252 | $ClassCategory2 = $ProductClass->getClassCategory2(); |
||
| 253 | if (!is_null($ClassCategory2)) { |
||
| 254 | $ShipmentItem->setClasscategoryName2($ClassCategory2->getName()); |
||
| 255 | $ShipmentItem->setClassName2($ClassCategory2->getClassName()->getName()); |
||
| 256 | } |
||
| 257 | $Shipping->addShipmentItem($ShipmentItem); |
||
| 258 | $app['orm.em']->persist($ShipmentItem); |
||
| 259 | } |
||
| 260 | } |
||
| 261 | } |
||
| 262 | |||
| 263 | // 送料を計算(お届け先ごと) |
||
| 264 | foreach ($ShippingList as $data) { |
||
| 265 | // data is product type => shipping |
||
| 266 | foreach ($data as $Shipping) { |
||
| 267 | // 配送料金の設定 |
||
| 268 | $app['eccube.service.shopping']->setShippingDeliveryFee($Shipping); |
||
| 269 | } |
||
| 270 | } |
||
| 271 | |||
| 272 | // 合計金額の再計算 |
||
| 273 | $flowResult = $this->executePurchaseFlow($app, $Order); |
||
| 274 | if ($flowResult->hasWarning() || $flowResult->hasError()) { |
||
| 275 | return $app->redirect($app->url('shopping_error')); |
||
| 276 | } |
||
| 277 | |||
| 278 | // 配送先を更新 |
||
| 279 | $app['orm.em']->flush(); |
||
| 280 | |||
| 281 | $event = new EventArgs( |
||
| 282 | array( |
||
| 283 | 'form' => $form, |
||
| 284 | 'Order' => $Order, |
||
| 285 | ), |
||
| 286 | $request |
||
| 287 | ); |
||
| 288 | $app['eccube.event.dispatcher']->dispatch(EccubeEvents::FRONT_SHOPPING_SHIPPING_MULTIPLE_COMPLETE, $event); |
||
| 289 | |||
| 290 | log_info('複数配送設定処理完了', array($Order->getId())); |
||
| 291 | return $app->redirect($app->url('shopping')); |
||
| 292 | } |
||
| 293 | |||
| 294 | return $app->render('Shopping/shipping_multiple.twig', array( |
||
| 295 | 'form' => $form->createView(), |
||
| 296 | 'shipmentItems' => $ShipmentItemsForFormBuilder, |
||
| 297 | 'compItemQuantities' => $ItemQuantitiesByClassId, |
||
| 298 | 'errors' => $errors, |
||
| 299 | )); |
||
| 300 | } |
||
| 301 | |||
| 339 | } |