/**
 * Copyright (c) 2003-2004 System Integrator Corporation.
 *                 All Rights Reserved.
 */
package jp.co.sint.basic;

import java.sql.Connection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedHashMap;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import jp.co.sint.config.SIConfig;
import jp.co.sint.tools.SIFatalException;
import jp.co.sint.tools.SIHTMLUtil;
import jp.co.sint.tools.SIUtil;

import org.apache.log4j.Category;

/**
 * @version $Id : SICartManager.java,v 1.0 Exp $
 * @author      : Jinwang Chen
 * <br>Description :カートに全ての商品と数量を管理します。
 * <p>Author&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reason</p>
 * ============&nbsp;&nbsp;&nbsp;==========&nbsp;&nbsp;===========================<br>
 * Jinwang Chen   2003/07/05  Original
 */

public class SICartManager {
  //ログ用のインスタンスの生成
  private static Category log=Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);
  //商品セット、
  private LinkedHashMap carts=new LinkedHashMap();

  /**
   * <b>SICartManager</b>
   * コンストラクタ
   * @param  なし
   * @return なし
   * @throws なし
   */
  public SICartManager(){}

  /**
   * <b>SICartManager</b>
   * コンストラクタ
   * @param  cmdty  商品
   * @param  amount 商品数量
   * @return なし
   * @throws なし
   */
  public SICartManager(SICartCmdty lCartCmdty,String lAmount){
    SICart lCart=new SICart(lCartCmdty,lAmount);
    this.add(lCart);
  }

  /**
   * <b>SICartManager</b>
   * コンストラクタ
   * @param  cmdty  商品
   * @return なし
   * @throws なし
   */
  public SICartManager(SICart lCart){
    this.add(lCart);
  }

  /**
   * <b>add</b>
   * カートに新しい商品を入れます。
   * @param  cart  商品コードと商品数量を含む単一カート
   * @return なし
   * @throws なし
   */
  public void add(SICart lCart){
    log.debug("shopcode="+lCart.getCmdty().getShopCode()+",CmdtyCode="+lCart.getCmdty().getCmdtyCode());
    log.debug("stndrdcode1="+lCart.getCmdty().getStndrdCode1()+",stndrdcode2="+lCart.getCmdty().getStndrdCode2());
    log.debug("elementcode1="+lCart.getCmdty().getElementCode1()+",elementcode2="+lCart.getCmdty().getElementCode2());
    SICartCmdty cmdty=lCart.getCmdty();
    if (Integer.parseInt(lCart.getAmount())<1) {
      log.warn("add:amout is less than 1.shopCode="+cmdty.getShopCode()+",cmdtyCode="+cmdty.getCartCmdtyCode());
      return;
    }

    SICart existCart=new SICart();
    LinkedHashMap lCartCmdtyMap=new LinkedHashMap();
    lCartCmdtyMap=(LinkedHashMap)carts.get(cmdty.getShopCode());

    // EDBTG003-00 nagayoshi add start
    String lCartCmdtyMapKey = cmdty.getCartCmdtyCode()
                            + SIConfig.SIWEBSHOPPING_TOKEN + cmdty.getSetCode()
                            + SIConfig.SIWEBSHOPPING_TOKEN + cmdty.getSetDetailCode();
    // EDBTG003-00 nagayoshi add end
    // EDBTG003-00 nagayoshi mod start
    if (lCartCmdtyMap==null){
      lCartCmdtyMap=new LinkedHashMap();
      lCartCmdtyMap.put(lCartCmdtyMapKey,lCart);
    }else if (lCartCmdtyMap.containsKey(lCartCmdtyMapKey)){
      existCart=(SICart)lCartCmdtyMap.get(lCartCmdtyMapKey);
      existCart.setAmount(SIUtil.add_LL(existCart.getAmount(),lCart.getAmount()));
      lCartCmdtyMap.put(lCartCmdtyMapKey,existCart);
    }else{
      lCartCmdtyMap.put(lCartCmdtyMapKey,lCart);
    }
// EDBTG003-00 nagayoshi mod end
    carts.put(cmdty.getShopCode(),lCartCmdtyMap);
  }

  /**
   * <b>add</b>
   * カートに新しい商品を入れます。
   * @param  cmdty  商品
   * @param  amount 商品数量
   * @return なし
   * @throws なし
   */
  public void add(SICartCmdty lCartCmdty,String lAmount){
    SICart lCart=new SICart(lCartCmdty,lAmount);
    this.add(lCart);
  }

  /**
   * <b>update</b>
   * カートに既に存在する商品を更新します。
   * @param  cart  商品コードと商品数量を含む単一カート
   * @return なし
   * @throws なし
   */
  public void update(SICart lCart){
    SICartCmdty lCartCmdty=lCart.getCartCmdty();
    if (SIUtil.isNull(lCart.getAmount())||Integer.parseInt(lCart.getAmount())<1) {
      log.warn("update:amout is less than 1.it will be deleted!!!ShopCode="+lCartCmdty.getShopCode()+",cmdtyCode="+lCartCmdty.getCartCmdtyCode());
      delete(lCart);
      return;
    }

    //SICartCmdty cmdty=lCart.getCmdty();
    LinkedHashMap lCartCmdtyMap=(LinkedHashMap)carts.get(lCartCmdty.getShopCode());
    SICart existCart=new SICart();

    // EDBTG003-00 nagayoshi add start
    String lCartCmdtyMapKey = lCartCmdty.getCartCmdtyCode()
                            + SIConfig.SIWEBSHOPPING_TOKEN + lCartCmdty.getSetCode()
                            + SIConfig.SIWEBSHOPPING_TOKEN + lCartCmdty.getSetDetailCode();
    // EDBTG003-00 nagayoshi add end
    
    // EDBTG003-00 nagayoshi mod start
    if (lCartCmdtyMap==null){
      lCartCmdtyMap=new LinkedHashMap();
      lCartCmdtyMap.put(lCartCmdtyMapKey,lCart);
    }else if (lCartCmdtyMap.containsKey(lCartCmdtyMapKey)){
      existCart=(SICart)lCartCmdtyMap.get(lCartCmdtyMapKey);
      existCart.setAmount(lCart.getAmount());
    }else{
      lCartCmdtyMap.put(lCartCmdtyMapKey,lCart);
    }
    // EDBTG003-00 nagayoshi mod end
    carts.put(lCartCmdty.getShopCode(),lCartCmdtyMap);
  }

  /**
   * <b>update</b>
   * カートに既に存在する商品を更新します。
   * @param  cart  商品コードと商品数量を含む単一カート
   * @return なし
   * @throws なし
   */
  public void update(SICartCmdty lCartCmdty,String lAmount){
    SICart lCart=new SICart(lCartCmdty,lAmount);
    this.update(lCart);
  }

  public void delete(SICart lCart){
    SICartCmdty cmdty=lCart.getCmdty();
    LinkedHashMap lCartCmdtyMap=(LinkedHashMap)carts.get(cmdty.getShopCode());

    // EDBTG003-00 nagayoshi add start
    String lCartCmdtyMapKey = cmdty.getCartCmdtyCode()
                            + SIConfig.SIWEBSHOPPING_TOKEN + cmdty.getSetCode()
                            + SIConfig.SIWEBSHOPPING_TOKEN + cmdty.getSetDetailCode();
    // EDBTG003-00 nagayoshi add end
    
    // EDBTG003-00 nagayoshi mod start
    if (lCartCmdtyMap==null){
      return;
    }else if (lCartCmdtyMap.containsKey(lCartCmdtyMapKey)){
      lCartCmdtyMap.remove(lCartCmdtyMapKey);
      if (lCartCmdtyMap.isEmpty())carts.remove(cmdty.getShopCode());
      else carts.put(cmdty.getShopCode(),lCartCmdtyMap);
    }else{
      return;
    }
// EDBTG003-00 nagayoshi add end
  }

  public void delete(SICartCmdty lCartCmdty){
    SICart  lCart=new SICart(lCartCmdty,"0");
    this.delete(lCart);
  }

  /**
   * <b>getAmount</b>
   * カートに全ての商品の数量を合計します
   * @param  なし
   * @return 商品の数量
   * @throws なし
   */
  public String getAmount(){
    String amount="0";
    Iterator iterator =carts.values().iterator();
    Iterator cmdtyIterator;
    LinkedHashMap lCartCmdtyMap=new LinkedHashMap();
    SICart cart=new SICart();
    while (iterator.hasNext()){
      lCartCmdtyMap=(LinkedHashMap)iterator.next();
      cmdtyIterator=lCartCmdtyMap.values().iterator();
      while (cmdtyIterator.hasNext()){
        cart=(SICart)cmdtyIterator.next();
        amount=SIUtil.add_LL(amount,cart.getAmount());
      }
    }
    return amount;
  }

  /**
   * <b>getTotalOfPrice</b>
   * カートに全ての商品の数量*単価を計算して、合計金額を算出します
   * @param  なし
   * @return 合計金額
   * @throws なし
   */
  public String getTotalOfPrice(HttpServletRequest request){
    String lRes="0";
    Iterator iterator =carts.values().iterator();
    Iterator cmdtyIterator;
    LinkedHashMap lCartCmdtyMap=new LinkedHashMap();
    SICart cart=new SICart();

    while (iterator.hasNext()){
      lCartCmdtyMap=(LinkedHashMap)iterator.next();
      cmdtyIterator =lCartCmdtyMap.values().iterator();
      while (cmdtyIterator.hasNext()){
        cart=(SICart)cmdtyIterator.next();
        //会員値引率をセット
        SIUserInfo userLogin=SIHTMLUtil.getUserInfo(request);
        if(userLogin.isLogin(request)){
          cart.getCmdty().setMemberDiscountRate(userLogin.getDiscountRate());
        }
        // EDBTG003-00 nagayoshi add start
        if (cart.getCartCmdty().isCmdtyComposition()) {
          if(userLogin.isLogin(request)){
            cart.getCmdty().setMemberDiscountRate(userLogin.getDiscountRate());
          }
          LinkedHashMap workMap = cart.getCmdty().getCartsCmdtyCompositionDetailMap();
          /************** セット品単価算出 ここから **************/
          String setPrice = "0";
          String setDiscount = "0";
          setDiscount = cart.getCmdty().getSetDiscountPrice(cart.getCmdty().getSetDiscountPrice());
          Collection praiceColl = (Collection)workMap.get(cart.getCmdty().getCmdtyCompositionKeySet());
          Iterator ite = praiceColl.iterator();
          while (ite.hasNext()) {
            SICartCmdty cartCmdty = (SICartCmdty)ite.next();
            setPrice = SIUtil.add_LL(setPrice,
                                             SIUtil.multi_LL(cartCmdty.getSetCompositionCount()
                                                            ,cart.getCmdty().getFinalUnitPrice(cartCmdty.getCalcUnitPrice()
                                                            ,cartCmdty.getUnitPrice()
                                                            ,cartCmdty.getSalesUnitPrice()
                                                            ,cart.getCmdty().getSalesDiscountFlg()
                                                            ,cart.getCmdty().getMemberDiscountFlg()
                                                            ,cart.getCmdty().getDiscountFlg())));
          }
          setPrice = SIUtil.sub_LL(setPrice, setDiscount);
          /************** セット品単価算出 ここまで **************/
          lRes=SIUtil.add_LL(lRes,SIUtil.multi_LL(cart.getAmount(),setPrice));
        } else {
          // EDBTG003-00 nagayoshi add end
//          if(userLogin.isLogin()){
//            cart.getCmdty().setMemberDiscountRate(userLogin.getDiscountRate());
//          }
          lRes=SIUtil.add_LL(lRes,SIUtil.multi_LL(cart.getAmount(),cart.getCmdty().getFinalUnitPriceIncTax()));
          // EDBTG003-00 nagayoshi add start
        }
        // EDBTG003-00 nagayoshi add end
      }
    }
    return lRes;
  }

  /**
  * <b>SetMenberRate</b>
  * カートにある全ての商品に会員値引率を設定します。
  * @param  なし
  * @return 商品売価
  * @throws なし
  */
  public void SetMenberRate(HttpServletRequest request){
    Iterator iterator =carts.values().iterator();
    Iterator cmdtyIterator;
    LinkedHashMap lCartCmdtyMap=new LinkedHashMap();
    SICart cart=new SICart();
    while (iterator.hasNext()){
      lCartCmdtyMap=(LinkedHashMap)iterator.next();
      cmdtyIterator =lCartCmdtyMap.values().iterator();
      while (cmdtyIterator.hasNext()){
        cart=(SICart)cmdtyIterator.next();
        //会員値引率をセット
        SIUserInfo userLogin=SIHTMLUtil.getUserInfo(request);
        if(userLogin.isLogin(request)){
          cart.getCmdty().setMemberDiscountRate(userLogin.getDiscountRate());
        }
      }
    }
  }

  /**
   * <b>isEmpty</b>
   * カートが空であるか判定します
   * @param  なし
   * @return boolean(true:空、false:空ではない）
   * @throws なし
   */
  public boolean isEmpty(){
    if (carts==null) return true;
    if (carts.isEmpty()) return true;
    if (Integer.parseInt(getAmount())==0) return true;
    return false;
  }
  /**
   * <b>clear</b>
   * カート内にある特定ショップを除きます
   * @param  CasherShopCode　
   * @return なし
   * @throws なし
   */
  public void clear(String lCasherShopCode){
    if (SIUtil.isNull(lCasherShopCode))this.clear();

    Iterator lIta=carts.keySet().iterator();
    LinkedHashMap lCarts=new LinkedHashMap();
    LinkedHashMap lCartCmdtyMap=new LinkedHashMap();
    String lShopCode="";

    while (lIta.hasNext()){
      lShopCode=(String)lIta.next();
      if (lShopCode.equals(lCasherShopCode))continue;
      lCartCmdtyMap=(LinkedHashMap)carts.get(lShopCode);
      lCarts.put(lShopCode,lCartCmdtyMap);
    }
    this.carts=lCarts;
  }

  public void clear(){
    carts=new LinkedHashMap();
  }
  /**
   * <b>clear</b>
   * カート内にある特定ショップを除き、セッションから消去します。
   * @param  request
   * @param  CasherShopCode　
   * @return なし
   * @throws なし
   */
  public static void clear(HttpServletRequest lRequest,String lCasherShopCode){
    if (SIUtil.isNull(lCasherShopCode))SICartManager.clear(lRequest);

    HttpSession session=lRequest.getSession(true);//セッションの取得
    SICartManager lCartManager=(SICartManager)session.getAttribute(SIConfig.SISESSION_CART_INFO_NAME);
    lCartManager.clear(lCasherShopCode);

    session.setAttribute(SIConfig.SISESSION_CART_INFO_NAME,lCartManager);
    session.removeAttribute(SIConfig.SISESSION_CART_DELIVERY_NAME);
    session.removeAttribute(SIConfig.SISESSION_CART_DETAIL_NAME);
    // EDBTG003-00 nagayoshi add start
    session.removeAttribute(SIConfig.SISESSION_CART_SET_CMDTY_NAME);
    // EDBTG003-00 nagayoshi add end
    jp.co.sint.beans.front.UICasher.reset(lRequest);//7.1.1 ST0154 追加
  }
  /**
   * <b>clear</b>
   * カートのセッションを消去します
   * @param  request
   * @return なし
   * @throws なし
   */
  public static void clear(HttpServletRequest lRequest){
    HttpSession session=lRequest.getSession(true);//セッションの取得

    session.removeAttribute(SIConfig.SISESSION_CART_INFO_NAME);
    session.removeAttribute(SIConfig.SISESSION_CART_DELIVERY_NAME);
    session.removeAttribute(SIConfig.SISESSION_CART_DETAIL_NAME);
    // EDBTG003-00 nagayoshi add start
    session.removeAttribute(SIConfig.SISESSION_CART_SET_CMDTY_NAME);
    // EDBTG003-00 nagayoshi add end
    jp.co.sint.beans.front.UICasher.reset(lRequest);//7.1.1 ST0154 追加
  }

  //7.1.1 ST0154 追加 ここから
  /**
   * <b>clear</b>
   * カートのセッションを消去します
   * @param  request
   * @return なし
   * @throws なし
   */
  public static void clearCasher(HttpServletRequest lRequest){
    HttpSession session=lRequest.getSession(true);//セッションの取得

    session.removeAttribute(SIConfig.SISESSION_CART_DELIVERY_NAME);//配送先情報のクリア
    session.removeAttribute(SIConfig.SISESSION_CART_DETAIL_NAME);//配送先ごとに商品情報のクリア
    // EDBTG003-00 nagayoshi add start
    session.removeAttribute(SIConfig.SISESSION_CART_SET_CMDTY_NAME);
    // EDBTG003-00 nagayoshi add end
    jp.co.sint.beans.front.UICasher.reset(lRequest);//レジなどの情報のクリア
  }
  //7.1.1 ST0154 追加 ここまで

  public void dump(){
    Iterator iterator =carts.values().iterator();
    LinkedHashMap lCartCmdtyMap=new LinkedHashMap();
    Iterator cmdtyIterator;
    String lCartCmdtyCode="";
    SICart cart=new SICart();

    say("*****dump carts*****");
    while (iterator.hasNext()){
      lCartCmdtyMap=(LinkedHashMap)iterator.next();
      cmdtyIterator =lCartCmdtyMap.keySet().iterator();
      while (cmdtyIterator.hasNext()){
        lCartCmdtyCode=(String)cmdtyIterator.next();
        cart=(SICart)lCartCmdtyMap.get(lCartCmdtyCode);
        say("in carts:ShopCode:"+cart.getCmdty().getShopCode()+",CmdtyCode="+cart.getCmdty().getCartCmdtyCode()+",amount="+cart.getAmount());
      }
    }
  }

  /**
   * <b>getConnection</b>
   * カートに全ての商品リストを取得します
   * @param  なし
   * @return 商品リスト
   * @throws なし
   */
  public Collection getShopCollection(Connection lConnection,String lShopCode){
    Iterator iterator=carts.keySet().iterator();
    Collection lResColl=new ArrayList();
    SIMallShop lMallShop=new SIMallShop();
    log.debug("getShopCollection:lShopCode="+lShopCode);

    while (iterator.hasNext()){
      lMallShop=new SIMallShop((String)iterator.next());
      if (SIUtil.isNull(lShopCode)||lMallShop.getMallShopCode().equals(lShopCode)){
        lMallShop.reset(lConnection);
        lResColl.add(lMallShop);
      }
    }
    return lResColl;
  }

  public Collection getShopCollection(Connection lConnection){
    return getShopCollection(lConnection,null);
  }

  public Collection getCartCollection(String lShopCode){
    log.debug("getCartCollection:lShopCode="+lShopCode);
    if (carts==null) return null;
    else if (carts.containsKey(lShopCode)){
      return ((LinkedHashMap)carts.get(lShopCode)).values();
    }else return null;
  }

  public SICart getCart(SICartCmdty lCartCmdty){
    SICart lNullCart=new SICart();
    lNullCart.setAmount("0");

    // EDBTG003-00 nagayoshi add start
    String lCartCmdtyMapKey = lCartCmdty.getCartCmdtyCode()
                            + SIConfig.SIWEBSHOPPING_TOKEN + lCartCmdty.getSetCode()
                            + SIConfig.SIWEBSHOPPING_TOKEN + lCartCmdty.getSetDetailCode();
    // EDBTG003-00 nagayoshi add end
    
    // EDBTG003-00 nagayoshi mod start
    if (carts==null) return lNullCart;
    else if (carts.containsKey(lCartCmdty.getShopCode())){
      LinkedHashMap lCartMap=(LinkedHashMap)carts.get(lCartCmdty.getShopCode());
      if (lCartMap.containsKey(lCartCmdtyMapKey)) return (SICart)lCartMap.get(lCartCmdtyMapKey);
      else return lNullCart;
    }else return lNullCart;
    // EDBTG003-00 nagayoshi mod end
  }

  public SICart getCart(String lShopCode,String lCartCmdtyCode){
    return getCart(new SICartCmdty(lShopCode,lCartCmdtyCode,"","","",""));
  }

  public SICart getCart(String lShopCode,String lCartCmdtyCode,String lStndrdCode1,String lStndrdCode2,String lElementCode1,String lElementCode2){
    return getCart(new SICartCmdty(lShopCode,lCartCmdtyCode,lStndrdCode1,lStndrdCode2,lElementCode1,lElementCode2));
  }

