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

import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Iterator;

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

import jp.co.sint.config.SIConfig;
import jp.co.sint.database.SIDBAccessException;
import jp.co.sint.database.SIDuplicateKeyException;
import jp.co.sint.database.SIModifyRec;
import jp.co.sint.database.SIInsertRec;
import jp.co.sint.tools.SICheckUtil;
import jp.co.sint.tools.SICustomError;
import jp.co.sint.tools.SICustomErrors;
import jp.co.sint.tools.SIHTMLUtil;
import jp.co.sint.tools.SIStringUtil;
import jp.co.sint.tools.SIUtil;

import org.apache.log4j.Category;

/**
 * @version $Id: SIReserveCartManager.java,v 1.0 2004/02/02 Exp $
 * @author  Jinwang Chen
 * <br>Description: 予約商品の共通管理クラス
 * <p>History</p>
 * <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   2004/02/02 21:07:26  Original
 */
public class SIReserveCartManager {
  //ログ用のインスタンスの生成
  private static Category log=Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);
  //商品セット、
  private HashMap reserveCarts=new HashMap();
  //予約番号
  private HashMap reserveCodes=new HashMap();
  //使った予約商品数量
  private HashMap usedReserveCarts=new HashMap();

  public SIReserveCartManager(){
  }

  /**
   * <b>getReserveCart</b>
   * カートに予約商品情報の取得
   * @param なし
   * @return 予約商品情報
   * @throws なし
   */
  public HashMap getReserveCart(){
    return this.reserveCarts;
  }

  /**
   * <b>getReserveCodes</b>
   * カートに予約商品コードリストの取得
   * @param なし
   * @return 予約商品コードリスト
   * @throws なし
   */
  public HashMap getReserveCodes(){
    return this.reserveCodes;
  }

  /**
   * <b>add</b>
   * 予約カートに予約商品を追加
   * @param lReserveCode　予約コード
   * @param lShopCode ショップコード
   * @param lCmdtyCode 商品コード
   * @param lStndrdCode1 規格コード1
   * @param lElementCode1 エレメントコード1
   * @param lStndrdCode2 規格コード2
   * @param lElementCode2 エレメントコード2
   * @param lAmount 予約商品数量
   * @return なし
   * @throws なし
   */
  public void add(String lReserveCode,String lShopCode,String lCmdtyCode,String lStndrdCode1,String lElementCode1,String lStndrdCode2,String lElementCode2,String lAmount){
    SIReserveOrder lReserveOrder=new SIReserveOrder();
    lReserveOrder.setEncode(SIConfig.SIENCODE_NONE);
    lReserveOrder.setReserveCode(lReserveCode);
    lReserveOrder.setShopCode(lShopCode);
    lReserveOrder.setCmdtyCode(lCmdtyCode);
    lReserveOrder.setStndrdCode1(lStndrdCode1);
    lReserveOrder.setElementCode1(lElementCode1);
    lReserveOrder.setStndrdCode2(lStndrdCode2);
    lReserveOrder.setElementCode2(lElementCode2);
    lReserveOrder.setAmount(lAmount);
    add(lReserveOrder);
  }

  //7.3.0 PI-NES0501 追加 ここから
  /**
   * <b>add</b>
   * 予約カートに予約商品を追加
   * @param lReserveCode　予約コード
   * @param lShopCode ショップコード
   * @param lCmdtyCode 商品コード
   * @param lIndividualCode 在庫コード
   * @param lStndrdCode1 規格コード1
   * @param lElementCode1 エレメントコード1
   * @param lStndrdCode2 規格コード2
   * @param lElementCode2 エレメントコード2
   * @param lAmount 予約商品数量
   * @return なし
   * @throws なし
   */
  public void add(String lReserveCode,String lShopCode,String lCmdtyCode,String lIndividualCode,String lStndrdCode1,String lElementCode1,String lStndrdCode2,String lElementCode2,String lAmount){
    SIReserveOrder lReserveOrder=new SIReserveOrder();
    lReserveOrder.setEncode(SIConfig.SIENCODE_NONE);
    lReserveOrder.setReserveCode(lReserveCode);
    lReserveOrder.setShopCode(lShopCode);
    lReserveOrder.setCmdtyCode(lCmdtyCode);
    lReserveOrder.setIndividualCode(lIndividualCode);
    lReserveOrder.setStndrdCode1(lStndrdCode1);
    lReserveOrder.setElementCode1(lElementCode1);
    lReserveOrder.setStndrdCode2(lStndrdCode2);
    lReserveOrder.setElementCode2(lElementCode2);
    lReserveOrder.setAmount(lAmount);
    add(lReserveOrder);
  }
  //7.3.0 PI-NES0501 追加 ここまで
  
  /**
   * <b>add</b>
   * 予約カートに予約商品を追加
   * @param lReserveOrder　予約商品情報
   * @return なし
   * @throws なし
   */
  public void add(SIReserveOrder lReserveOrder){
    log.debug("lReserveCode="+lReserveOrder.getReserveCode()+
              ",lShopCode="+lReserveOrder.getShopCode()+
              ",lCmdtyCode="+lReserveOrder.getCmdtyCode()+
              ",lIndividualCode="+lReserveOrder.getIndividualCode()+//7.3.0 PI-NES0501 追加
              ",lStndrdCode1="+lReserveOrder.getStndrdCode1()+
              ",lElementCode1="+lReserveOrder.getElementCode1()+
              ",lStndrdCode2="+lReserveOrder.getStndrdCode2()+
              ",lElementCode2="+lReserveOrder.getElementCode2()+
              ",lAmount="+lReserveOrder.getAmount());

    if (reserveCarts==null)reserveCarts=new HashMap();
    reserveCodes.put(lReserveOrder.getReserveCode(),null);
    if ((String)reserveCarts.get(getName(lReserveOrder))==null){
      reserveCarts.put(getName(lReserveOrder),lReserveOrder.getAmount());
    }else {
      String lExistAmount=(String)reserveCarts.get(getName(lReserveOrder));
      if (SIUtil.isNull(lExistAmount)) lExistAmount="0";
      reserveCarts.put(getName(lReserveOrder),SIUtil.add_LL(lReserveOrder.getAmount(),lExistAmount));
    }
  }

  /**
   * <b>addUsed</b>
   * 受注更新するとき、予約商品の数量まで、商品マスタに数量を更新しない
   * @param lShopCode ショップコード
   * @param lCmdtyCode 商品コード
   * @param lStndrdCode1 規格コード1
   * @param lElementCode1 エレメントコード1
   * @param lStndrdCode2 規格コード2
   * @param lElementCode2 エレメントコード2
   * @param lAmount 予約商品数量
   * @return なし
   * @throws なし
   */
  public String addUsed(String lShopCode,String lCmdtyCode,String lStndrdCode1,String lElementCode1,String lStndrdCode2,String lElementCode2,String lAmount){
    SIReserveOrder lReserveOrder=new SIReserveOrder();
    lReserveOrder.setEncode(SIConfig.SIENCODE_NONE);
    lReserveOrder.setShopCode(lShopCode);
    lReserveOrder.setCmdtyCode(lCmdtyCode);
    lReserveOrder.setStndrdCode1(lStndrdCode1);
    lReserveOrder.setElementCode1(lElementCode1);
    lReserveOrder.setStndrdCode2(lStndrdCode2);
    lReserveOrder.setElementCode2(lElementCode2);
    lReserveOrder.setAmount(lAmount);

    return addUsed(lReserveOrder);
  }

  //7.3.0 PI-NES0501 追加 ここから
  /**
   * <b>addUsed</b>
   * 受注更新するとき、予約商品の数量まで、商品マスタに数量を更新しない
   * @param lShopCode ショップコード
   * @param lCmdtyCode 商品コード
   * @param lIndividualCode 在庫コード
   * @param lStndrdCode1 規格コード1
   * @param lElementCode1 エレメントコード1
   * @param lStndrdCode2 規格コード2
   * @param lElementCode2 エレメントコード2
   * @param lAmount 予約商品数量
   * @return なし
   * @throws なし
   */
  public String addUsed(String lShopCode,String lCmdtyCode,String lIndividualCode,String lStndrdCode1,String lElementCode1,String lStndrdCode2,String lElementCode2,String lAmount){
    SIReserveOrder lReserveOrder=new SIReserveOrder();
    lReserveOrder.setEncode(SIConfig.SIENCODE_NONE);
    lReserveOrder.setShopCode(lShopCode);
    lReserveOrder.setCmdtyCode(lCmdtyCode);
    lReserveOrder.setIndividualCode(lIndividualCode);
    lReserveOrder.setStndrdCode1(lStndrdCode1);
    lReserveOrder.setElementCode1(lElementCode1);
    lReserveOrder.setStndrdCode2(lStndrdCode2);
    lReserveOrder.setElementCode2(lElementCode2);
    lReserveOrder.setAmount(lAmount);

    return addUsed(lReserveOrder);
  }
  //7.3.0 PI-NES0501 追加 ここまで

  /**
   * <b>addUsed</b>
   * 受注更新するとき、予約商品の数量まで、商品マスタに数量を更新しない
   * @param lReserveOrder 予約商品の情報
   * @return なし
   * @throws なし
   */
  public String addUsed(SIReserveOrder lReserveOrder){
    log.debug("addUsed:ShopCode="+lReserveOrder.getShopCode()+
              ",CmdtyCode="+lReserveOrder.getCmdtyCode()+
              ",IndividualCode="+lReserveOrder.getIndividualCode()+//7.3.0 PI-NES0501 追加
              ",stndrdCode1="+lReserveOrder.getStndrdCode1()+
              ",elementCode1="+lReserveOrder.getElementCode1()+
              ",stndrdCode2="+lReserveOrder.getStndrdCode2()+
              ",elementCode2="+lReserveOrder.getElementCode2()+",lAmount="+lReserveOrder.getAmount());
    if (!hasReserve(lReserveOrder)) return lReserveOrder.getAmount();
    if (reserveCarts==null)return lReserveOrder.getAmount();

    if ((String)reserveCarts.get(getName(lReserveOrder))==null){
      return lReserveOrder.getAmount();
    }else {
      String lResult="0";
      String lLeftAmount=getLeftReserve(lReserveOrder);
      String lExistAmount=(String)usedReserveCarts.get(getName(lReserveOrder));
      if (SIUtil.isNull(lExistAmount)) lExistAmount="0";
      log.debug("addUsed:lLeftAmount="+lLeftAmount+",lExistAmount="+lExistAmount);
      if (Integer.parseInt(lLeftAmount)>=Integer.parseInt(lReserveOrder.getAmount())){
        usedReserveCarts.put(getName(lReserveOrder),SIUtil.add_LL(lReserveOrder.getAmount(),lExistAmount));
        return lResult;
      }else{
        usedReserveCarts.put(getName(lReserveOrder),SIUtil.add_LL(lLeftAmount,lExistAmount));
        lResult=SIUtil.sub_LL(lReserveOrder.getAmount(),lLeftAmount);
      }
      return lResult;
    }
  }

  /**
   * <b>getLeftReserve</b>
   * 商品マスタの更新まで、残り予約商品数の計算
   * @param lReserveOrder 予約商品の情報
   * @return なし
   * @throws なし
   */
  public String getLeftReserve(SIReserveOrder lReserveOrder){
    String lAmount=getAmount(lReserveOrder);
    String lUsedAmount=getUsedAmount(lReserveOrder);
    return SIUtil.sub_LL(lAmount,lUsedAmount);
  }

  /**
   * <b>hasReserve</b>
   * 残り予約商品があるかどうか
   * @param lReserveOrder 予約商品の情報
   * @return なし
   * @throws なし
   */
  public boolean hasReserve(SIReserveOrder lReserveOrder){
    if (Integer.parseInt(getLeftReserve(lReserveOrder))>0) return true;
    else return false;
  }

  /**
   * <b>getName</b>
   * 予約商品カートに使われる予約PKの生成
   * @param lReserveOrder 予約商品の情報
   * @return 予約PK
   * @throws なし
   */
  private static String getName(SIReserveOrder lReserveOrder){
    return lReserveOrder.getShopCode()+SIConfig.SIWEBSHOPPING_TOKEN+
    lReserveOrder.getCmdtyCode()+SIConfig.SIWEBSHOPPING_TOKEN+
    lReserveOrder.getIndividualCode()+SIConfig.SIWEBSHOPPING_TOKEN+//7.3.0 PI-NES0501 追加
    lReserveOrder.getStndrdCode1()+SIConfig.SIWEBSHOPPING_TOKEN+
    lReserveOrder.getElementCode1()+SIConfig.SIWEBSHOPPING_TOKEN+
    lReserveOrder.getStndrdCode2()+SIConfig.SIWEBSHOPPING_TOKEN+
    lReserveOrder.getElementCode2();
  }

  /**
   * <b>getAmount</b>
   * 使用される予約商品の数量の計算
   * @param lReserveOrder 予約商品の情報
   * @return 使用される予約商品の数量
   * @throws なし
   */
  public String getAmount(SIReserveOrder lReserveOrder){
    return getAmount(getName(lReserveOrder));
  }

  /**
   * <b>getAmount</b>
   * 使用される予約商品の数量の計算
   * @param lShopCode ショップコード
   * @param lCmdtyCode 商品コード
   * @param lStndrdCode1 規格コード1
   * @param lElementCode1 エレメントコード1
   * @param lStndrdCode2 規格コード2
   * @param lElementCode2 エレメントコード2
   * @param lAmount 予約商品数量
   * @return 使用される予約商品の数量
   * @throws なし
   */
  public String getAmount(String lShopCode,String lCmdtyCode,String lStndrdCode1,String lElementCode1,String lStndrdCode2,String lElementCode2){
    SIReserveOrder lReserveOrder=new SIReserveOrder();
    lReserveOrder.setEncode(SIConfig.SIENCODE_NONE);
    lReserveOrder.setShopCode(lShopCode);
    lReserveOrder.setCmdtyCode(lCmdtyCode);
    lReserveOrder.setStndrdCode1(lStndrdCode1);
    lReserveOrder.setElementCode1(lElementCode1);
    lReserveOrder.setStndrdCode2(lStndrdCode2);
    lReserveOrder.setElementCode2(lElementCode2);

    return getAmount(lReserveOrder);
  }

  //7.3.0 PI-NES0501 追加 ここから
  /**
   * <b>getAmount</b>
   * 使用される予約商品の数量の計算
   * @param lShopCode ショップコード
   * @param lCmdtyCode 商品コード
   * @param lIndividualCode 在庫コード
   * @param lStndrdCode1 規格コード1
   * @param lElementCode1 エレメントコード1
   * @param lStndrdCode2 規格コード2
   * @param lElementCode2 エレメントコード2
   * @param lAmount 予約商品数量
   * @return 使用される予約商品の数量
   * @throws なし
   */
  public String getAmount(String lShopCode,String lCmdtyCode,String lIndividualCode,String lStndrdCode1,String lElementCode1,String lStndrdCode2,String lElementCode2){
    SIReserveOrder lReserveOrder=new SIReserveOrder();
    lReserveOrder.setEncode(SIConfig.SIENCODE_NONE);
    lReserveOrder.setShopCode(lShopCode);
    lReserveOrder.setCmdtyCode(lCmdtyCode);
    lReserveOrder.setIndividualCode(lIndividualCode);
    lReserveOrder.setStndrdCode1(lStndrdCode1);
    lReserveOrder.setElementCode1(lElementCode1);
    lReserveOrder.setStndrdCode2(lStndrdCode2);
    lReserveOrder.setElementCode2(lElementCode2);

    return getAmount(lReserveOrder);
  }
  //7.3.0 PI-NES0501 追加 ここまで
  
  /**
   * <b>getAmount</b>
   * あるPKのデータに対する使用される予約商品の数量の計算
   * @param lName PKのデータ
   * @return 使用される予約商品の数量
   * @throws なし
   */
  public String getAmount(String lName){
    String lAmount=(String)reserveCarts.get(lName);
    if (SIUtil.isNull(lAmount)) lAmount="0";
    return lAmount;
  }

  /**
   * <b>getUsedAmount</b>
   * 既に注文される商品数の取得
   * @param lReserveOrder 予約商品情報
   * @return 既に注文される商品数
   * @throws なし
   */
  public String getUsedAmount(SIReserveOrder lReserveOrder){
    String lName=getName(lReserveOrder);
    String lAmount=(String)usedReserveCarts.get(lName);

    if (SIUtil.isNull(lAmount)) lAmount="0";
    return lAmount;
  }

  /**
   * <b>update</b>
   * 予約商品テーブルから、注文された商品に対する予約フラグの更新
   * @param lConnection コネクション
   * @return なし
   * @throws なし
   */
  public void update(Connection lConnection,String lShopCode)throws SIDuplicateKeyException,SIDBAccessException{
    Iterator lIta=reserveCodes.keySet().iterator();
    SIModifyRec lRec = new SIModifyRec();
    String lReserveCode="";

    while (lIta.hasNext()){
      lReserveCode=(String)lIta.next();
      lRec=new SIModifyRec("ReserveOrderTbl");
      lRec.addCondition("ReserveCode",lReserveCode);
      if (SIUtil.isNotNull(lShopCode)){
        lRec.addCondition("ShopCode",lShopCode);
      }
      lRec.add("ReserveFlg","5");
      lRec.execute(lConnection);
    }
  }

  /**
   * <b>insertOrderReserve</b>
   * 予約受注テーブルに予約コードの記入
   * @param lConnection コネクション
   * @return なし
   * @throws なし
   */
  public void insertOrderReserve(Connection lConnection,String lOrderCode)throws SIDuplicateKeyException,SIDBAccessException{
    Iterator lIta=reserveCodes.keySet().iterator();
    SIInsertRec lRec = new SIInsertRec();
    String lReserveCode="";

    while (lIta.hasNext()){
      lReserveCode=(String)lIta.next();
      lRec=new SIInsertRec("OrderReserveTbl");
      lRec.add("OrderCode",lOrderCode);
      lRec.add("ReserveCode",lReserveCode);
      lRec.execute(lConnection);
    }
  }
  
  /**
   * <b>getAmount</b>
   * 予約商品カートから、予約商品の数量の取得
   * @param lRequest リクエスト
   * @param lReserveOrder 予約商品情報
   * @return 予約商品の数量
   * @throws なし
   */
  public static String getAmount(HttpServletRequest lRequest,SIReserveOrder lReserveOrder){
    HttpSession session=lRequest.getSession(true);//セッションの取得
    SIReserveCartManager lRsrCartManager=(SIReserveCartManager)session.getAttribute(SIConfig.SISESSION_RESERVE_CART_INFO_NAME);
    if (lRsrCartManager==null)lRsrCartManager=new SIReserveCartManager();
    String lAmount=lRsrCartManager.getAmount(lReserveOrder);
    if (SIUtil.isNull(lAmount)) return "0";
    else return lAmount;
  }

  /**
   * <b>getAmount</b>
   * 予約商品カートから、予約商品の数量の取得
   * @param lRequest リクエスト
   * @param lShopCode ショップコード
   * @param lCmdtyCode 商品コード
   * @param lStndrdCode1 規格コード1
   * @param lElementCode1 エレメントコード1
   * @param lStndrdCode2 規格コード2
   * @param lElementCode2 エレメントコード2
   * @return なし
   * @throws なし
   */
  public static String getAmount(HttpServletRequest lRequest,String lShopCode,String lCmdtyCode,String lStndrdCode1,String lElementCode1,String lStndrdCode2,String lElementCode2){
    SIReserveOrder lReserveOrder=new SIReserveOrder();
    lReserveOrder.setEncode(SIConfig.SIENCODE_NONE);
    lReserveOrder.setShopCode(lShopCode);
    lReserveOrder.setCmdtyCode(lCmdtyCode);
    lReserveOrder.setStndrdCode1(lStndrdCode1);
    lReserveOrder.setElementCode1(lElementCode1);
    lReserveOrder.setStndrdCode2(lStndrdCode2);
    lReserveOrder.setElementCode2(lElementCode2);
    return SIReserveCartManager.getAmount(lRequest,lReserveOrder);
  }
  
  //7.3.0 PI-NES0501 追加 ここから
  /**
   * <b>getAmount</b>
   * 予約商品カートから、予約商品の数量の取得
   * @param lRequest リクエスト
   * @param lShopCode ショップコード
   * @param lCmdtyCode 商品コード
   * @param lIndividualCode 在庫コード
   * @param lStndrdCode1 規格コード1
   * @param lElementCode1 エレメントコード1
   * @param lStndrdCode2 規格コード2
   * @param lElementCode2 エレメントコード2
   * @return なし
   * @throws なし
   */
  public static String getAmount(HttpServletRequest lRequest,String lShopCode,String lCmdtyCode,String lIndividualCode,String lStndrdCode1,String lElementCode1,String lStndrdCode2,String lElementCode2){
    SIReserveOrder lReserveOrder=new SIReserveOrder();
    lReserveOrder.setEncode(SIConfig.SIENCODE_NONE);
    lReserveOrder.setShopCode(lShopCode);
    lReserveOrder.setCmdtyCode(lCmdtyCode);
    lReserveOrder.setIndividualCode(lIndividualCode);
    lReserveOrder.setStndrdCode1(lStndrdCode1);
    lReserveOrder.setElementCode1(lElementCode1);
    lReserveOrder.setStndrdCode2(lStndrdCode2);
    lReserveOrder.setElementCode2(lElementCode2);
    return SIReserveCartManager.getAmount(lRequest,lReserveOrder);
  }
  //7.3.0 PI-NES0501 追加 ここまで

  public static void validate(HttpServletRequest lRequest,SICustomErrors lErrors){
    HttpSession session=lRequest.getSession(true);//セッションの取得
    SIReserveCartManager lRsrCartManager=(SIReserveCartManager)session.getAttribute(SIConfig.SISESSION_RESERVE_CART_INFO_NAME);
    if (lRsrCartManager==null)return ;
    SICartManager cartManager=(SICartManager)session.getAttribute(SIConfig.SISESSION_CART_INFO_NAME);
    if (cartManager==null)cartManager=new SICartManager();

    HashMap lReserveCart=lRsrCartManager.getReserveCart();
    if (lReserveCart.isEmpty()) return;
    String lAmount="";
    String lName="";

    Iterator lIta=lReserveCart.keySet().iterator();
    while (lIta.hasNext()){
      lName=(String)lIta.next();
      lAmount=cartManager.getCart(getCartCmdty(lName)).getAmount();//カートにある数量
      validate(lRequest,lErrors,getReserveOrder(lName),lAmount);
    }
  }

  /**
   * <b>validate</b>
   * フロントがわに、予約商品カートにあって入力した商品数量をチェックします。
   * @param lRequest リクエスト
   * @param lErrors エラーリスト
   * @param lReserveOrder 対象の予約商品情報
   * @param lAmount 入力した商品数量
   * @return なし
   * @throws なし
   */
  public static void validate(HttpServletRequest lRequest,SICustomErrors lErrors,SIReserveOrder lReserveOrder,String lAmount){
    HttpSession session=lRequest.getSession(true);//セッションの取得
    SIReserveCartManager lRsrCartManager=(SIReserveCartManager)session.getAttribute(SIConfig.SISESSION_RESERVE_CART_INFO_NAME);
    if (lRsrCartManager==null)return ;
    SICartManager cartManager=(SICartManager)session.getAttribute(SIConfig.SISESSION_CART_INFO_NAME);
    if (cartManager==null)cartManager=new SICartManager();

    HashMap lReserveCart=lRsrCartManager.getReserveCart();
    if (lReserveCart.isEmpty()) return;

    log.debug("validate:lAmount="+lAmount+",lRsrCartManager.getAmount(lCartCmdty)="+lRsrCartManager.getAmount(lReserveOrder));
    if (SICheckUtil.isLess(lAmount,lRsrCartManager.getAmount(lReserveOrder))){
      lErrors.addError(new SICustomError("input.data.greater","変更後の数量","予約商品の数量("+lRsrCartManager.getAmount(lReserveOrder)+")"));
    }
  }

  /**
   * <b>getCartCmdty</b>
   * PKのデータから、フロント側にカート商品情報の生成
   * @param lName PKのデータ
   * @return 商品情報
   * @throws なし
   */
  public static SICartCmdty getCartCmdty(String lName){
    String[] lCartCmdtyCode=SIStringUtil.split(lName,SIConfig.SIWEBSHOPPING_TOKEN);
    SICartCmdty lCartCmdty=new SICartCmdty();
    if (lCartCmdtyCode.length==6){
      lCartCmdty.setEncode(SIConfig.SIENCODE_NONE);
      lCartCmdty.setShopCode(lCartCmdtyCode[0]);
      lCartCmdty.setCmdtyCode(lCartCmdtyCode[1]);
      lCartCmdty.setStndrdCode1(lCartCmdtyCode[2]);
      lCartCmdty.setElementCode1(lCartCmdtyCode[3]);
      lCartCmdty.setStndrdCode2(lCartCmdtyCode[4]);
      lCartCmdty.setElementCode2(lCartCmdtyCode[5]);
    }
    //7.3.0 PI-NES0501 追加 ここから
    else if (lCartCmdtyCode.length==7){
        lCartCmdty.setEncode(SIConfig.SIENCODE_NONE);
        lCartCmdty.setShopCode(lCartCmdtyCode[0]);
        lCartCmdty.setCmdtyCode(lCartCmdtyCode[1]);
        lCartCmdty.setIndividualCode(lCartCmdtyCode[2]);
        lCartCmdty.setStndrdCode1(lCartCmdtyCode[3]);
        lCartCmdty.setElementCode1(lCartCmdtyCode[4]);
        lCartCmdty.setStndrdCode2(lCartCmdtyCode[5]);
        lCartCmdty.setElementCode2(lCartCmdtyCode[6]);
    }
    //7.3.0 PI-NES0501 追加 ここまで
    return lCartCmdty;
  }

  /**
   * <b>getReserveOrder</b>
   * PKのデータから、予約商品のレコードデータの生成
   * @param lName PKのデータ
   * @return なし
   * @throws なし
   */
  private static SIReserveOrder getReserveOrder(String lName){
    String[] lCartCmdtyCode=SIStringUtil.split(lName,SIConfig.SIWEBSHOPPING_TOKEN);
    SIReserveOrder lReserveOrder=new SIReserveOrder();
    if (lCartCmdtyCode.length==6){
      lReserveOrder.setEncode(SIConfig.SIENCODE_NONE);
      lReserveOrder.setShopCode(lCartCmdtyCode[0]);
      lReserveOrder.setCmdtyCode(lCartCmdtyCode[1]);
      lReserveOrder.setStndrdCode1(lCartCmdtyCode[2]);
      lReserveOrder.setElementCode1(lCartCmdtyCode[3]);
      lReserveOrder.setStndrdCode2(lCartCmdtyCode[4]);
      lReserveOrder.setElementCode2(lCartCmdtyCode[5]);
    }
    //7.3.0 PI-NES0501 追加 ここから
    else if (lCartCmdtyCode.length==7){
        lReserveOrder.setEncode(SIConfig.SIENCODE_NONE);
        lReserveOrder.setShopCode(lCartCmdtyCode[0]);
        lReserveOrder.setCmdtyCode(lCartCmdtyCode[1]);
        lReserveOrder.setIndividualCode(lCartCmdtyCode[2]);
        lReserveOrder.setStndrdCode1(lCartCmdtyCode[3]);
        lReserveOrder.setElementCode1(lCartCmdtyCode[4]);
        lReserveOrder.setStndrdCode2(lCartCmdtyCode[5]);
        lReserveOrder.setElementCode2(lCartCmdtyCode[6]);
      }
    //7.3.0 PI-NES0501 追加 ここまで
    return lReserveOrder;
  }

  /**
   * <b>cancel</b>
   * フロント側にカートのクリアの同時に、予約商品もクリア
   * @param lRequest リクエスト
   * @return なし
   * @throws なし
   */
  public static void cancel(HttpServletRequest lRequest,Connection lConnection)throws SIDuplicateKeyException,SIDBAccessException{
    HttpSession session=lRequest.getSession(true);//セッションの取得
    SIReserveCartManager lRsrCartManager=(SIReserveCartManager)session.getAttribute(SIConfig.SISESSION_RESERVE_CART_INFO_NAME);
    if (lRsrCartManager==null)return ;

    Iterator lIta=lRsrCartManager.getReserveCodes().keySet().iterator();
    SIModifyRec lRec = new SIModifyRec();
    String lReserveCode="";

    while (lIta.hasNext()){
      lReserveCode=(String)lIta.next();
      log.debug("cancel:lReserveCode="+lReserveCode);
      lRec=new SIModifyRec("ReserveOrderTbl");
      lRec.addCondition("ReserveCode",lReserveCode);
      lRec.add("ReserveFlg","1");
      lRec.execute(lConnection);
    }
  }

  public void clear(String lCasherShopCode){
    if (SIUtil.isNull(lCasherShopCode))this.clear();
    Iterator lIta=reserveCarts.keySet().iterator();
    String lName="";
    SIReserveOrder lReserveOrder=new SIReserveOrder();
    HashMap lReserveCarts=new HashMap();
    HashMap lReserveCodes=new HashMap();

    while (lIta.hasNext()){
      lName=(String)lIta.next();
      lReserveOrder=getReserveOrder(lName);
      if (!lReserveOrder.getShopCode().equals(lCasherShopCode)){
        lReserveCarts.put(lName,reserveCarts.get(lName));
        lReserveCodes.put(lReserveOrder.getReserveCode(),null);
      }
    }
    this.reserveCarts=lReserveCarts;
    this.reserveCodes=lReserveCodes;
  }

  public void delete(HttpServletRequest lRequest,String lName,String lCode){
    HttpSession session=lRequest.getSession(true);//セッションの取得
    SIReserveCartManager lReserveCartManager=(SIReserveCartManager)session.getAttribute(SIConfig.SISESSION_RESERVE_CART_INFO_NAME);
    this.reserveCarts.remove(lName);
    this.reserveCodes.remove(lCode);
    session.setAttribute(SIConfig.SISESSION_RESERVE_CART_INFO_NAME,lReserveCartManager);
  }

  //7.1.1 ST0211 追加 ここから
  /**
   * <b>clearUsed</b>
   * 前に使ったデータのクリア
   * @param なし
   * @return なし
   * @throws なし
   */
  public void clearUsed(){
    usedReserveCarts=new HashMap();
  }
  //7.1.1 ST0211 追加 ここまで

  public void clear(){
    reserveCarts=new HashMap();
    //予約番号
    reserveCodes=new HashMap();
    //使った予約商品数量
    usedReserveCarts=new HashMap();
  }
  /**
   * <b>clear</b>
   * 予約商品カートに情報のクリア
   * @param lRequest リクエスト
   * @return なし
   * @throws なし
   */
  public static void clear(HttpServletRequest lRequest){
    HttpSession session=lRequest.getSession(true);//セッションの取得
    session.removeAttribute(SIConfig.SISESSION_RESERVE_CART_INFO_NAME);
  }

  public static void clear(HttpServletRequest lRequest,String lCasherShopCode){
    if (SIUtil.isNull(lCasherShopCode))SIReserveCartManager.clear(lRequest);

    HttpSession session=lRequest.getSession(true);//セッションの取得
    SIReserveCartManager lReserveCartManager=(SIReserveCartManager)session.getAttribute(SIConfig.SISESSION_RESERVE_CART_INFO_NAME);
    lReserveCartManager.clear(lCasherShopCode);
    session.setAttribute(SIConfig.SISESSION_RESERVE_CART_INFO_NAME,lReserveCartManager);
  }
  /**
   * <b>refresh</b>
   * 予約商品カートに情報のリフレーション
   * @param lRequest リクエスト
   * @param  lConnection DBへのコネクション
   * @return なし
   * @throws なし
   */
  public static void refresh(HttpServletRequest lRequest,Connection lConnection){
    SIUserInfo lUserInfo=SIHTMLUtil.getUserInfo(lRequest);
    HttpSession session=lRequest.getSession(true);//セッションの取得
    SIReserveCartManager lRsrCartManager=(SIReserveCartManager)session.getAttribute(SIConfig.SISESSION_RESERVE_CART_INFO_NAME);
    SIModifyRec lRec = new SIModifyRec("ReserveOrderTbl");

    try {
      if (lRsrCartManager==null||lRsrCartManager.getReserveCodes().isEmpty()){//からカート
        lRec.addCondition("CustCode",lUserInfo.getCustCode());
        lRec.addCondition("ReserveFlg","3");
        lRec.add("ReserveFlg","1");
        lRec.execute(lConnection);
      }else{//カートに既にある場合に
        Iterator lIta=lRsrCartManager.getReserveCodes().keySet().iterator();
        String lReserveCode="";
        SIReserveOrder lReserveOrder=new SIReserveOrder();
        SICartCmdty lCartCmdty=new SICartCmdty();
        SICart lCart=new SICart();
        String lAmount="0";
        boolean lClearFlg=false;
        SICartManager cartMan=(SICartManager)session.getAttribute(SIConfig.SISESSION_CART_INFO_NAME);
        if (cartMan==null)cartMan=new SICartManager();

        while (lIta.hasNext()){
          lReserveCode=(String)lIta.next();
          lReserveOrder=new SIReserveOrder(lReserveCode);
          lReserveOrder.reset(lConnection);
          if (!lReserveOrder.getCustCode().equals(lUserInfo.getCustCode())){
            lClearFlg=true;
            lCartCmdty=new SICartCmdty();
            lCartCmdty.setEncode(SIConfig.SIENCODE_NONE);
            lCartCmdty.setShopCode(lReserveOrder.getShopCode());
            lCartCmdty.setCmdtyCode(lReserveOrder.getCmdtyCode());
            lCartCmdty.setIndividualCode(lReserveOrder.getIndividualCode());//7.3.0 PI-NES0501 追加
            lCartCmdty.setStndrdCode1(lReserveOrder.getStndrdCode1());
            lCartCmdty.setElementCode1(lReserveOrder.getElementCode1());
            lCartCmdty.setStndrdCode2(lReserveOrder.getStndrdCode2());
            lCartCmdty.setElementCode2(lReserveOrder.getElementCode2());
            lCart=cartMan.getCart(lCartCmdty);
            lAmount=SIUtil.sub_LL(lCart.getAmount(),lReserveOrder.getAmount());

            //カートに商品数量の更新
            if (Integer.parseInt(lAmount)<=0)lAmount="0";

            //予約テーブルにフラグの更新
            cartMan.update(lCartCmdty,lAmount);
            lRec = new SIModifyRec("ReserveOrderTbl");
            lRec.addCondition("ReserveCode",lReserveCode);
            lRec.add("ReserveFlg","1");
            lRec.execute(lConnection);
          }
          session.setAttribute(SIConfig.SISESSION_CART_INFO_NAME,cartMan);
          if (lClearFlg)SIReserveCartManager.clear(lRequest);
        }
      }
      lConnection.commit();
    } catch (SIDuplicateKeyException e) {
      e.printStackTrace();
    } catch (SIDBAccessException e) {
      e.printStackTrace();
    } catch (SQLException e) {
      e.printStackTrace();
    }
  }
}