// EDBTG003-00 nagayoshi del start
//  public void adjustAmount(HttpServletRequest lRequest,Connection lConnection){
//    HttpSession session=lRequest.getSession(true);//セッションの取得
//
//    LinkedHashMap detailMap=(LinkedHashMap)session.getAttribute(SIConfig.SISESSION_CART_DETAIL_NAME);
//    Iterator lDetailIta=detailMap.keySet().iterator();
//    SIOrderDetail lOrderDetail=new SIOrderDetail();
//    String lOrderDetailCode="";
//    SICartCmdty lCartCmdty=new SICartCmdty();
//
//    this.clear();
//    while (lDetailIta.hasNext()){
//      lOrderDetailCode=(String)lDetailIta.next();
//      lOrderDetail=(SIOrderDetail)detailMap.get(lOrderDetailCode);
//      lCartCmdty=new SICartCmdty(lOrderDetail.getShopCode(),
//                             lOrderDetail.getCmdtyCode(),
//                             lOrderDetail.getIndividualCode(),
//                             lOrderDetail.getStndrdCode1(),
//                             lOrderDetail.getElementCode1(),
//                             lOrderDetail.getStndrdCode2(),
//                             lOrderDetail.getElementCode2());
//      lCartCmdty.reset(lConnection);
//      this.add(lCartCmdty,lOrderDetail.getAmount());
//      log.debug("adjustAmount:lOrderDetailCode="+lOrderDetailCode+",amount="+lOrderDetail.getAmount());
//    }
//  }
// EDBTG003-00 nagayoshi del end
// EDBTG003-00 elecs-matsushima add start
  public void adjustAmount(HttpServletRequest lRequest,Connection lConnection){
    adjustAmount(lRequest, lConnection, false);
  }
  
  public void adjustAmount(HttpServletRequest lRequest,Connection lConnection, boolean setDiscountFlg){
    
    HttpSession session=lRequest.getSession(true);//セッションの取得
    LinkedHashMap detailMap=(LinkedHashMap)session.getAttribute(SIConfig.SISESSION_CART_DETAIL_NAME);
    LinkedHashMap setCmdtyMap = (LinkedHashMap)session.getAttribute(SIConfig.SISESSION_CART_SET_CMDTY_NAME);
    if(setCmdtyMap==null){
      setCmdtyMap= new LinkedHashMap();
    }
    // EDBTG003-00 [不具合管理票-No42] 2013/03/26 nagayoshi add start
    LinkedHashMap modSetCmdtyMap = new LinkedHashMap();
    // EDBTG003-00 [不具合管理票-No42] 2013/03/26 nagayoshi add end

    Iterator lDetailIta=detailMap.keySet().iterator();
    SIOrderDetail lOrderDetail=new SIOrderDetail();
    String lOrderDetailCode="";
    SICartCmdty lCartCmdty=new SICartCmdty();

    LinkedHashMap setMap = new LinkedHashMap(); // セットまとめMAP

    this.clear();
    while (lDetailIta.hasNext()){
      lOrderDetailCode=(String)lDetailIta.next();
      lOrderDetail=(SIOrderDetail)detailMap.get(lOrderDetailCode);

      if (lOrderDetail.getSetDetailFlg().equals(SIConfig.SET_DETAIL_FLG_NORMAL)) { // 通常品
        lCartCmdty=new SICartCmdty(lOrderDetail.getShopCode(),
                                   lOrderDetail.getCmdtyCode(),
                                   lOrderDetail.getIndividualCode(),
                                   lOrderDetail.getStndrdCode1(),
                                   lOrderDetail.getElementCode1(),
                                   lOrderDetail.getStndrdCode2(),
                                   lOrderDetail.getElementCode2());

        lCartCmdty.reset(lConnection);
        lCartCmdty.setSetCode(lOrderDetail.getSetCode());
        lCartCmdty.setSetDetailFlg(lOrderDetail.getSetDetailFlg());
        lCartCmdty.setSetDetailCode(lOrderDetail.getSetDetailCode());
        lCartCmdty.setDetailCode(lOrderDetail.getOrderDetailCode());
        lCartCmdty.setOldSetCode(lOrderDetail.getOldSetCode());
        lCartCmdty.setAllocationMap(lOrderDetail.getAllocationMap()); // EDBTG003-00 elecs-matsushima add
        this.add(lCartCmdty,lOrderDetail.getAmount());
        log.debug("adjustAmount:lOrderDetailCode="+lOrderDetailCode+",amount="+lOrderDetail.getAmount());
      } else {
        String setMapKey = lOrderDetail.getShopCode() + "~"
                           + lOrderDetail.getSetCode() + "~"
                           + lOrderDetail.getSetCmdtyCode() + "~"
                           + lOrderDetail.getSetIndividualCode();

        LinkedHashMap cmdtyCompositionMap = (LinkedHashMap) setMap.get(setMapKey);
        if (cmdtyCompositionMap == null) cmdtyCompositionMap = new LinkedHashMap();

        if (lOrderDetail.getSetDetailFlg().equals(SIConfig.SET_DETAIL_FLG_COMPOSITION)) {
          Collection groupCol = (Collection) cmdtyCompositionMap.get("group");
          if (groupCol == null) groupCol = new ArrayList();
          groupCol.add(lOrderDetail);
          cmdtyCompositionMap.put("group", groupCol);
        } else if (lOrderDetail.getSetDetailFlg().equals(SIConfig.SET_DETAIL_FLG_OPTION)) {
          Collection optionCol = (Collection) cmdtyCompositionMap.get("option");
          if (optionCol == null) optionCol = new ArrayList();
          optionCol.add(lOrderDetail);
          cmdtyCompositionMap.put("option", optionCol);
        } else if (lOrderDetail.getSetDetailFlg().equals(SIConfig.SET_DETAIL_FLG_APPENDED)) {
          Collection appendedCol = (Collection) cmdtyCompositionMap.get("appended");
          if (appendedCol == null) appendedCol = new ArrayList();
          appendedCol.add(lOrderDetail);
          cmdtyCompositionMap.put("appended", appendedCol);
        }
        setMap.put(setMapKey, cmdtyCompositionMap);
      }
    }
    
    /***** 構成商品が存在している場合 ここから ***/
    /***** mapKeyを設定 ここから ***/
    // 構成商品は構成商品を作成して登録
    for (Iterator iteSetMap = setMap.keySet().iterator(); iteSetMap.hasNext(); ){
      String iteSetMapKey = (String) iteSetMap.next();
      LinkedHashMap cmdtyCompositionMap = (LinkedHashMap) setMap.get(iteSetMapKey);

      Collection groupCol = (Collection) cmdtyCompositionMap.get("group");
      if (groupCol == null) groupCol = new ArrayList();
      Collection optionCol = (Collection) cmdtyCompositionMap.get("option");
      Collection appendedCol = (Collection) cmdtyCompositionMap.get("appended");

      String[] setMapKeys = iteSetMapKey.split("~");
      SICartCmdty lCartSetCmdty=new SICartCmdty();

      // セット品の最新情報を取得
      lCartSetCmdty=new SICartCmdty(setMapKeys[0],
                                    setMapKeys[2],
                                    setMapKeys[3],
                                    "", "", "", "");
      lCartSetCmdty.reset(lConnection);

      // セットコード
      lCartSetCmdty.setSetCode(setMapKeys[1]);

      ////セット値引金額を設定
      //lCartSetCmdty.setSetDiscountPrice(lCartSetCmdty.getSetDiscount(lConnection));

      // セット構成情報取得Keyを設定
      // カート投入した構成品・オプション・添付品にてKey値を作成
      StringBuffer keySet = new StringBuffer();
      String sep = "~";
      keySet.append(lCartSetCmdty.getShopCode());
      keySet.append(sep);
      keySet.append(lCartSetCmdty.getCmdtyCode());
      keySet.append(sep);
      keySet.append(lCartSetCmdty.getIndividualCode());
      // 構成品のカート投入
      Iterator detailIte = groupCol.iterator();
      while(detailIte.hasNext()) {
        lOrderDetail = (SIOrderDetail) detailIte.next();
        keySet.append(sep);
        keySet.append(lOrderDetail.getIndividualCode());
      }
      // オプションのカート投入
      if (optionCol != null) {
        for (Iterator iteOptionCol = optionCol.iterator(); iteOptionCol.hasNext(); ){
          lOrderDetail = (SIOrderDetail) iteOptionCol.next();
          keySet.append(sep);
          keySet.append(lOrderDetail.getIndividualCode());
        }
      }
      // 添付品のカート投入
      if (appendedCol != null) {
        for (Iterator iteAppendedCol = appendedCol.iterator(); iteAppendedCol.hasNext(); ){
          lOrderDetail = (SIOrderDetail) iteAppendedCol.next();
          keySet.append(sep);
          keySet.append(lOrderDetail.getIndividualCode());
        }
      }
      lCartSetCmdty.setCmdtyCompositionKeySet(keySet.toString());
      /***** mapKeyを設定 ここまで ***/

      /***** 親情報を取得 ここから ***/
      String setCmdtyKey = lCartSetCmdty.getSetCode() + SIConfig.SIWEBSHOPPING_TOKEN
                            + lCartSetCmdty.getCmdtyCode() + SIConfig.SIWEBSHOPPING_TOKEN
                            + lCartSetCmdty.getIndividualCode();

      SIOrderSetCmdty orderSetCmdty = (SIOrderSetCmdty) setCmdtyMap.get(setCmdtyKey);

      if (setDiscountFlg){
        lCartSetCmdty.setSetDiscountPrice(lCartSetCmdty.getSetDiscount(lConnection));
      } else {
        lCartSetCmdty.setSetDiscountPrice(orderSetCmdty.getSetDiscount());
      }

      lCartSetCmdty.setAmount(orderSetCmdty.getSetAmount());
      // EDBTG003-00 [不具合管理票-No42] 2013/03/26 nagayoshi add start
      if (setCmdtyMap.containsKey(setCmdtyKey)) {
        modSetCmdtyMap.put(setCmdtyKey, orderSetCmdty);
      }
      // EDBTG003-00 [不具合管理票-No42] 2013/03/26 nagayoshi add end
      /***** 親情報を取得 ここまで ***/

      /***** 構成品マップを作成 ここから ***/
      LinkedHashMap cmdtyCompositionCartMap = new LinkedHashMap();

      Collection composition = new ArrayList();
      int setDetailCount = 1;        // 明細番号項番
      for(Iterator iteGroupColIterator = groupCol.iterator(); iteGroupColIterator.hasNext();){
        lOrderDetail = (SIOrderDetail) iteGroupColIterator.next();
        SICartCmdty cartCmdtyCompositionInfo = new SICartCmdty();

        // 構成品情報1件分の取得
        cartCmdtyCompositionInfo.setShopCode(lOrderDetail.getShopCode());
        cartCmdtyCompositionInfo.setCmdtyCode(lOrderDetail.getCmdtyCode());
        cartCmdtyCompositionInfo.setIndividualCode(lOrderDetail.getIndividualCode());
        if (cartCmdtyCompositionInfo.reset(lConnection, false, "")){
          // 明細区分設定
          cartCmdtyCompositionInfo.setSetDetailFlg(SIConfig.SET_DETAIL_FLG_COMPOSITION);
          // 明細番号設定
          cartCmdtyCompositionInfo.setSetDetailCode(String.valueOf(setDetailCount));
          // 構成数
          String cmdtyAmount = "1";
          try {
            cmdtyAmount = SIUtil.div(lOrderDetail.getAmount(), orderSetCmdty.getSetAmount());
          } catch (SIFatalException e) {
            e.printStackTrace();
          }
          cartCmdtyCompositionInfo.setSetCompositionCount(cmdtyAmount);
          // 特価値引フラグ
          cartCmdtyCompositionInfo.setSalesDiscountFlg(lCartSetCmdty.getSalesDiscountFlg());
          // 会員値引フラグ
          cartCmdtyCompositionInfo.setMemberDiscountFlg(lCartSetCmdty.getMemberDiscountFlg());
          // 一括値引フラグ
          cartCmdtyCompositionInfo.setDiscountFlg(lCartSetCmdty.getDiscountFlg());

          cartCmdtyCompositionInfo.setSetCode(lOrderDetail.getSetCode());
          cartCmdtyCompositionInfo.setSetCmdtyCode(lCartSetCmdty.getCmdtyCode());
          cartCmdtyCompositionInfo.setSetIndividualCode(lCartSetCmdty.getIndividualCode());
          cartCmdtyCompositionInfo.setDetailCode(lOrderDetail.getOrderDetailCode());
          cartCmdtyCompositionInfo.setOldSetCode(lOrderDetail.getOldSetCode());
          cartCmdtyCompositionInfo.setAllocationMap(lOrderDetail.getAllocationMap()); // EDBTG003-00 elecs-matsushima add

          // 明細番号カウントアップ
          setDetailCount++;
          // セット
          composition.add(cartCmdtyCompositionInfo);
        }
      }
      // オプションデータの取得
      if (optionCol != null) {
        for (Iterator iteOptionCol=optionCol.iterator();iteOptionCol.hasNext();){
          lOrderDetail = (SIOrderDetail) iteOptionCol.next();
          SICartCmdty cartOptionCompositionInfo = new SICartCmdty();

          // 構成品情報1件分の取得
          cartOptionCompositionInfo.setShopCode(lOrderDetail.getShopCode());
          cartOptionCompositionInfo.setCmdtyCode(lOrderDetail.getCmdtyCode());
          cartOptionCompositionInfo.setIndividualCode(lOrderDetail.getIndividualCode());
          if (cartOptionCompositionInfo.reset(lConnection, false, "")){
            // 明細区分設定
            cartOptionCompositionInfo.setSetDetailFlg(SIConfig.SET_DETAIL_FLG_OPTION);
            // 明細番号設定
            cartOptionCompositionInfo.setSetDetailCode(String.valueOf(setDetailCount));
            // 構成数
            String cmdtyAmount = "1";
            try {
              cmdtyAmount = SIUtil.div(lOrderDetail.getAmount(), orderSetCmdty.getSetAmount());
            } catch (SIFatalException e) {
              e.printStackTrace();
            }
            cartOptionCompositionInfo.setSetCompositionCount(cmdtyAmount);
            // 特価値引フラグ
            cartOptionCompositionInfo.setSalesDiscountFlg(lCartSetCmdty.getSalesDiscountFlg());
            // 会員値引フラグ
            cartOptionCompositionInfo.setMemberDiscountFlg(lCartSetCmdty.getMemberDiscountFlg());
            // 一括値引フラグ
            cartOptionCompositionInfo.setDiscountFlg(lCartSetCmdty.getDiscountFlg());

            cartOptionCompositionInfo.setSetCode(lOrderDetail.getSetCode());
            cartOptionCompositionInfo.setSetCmdtyCode(lCartSetCmdty.getCmdtyCode());
            cartOptionCompositionInfo.setSetIndividualCode(lCartSetCmdty.getIndividualCode());
            cartOptionCompositionInfo.setDetailCode(lOrderDetail.getOrderDetailCode());
            cartOptionCompositionInfo.setOldSetCode(lOrderDetail.getOldSetCode());
            cartOptionCompositionInfo.setAllocationMap(lOrderDetail.getAllocationMap());// EDBTG003-00 elecs-matsushima add
            // 明細番号カウントアップ
            setDetailCount++;
            // セット
            composition.add(cartOptionCompositionInfo);
          }
        }
      }
      // 添付品の取得
      if (appendedCol != null) {
        for (Iterator iteAppendedCol=appendedCol.iterator();iteAppendedCol.hasNext();){
          lOrderDetail = (SIOrderDetail) iteAppendedCol.next();
          SICartCmdty cartAppendedCompositionInfo = new SICartCmdty();

          // 構成品情報1件分の取得
          cartAppendedCompositionInfo.setShopCode(lOrderDetail.getShopCode());
          cartAppendedCompositionInfo.setCmdtyCode(lOrderDetail.getCmdtyCode());
          cartAppendedCompositionInfo.setIndividualCode(lOrderDetail.getIndividualCode());
          if (cartAppendedCompositionInfo.reset(lConnection, false, "")){
            // 明細区分設定
            cartAppendedCompositionInfo.setSetDetailFlg(SIConfig.SET_DETAIL_FLG_APPENDED);
            // 明細番号設定
            cartAppendedCompositionInfo.setSetDetailCode(String.valueOf(setDetailCount));
            // 構成数
            cartAppendedCompositionInfo.setSetCompositionCount("1"); // ダミー
            // セット数(xセット毎の値)
            cartAppendedCompositionInfo.setSetCount("1"); // ダミー
            // 添付品については、固定で単価0円とする
            cartAppendedCompositionInfo.setUnitPrice("0");
            cartAppendedCompositionInfo.setSalesUnitPrice("0");
            cartAppendedCompositionInfo.setCalcUnitPrice("0");
            cartAppendedCompositionInfo.setDiscountRate("0");
            cartAppendedCompositionInfo.setConsignGoodsFee("0");

            cartAppendedCompositionInfo.setSetCode(lOrderDetail.getSetCode());
            cartAppendedCompositionInfo.setSetCmdtyCode(lCartSetCmdty.getCmdtyCode());
            cartAppendedCompositionInfo.setSetIndividualCode(lCartSetCmdty.getIndividualCode());
            cartAppendedCompositionInfo.setDetailCode(lOrderDetail.getOrderDetailCode());
            cartAppendedCompositionInfo.setOldSetCode(lOrderDetail.getOldSetCode());
            cartAppendedCompositionInfo.setAllocationMap(lOrderDetail.getAllocationMap());// EDBTG003-00 elecs-matsushima add

            // 明細番号カウントアップ
            setDetailCount++;
            // セット
            composition.add(cartAppendedCompositionInfo);
          }
        }
      }

      // 構成情報をMapへ保存
      cmdtyCompositionCartMap.put(lCartSetCmdty.getCmdtyCompositionKeySet(), composition);
      // カート構成品情報を設定
      lCartSetCmdty.setCartsCmdtyCompositionDetailMap(cmdtyCompositionCartMap);
      this.add(lCartSetCmdty,lCartSetCmdty.getAmount());
      log.debug("adjustAmount:setCmdtyKey="+setCmdtyKey+",amount="+lCartSetCmdty.getAmount());
    }
    // EDBTG003-00 [不具合管理票-No42] 2013/03/26 nagayoshi add start
    // セット品情報再設定
    session.setAttribute(SIConfig.SISESSION_CART_SET_CMDTY_NAME, modSetCmdtyMap);
    // EDBTG003-00 [不具合管理票-No42] 2013/03/26 nagayoshi add end
  }
//EDBTG003-00 elecs-matsushima add end
  //テスト
  private static void say(String msg){
    System.out.println(msg);
  }

  private static void dump(SICartCmdty cmdty){
    say("*****Cmdty Detail*****");
    say("shopCode="+cmdty.getShopCode()+",cmdtyCode="+cmdty.getCartCmdtyCode()+",cmdtyName="+cmdty.getCmdtyName()+",price="+cmdty.getUnitPriceAftDisIncTax()+",MemberDiscountRate="+cmdty.getMemberDiscountRate());
  }

  private static void dump(SICart lCart){
    SICartCmdty lCartCmdty=lCart.getCartCmdty();
    say("*****Cart Detail["+lCart.getAmount()+"]*****");
    say("shopCode="+lCartCmdty.getShopCode()+",cmdtyCode="+lCartCmdty.getCartCmdtyCode()+",cmdtyName="+lCartCmdty.getCmdtyName()+",price="+lCartCmdty.getUnitPriceAftDisIncTax()+",MemberDiscountRate="+lCartCmdty.getMemberDiscountRate());
  }
  
  public boolean hasDeliveryType(HttpServletRequest request,String deliveryTypeCode) {
    boolean res = false;
    if (carts!=null && carts.containsKey("0")){
      Collection lCartCmdtyMap = ((LinkedHashMap)carts.get("0")).values();
      Iterator lCartIte = lCartCmdtyMap.iterator();
      while (lCartIte.hasNext()) {
        SICart cartData = (SICart) lCartIte.next();
        Iterator lDetailIte = SICartDetail.getDetailCollection(request,cartData.getCartCmdty()).iterator();
        while (lDetailIte.hasNext()) {
          SIOrderDetail detail = (SIOrderDetail)lDetailIte.next();
          res = detail.getDeliveryTypeCode().equals(deliveryTypeCode);
          if (res) break;
        }
        if (res) break;
      }
    }
    return res;
  }
}
