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

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;

import javax.servlet.http.HttpServletRequest;

import jp.co.sint.basic.SIFrontBasic;
import jp.co.sint.basic.SIReserveOrder;
import jp.co.sint.basic.SIUserInfo;
import jp.co.sint.config.SIConfig;
import jp.co.sint.config.SIDBMultiConf;
import jp.co.sint.database.SIDBAccessException;
import jp.co.sint.database.SIDBUtil;
import jp.co.sint.database.SIDateType;
import jp.co.sint.tools.SICheckDataConf;
import jp.co.sint.tools.SICheckUtil;
import jp.co.sint.tools.SICheckValid;
import jp.co.sint.tools.SICustomError;
import jp.co.sint.tools.SICustomErrors;
import jp.co.sint.tools.SIDateTime;
import jp.co.sint.tools.SIHTMLUtil;
import jp.co.sint.tools.SIUtil;
import jp.co.sint.tools.SIURLParameter;// 7.1.1 ST0236 追加

import org.apache.log4j.Category;

/**
 * @version $Id: UICart.java,v 1.0 2003/11/17 Exp $
 * @author  asakura
 * <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>
 * asakura    2003/12/17 17:10:42  Original
 */
public class UIReserve extends SIFrontBasic {
  
  public UIReserve() {
  }
  
  // ログ用のインスタンスの生成
  private static Category log = Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);
  
  // ショップコード
  private String shopCode = "";
  
  // 予約商品のショップコード
  private String rsrvShopCodeTxt = "";
  
  // 予約商品の商品コード
  private String rsrvCmdtyCodeTxt = "";
  
  // 予約商品の在庫コード
  private String rsrvIndividualCodeTxt = "";// 7.3.0 PI-NES0501 追加
  
  // 予約商品の規格コード１
  private String rsrvStndrdCodeTxt1 = "";
  
  // 予約商品の規格コード２
  private String rsrvStndrdCodeTxt2 = "";
  
  // 予約商品のエレメントコード１
  private String rsrvElementCodeTxt1 = "";
  
  // 予約商品のエレメントコード２
  private String rsrvElementCodeTxt2 = "";
  
  private String amountTxt = "1";
  
  private String splitFlgRdo = "1";
  
  private String rsrvAmountTxt = "";
  
  private String bgPrice = "0";// 7.3.0 PI-NES0601 追加
  
  private String rsrvAmount = "";// 7.3.0 PI-NES0601 追加
  
  private String maker = "";// 7.3.0 PI-NES0601 追加
  
  private String cmdtyName = "";// 7.3.0 PI-NES0601 追加
  
  private String custCode = "";
  
  private String custName = "";
  
  //EDBTG003-00 elecs-matsushima add start
  // 予約商品のセット在庫コード
  private String rsrvSetCmdtCodeTxt = "";
  
  // 予約商品のセット商品コード
  private String rsrvSetIndividualTxt = "";
  
  // 予約商品の商品名
  private String rsrvCompositionDetailName = "";
  //EDBTG003-00 elecs-matsushima add end
  
  /**
   * @return custCode を戻します。
   */
  public String getCustCode() {
    return custCode;
  }
  
  /**
   * @param custCode custCode を設定。
   */
  public void setCustCode(String custCode) {
    this.custCode = custCode;
  }
  
  /**
   * @return custName を戻します。
   */
  public String getCustName() {
    return custName;
  }
  
  /**
   * @param custName custName を設定。
   */
  public void setCustName(String custName) {
    this.custName = custName;
  }
  
  /**
   * @return cmdtyName を戻します。
   */
  public String getCmdtyName() {
    return cmdtyName;
  }
  
  /**
   * @param cmdtyName cmdtyName を設定。
   */
  public void setCmdtyName(String cmdtyName) {
    this.cmdtyName = cmdtyName;
  }
  
  /**
   * @return bgPrice を戻します。
   */
  public String getBgPrice() {
    return bgPrice;
  }
  
  /**
   * @param bgPrice bgPrice を設定。
   */
  public void setBgPrice(String bgPrice) {
    if (SIUtil.isNull(bgPrice))
      bgPrice = "0";
    this.bgPrice = SIUtil.changeTo(bgPrice.trim(), this.encode);
  }
  
  /**
   * @return maker を戻します。
   */
  public String getMaker() {
    return maker;
  }
  
  /**
   * @param maker maker を設定。
   */
  public void setMaker(String maker) {
    this.maker = maker;
  }
  
  /**
   * @return rsrvAmount を戻します。
   */
  public String getRsrvAmount() {
    return rsrvAmount;
  }
  
  /**
   * @param rsrvAmount rsrvAmount を設定。
   */
  public void setRsrvAmount(String rsrvAmount) {
    this.rsrvAmount = SIUtil.changeTo(rsrvAmount.trim(), this.encode);
  }
  
  // 詳細画面の結果を保持
  private SIReserveOrder reserveOrder = null;
  
  // setter of ショップコード
  public void setShopCode(String lShopCode) {
    if (SIUtil.isNull(lShopCode))
      lShopCode = "";
    this.shopCode = SIUtil.changeTo(lShopCode.trim(), this.encode);
  }
  
  // setter of 予約商品のショップコード
  public void setRsrvShopCodeTxt(String lRsrvShopCodeTxt) {
    if (SIUtil.isNull(lRsrvShopCodeTxt))
      lRsrvShopCodeTxt = "";
    this.rsrvShopCodeTxt = SIUtil.changeTo(lRsrvShopCodeTxt.trim(), this.encode);
  }
  
  // setter of 予約商品のショップコード
  public void setRsrvCmdtyCodeTxt(String lRsrvCmdtyCodeTxt) {
    if (SIUtil.isNull(lRsrvCmdtyCodeTxt))
      lRsrvCmdtyCodeTxt = "";
    this.rsrvCmdtyCodeTxt = SIUtil.changeTo(lRsrvCmdtyCodeTxt.trim(), this.encode);
  }
  
  // setter of 予約商品の在庫コード 7.3.0 PI-NES0501 追加
  public void setRsrvIndividualCodeTxt(String lRsrvIndividualCodeTxt) {
    if (SIUtil.isNull(lRsrvIndividualCodeTxt))
      lRsrvIndividualCodeTxt = "";
    this.rsrvIndividualCodeTxt = SIUtil.changeTo(lRsrvIndividualCodeTxt.trim(), this.encode);
  }
  
  // setter of 予約商品のショップコード
  public void setRsrvStndrdCodeTxt1(String lRsrvStndrdCodeTxt1) {
    if (SIUtil.isNull(lRsrvStndrdCodeTxt1))
      lRsrvStndrdCodeTxt1 = "";
    this.rsrvStndrdCodeTxt1 = SIUtil.changeTo(lRsrvStndrdCodeTxt1.trim(), this.encode);
  }
  
  // setter of 予約商品のショップコード
  public void setRsrvStndrdCodeTxt2(String lRsrvStndrdCodeTxt2) {
    if (SIUtil.isNull(lRsrvStndrdCodeTxt2))
      lRsrvStndrdCodeTxt2 = "";
    this.rsrvStndrdCodeTxt2 = SIUtil.changeTo(lRsrvStndrdCodeTxt2.trim(), this.encode);
  }
  
  // setter of 予約商品のショップコード
  public void setRsrvElementCodeTxt1(String lRsrvElementCodeTxt1) {
    if (SIUtil.isNull(lRsrvElementCodeTxt1))
      lRsrvElementCodeTxt1 = "";
    this.rsrvElementCodeTxt1 = SIUtil.changeTo(lRsrvElementCodeTxt1.trim(), this.encode);
  }
  
  // setter of 予約商品のショップコード
  public void setRsrvElementCodeTxt2(String lRsrvElementCodeTxt2) {
    if (SIUtil.isNull(lRsrvElementCodeTxt2))
      lRsrvElementCodeTxt2 = "";
    this.rsrvElementCodeTxt2 = SIUtil.changeTo(lRsrvElementCodeTxt2.trim(), this.encode);
  }
  
  // setter of 予約商品の数量
  public void setAmountTxt(String lAmountTxt) {
    if (SIUtil.isNull(lAmountTxt))
      lAmountTxt = "1";
    this.amountTxt = SIUtil.changeTo(lAmountTxt.trim(), this.encode);
  }
  
  // setter of 予約商品の分割可能
  public void setSplitFlgRdo(String lSplitFlgRdo) {
    if (SIUtil.isNull(lSplitFlgRdo))
      lSplitFlgRdo = "0";
    this.splitFlgRdo = SIUtil.changeTo(lSplitFlgRdo.trim(), this.encode);
  }
  
  // setter of 予約商品の分割可能
  public void setRsrvAmountTxt(String lRsrvAmountTxt) {
    if (SIUtil.isNull(lRsrvAmountTxt))
      lRsrvAmountTxt = "";
    this.rsrvAmountTxt = SIUtil.changeTo(lRsrvAmountTxt.trim(), this.encode);
  }
  
  // setter of 予約商品情報
  public void setRsrvElementCodeTxt2(SIReserveOrder lReserveOrder) {
    if (lReserveOrder == null) {
      this.reserveOrder = null;
    } else {
      this.reserveOrder = lReserveOrder;
    }
  }
  
  // getter of ショップコード
  public String getShopCode() {
    return this.shopCode;
  }
  
  // getter of 予約商品のショップコード
  public String getRsrvShopCodeTxt() {
    return this.rsrvShopCodeTxt;
  }
  
  // getter of 予約商品の商品コード
  public String getRsrvCmdtyCodeTxt() {
    return this.rsrvCmdtyCodeTxt;
  }
  
  // getter of 予約商品の商品コード 7.3.0 PI-NES0501 追加
  public String getRsrvIndividualCodeTxt() {
    return this.rsrvIndividualCodeTxt;
  }
  
  // getter of 予約商品の規格コード１
  public String getRsrvStndrdCodeTxt1() {
    return this.rsrvStndrdCodeTxt1;
  }
  
  // getter of 予約商品の規格コード２
  public String getRsrvStndrdCodeTxt2() {
    return this.rsrvStndrdCodeTxt2;
  }
  
  // getter of 予約商品のエレメントコード１
  public String getRsrvElementCodeTxt1() {
    return this.rsrvElementCodeTxt1;
  }
  
  // getter of 予約商品のエレメントコード２
  public String getRsrvElementCodeTxt2() {
    return this.rsrvElementCodeTxt2;
  }
  
  // getter of 予約商品の数量
  public String getAmountTxt() {
    return this.amountTxt;
  }
  
  // getter of 予約商品の分割可能
  public String getSplitFlgRdo() {
    return this.splitFlgRdo;
  }
  
  // getter of 予約商品の分割可能
  public String getRsrvAmountTxt() {
    return this.rsrvAmountTxt;
  }
  
  // setter of 予約商品情報
  public SIReserveOrder getReserveOrder() {
    return this.reserveOrder;
  }
  
  // ショップコードを取得
  public String getReserveShopCode() {
    if (SIUtil.isNull(getShopCode()))
      return SIConfig.SIMALL.getMallShopCode();
    else
      return getShopCode();
  }
  
  //EDBTG003-00 elecs-matsushima add start
  public String getRsrvSetCmdtCodeTxt() {
    return this.rsrvSetCmdtCodeTxt;
  }
  
  public void setRsrvSetCmdtCodeTxt(String rsrvSetCmdtCodeTxt) {
    if (SIUtil.isNull(rsrvSetCmdtCodeTxt)) rsrvSetCmdtCodeTxt = "";
    this.rsrvSetCmdtCodeTxt = rsrvSetCmdtCodeTxt;
  }
  
  public String getRsrvSetIndividualTxt() {
    return this.rsrvSetIndividualTxt;
  }
  
  public String getRsrvCompositionDetailName() {
    return this.rsrvCompositionDetailName;
  }
  
  public void setRsrvSetIndividualTxt(String rsrvSetIndividualTxt) {
    if (SIUtil.isNull(rsrvSetIndividualTxt)) rsrvSetIndividualTxt = "";
    this.rsrvSetIndividualTxt = rsrvSetIndividualTxt;
  }
  
  public void setRsrvCompositionDetailName(String rsrvCompositionDetailName) {
    if (SIUtil.isNull(rsrvCompositionDetailName)) rsrvCompositionDetailName = "";
    this.rsrvCompositionDetailName = rsrvCompositionDetailName;
  }
  //EDBTG003-00 elecs-matsushima add end

  /**
   * <b>init</b> 予約商品情報の初期設定。
   * 
   * @param request クライアントからのリクエスト
   * @param lUrlParam
   * @return なし
   * @throws なし
   */
  // 7.1.1 ST0236 修正 ここから
  public void init(HttpServletRequest lRequest, SIURLParameter lUrlParam) {
    this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
    super.init(lRequest, lUrlParam);
    this.setShopCode((String) lUrlParam.getParam("shc"));
    this.setRsrvShopCodeTxt((String) lUrlParam.getParam("rsrvShopCodeTxt"));
    this.setRsrvCmdtyCodeTxt((String) lUrlParam.getParam("rsrvCmdtyCodeTxt"));
    this.setRsrvIndividualCodeTxt((String) lUrlParam.getParam("rsrvIndividualCodeTxt"));// 7.3.0 PI-NES0501 追加
    this.setRsrvStndrdCodeTxt1((String) lUrlParam.getParam("rsrvStndrdCodeTxt1"));
    this.setRsrvStndrdCodeTxt2((String) lUrlParam.getParam("rsrvStndrdCodeTxt2"));
    this.setRsrvElementCodeTxt1((String) lUrlParam.getParam("rsrvElementCodeTxt1"));
    this.setRsrvElementCodeTxt2((String) lUrlParam.getParam("rsrvElementCodeTxt2"));
    // EDBTG003-00 nagayoshi add start
    String compositionCount = "";
    this.setAmountTxt((String) lUrlParam.getParam("amountTxt"));
    compositionCount = (String) lUrlParam.getParam("rsrvCompositionCountTxt");
    if (SIUtil.isNotNull(compositionCount) && Integer.parseInt(compositionCount) > 0) {
      // PCフロント、かつ仕様指定品予約の場合
      this.setAmountTxt(SIUtil.multi_LL(this.getAmountTxt(), compositionCount));
    }
    // モバイル仕様指定品予約対応
    // 選択値を取得
    String checkValue = (String) lUrlParam.getParam("rervCmdtyRadio");
    if (SIUtil.isNotNull(checkValue)) {
      // セット情報退避
      this.setRsrvSetCmdtCodeTxt(this.getRsrvCmdtyCodeTxt());
      this.setRsrvSetIndividualTxt(this.getRsrvIndividualCodeTxt());
      // モバイルからの仕様指定品の場合のみ値あり
      this.setRsrvShopCodeTxt((String) lUrlParam.getParam("rsrvShopCodeTxt_" + checkValue));
      this.setRsrvCmdtyCodeTxt((String) lUrlParam.getParam("rsrvCmdtyCodeTxt_" + checkValue));
      this.setRsrvIndividualCodeTxt((String) lUrlParam.getParam("rsrvIndividualCodeTxt_" + checkValue));
      this.setRsrvCompositionDetailName((String) lUrlParam.getParam("rsrvCompositionDetailNameTxt_" + checkValue));
      compositionCount = (String) lUrlParam.getParam("rsrvCompositionCountTxt_" + checkValue);
      if (SIUtil.isNotNull(compositionCount) && Integer.parseInt(compositionCount) > 0) {
        this.setAmountTxt(SIUtil.multi_LL(this.getAmountTxt(), compositionCount));
      }
    }
    // EDBTG003-00 nagayoshi add end
  }
  
  // 7.1.1 ST0236 修正 ここまで
  // 7.3.0 PI-NES0601 追加 ここから
  public void initCmdty(HttpServletRequest lRequest, SIURLParameter lUrlParam) {
    this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
    super.init(lRequest, lUrlParam);
    this.setShopCode((String) lUrlParam.getParam("shc"));
    this.setRsrvShopCodeTxt((String) lUrlParam.getParam("shc"));
    String rowCnt = (String) lUrlParam.getParam("rowCnt");
    if (SIUtil.isNotNull(rowCnt)) {
      this.setRsrvCmdtyCodeTxt((String) lRequest.getParameterValues("rsrvCmdtyCodeTxt")[Integer.parseInt(rowCnt)]);
      this.setRsrvIndividualCodeTxt((String) lRequest.getParameterValues("rsrvIndividualCodeTxt")[Integer.parseInt(rowCnt)]);
      this.setAmountTxt((String) lRequest.getParameterValues("amount")[Integer.parseInt(rowCnt)]);
      this.setCmdtyName((String) lRequest.getParameterValues("cmdtyName")[Integer.parseInt(rowCnt)]);
    }
    this.setSplitFlgRdo((String) lUrlParam.getParam("splitFlgRdo"));
  }
  
  public void initCmdtyAmount(HttpServletRequest lRequest, SIURLParameter lUrlParam) {
    this.setAmountTxt((String) lUrlParam.getParam("editAmount"));
    this.setSplitFlgRdo((String) lUrlParam.getParam("splitFlgRdo"));
  }
  
  // 7.3.0 PI-NES0601 追加 ここまで
  /**
   * <b>initAmount1</b> 予約画面に予約数量の設定
   * 
   * @param request クライアントからのリクエスト
   * @param lUrlParam
   * @return なし
   * @throws なし
   */
  // 7.1.1 ST0236 修正 ここから
  public void initAmount1(HttpServletRequest lRequest, SIURLParameter lUrlParam) {
    this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
    super.init(lRequest, lUrlParam);
    this.setAmountTxt((String) lUrlParam.getParam("amountTxt"));
    this.setSplitFlgRdo((String) lUrlParam.getParam("splitFlgRdo"));
    this.setRsrvAmountTxt((String) lUrlParam.getParam("rsrvAmountTxt"));
  }
  
  // 7.1.1 ST0236 修正 ここまで
  
  /**
   * <b>initAmount2</b> 予約リスト画面に予約数量の設定
   * 
   * @param request クライアントからのリクエスト
   * @param lUrlParam
   * @return なし
   * @throws なし
   */
  // 7.1.1 ST0236 修正 ここから
  public void initAmount2(HttpServletRequest lRequest, SIURLParameter lUrlParam) {
    this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
    super.init(lRequest, lUrlParam);
    this.setReserveCodeTxt((String) lUrlParam.getParam("reserveCodeTxt"));
    this.setAmountTxt((String) lUrlParam.getParam("amount" + SIConfig.SIWEBSHOPPING_TOKEN + getReserveCodeTxt()));
    this.setSplitFlgRdo((String) lUrlParam.getParam("splitFlg" + SIConfig.SIWEBSHOPPING_TOKEN + getReserveCodeTxt()));
    this.setRsrvCmdtyCodeTxt((String) lUrlParam.getParam("rsrvCmdtyCodeTxt" + SIConfig.SIWEBSHOPPING_TOKEN + getReserveCodeTxt()));
    this.setRsrvIndividualCodeTxt((String) lUrlParam.getParam("rsrvIndividualCodeTxt" + SIConfig.SIWEBSHOPPING_TOKEN + getReserveCodeTxt()));// 7.3.0 PI-NES0501 追加
    this.setRsrvShopCodeTxt((String) lUrlParam.getParam("rsrvShopCodeTxt" + SIConfig.SIWEBSHOPPING_TOKEN + getReserveCodeTxt()));
    this.setRsrvStndrdCodeTxt1((String) lUrlParam.getParam("rsrvStndrdCodeTxt1_" + SIConfig.SIWEBSHOPPING_TOKEN + getReserveCodeTxt()));
    this.setRsrvStndrdCodeTxt2((String) lUrlParam.getParam("rsrvStndrdCodeTxt2_" + SIConfig.SIWEBSHOPPING_TOKEN + getReserveCodeTxt()));
    this.setRsrvElementCodeTxt1((String) lUrlParam.getParam("rsrvElementCodeTxt1_" + SIConfig.SIWEBSHOPPING_TOKEN + getReserveCodeTxt()));
    this.setRsrvElementCodeTxt2((String) lUrlParam.getParam("rsrvElementCodeTxt2_" + SIConfig.SIWEBSHOPPING_TOKEN + getReserveCodeTxt()));
    this.setRsrvAmountTxt((String) lUrlParam.getParam("rsrvAmount" + SIConfig.SIWEBSHOPPING_TOKEN + getReserveCodeTxt()));// 7.1.1 ST0111修正
  }
  
  // 7.1.1 ST0236 修正 ここまで
  
  // 7.1.1 ST0236 修正 ここから
  public void initDelete(HttpServletRequest lRequest, SIURLParameter lUrlParam) {
    this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
    super.init(lRequest, lUrlParam);
    this.setReserveCodeTxt((String) lUrlParam.getParam("reserveCodeTxt"));
  }
  
  // 7.1.1 ST0236 修正 ここまで
  
  /**
   * <b>initCancel</b> 予約リスト画面に予約キャンセルの設定
   * 
   * @param request クライアントからのリクエスト
   * @param lUrlParam
   * @return なし
   * @throws なし
   */
  // 7.1.1 ST0236 修正 ここから
  public void initCancel(HttpServletRequest lRequest, SIURLParameter lUrlParam) {
    this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
    super.init(lRequest, lUrlParam);
    this.setReserveCodeTxt((String) lUrlParam.getParam("reserveCodeTxt"));
  }
  
  // 7.1.1 ST0236 修正 ここまで
  
  public boolean validateAmount(boolean lChk, HttpServletRequest lRequest, Connection lConnection) {// 7.1.1 ST0156 修正
    SIUserInfo lUserInfo = SIHTMLUtil.getUserInfo(lRequest);// ログイン情報の取得
    
    SICustomErrors errors = new SICustomErrors();
    // 予約数量
    SICheckValid.checkValid(errors, "予約数", getAmountTxt(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);// 7.1.1 ST0162 修正
    // 7.1.1 ST0156 追加 ここから
    if (errors.isEmpty() && lChk && Integer.parseInt(getAmountTxt()) < 1) {
      errors.addError(new SICustomError("input.data.instock.less", "予約数", "1"));// 7.1.1 ST0162 修正
    }
    // 7.1.1 ST0156 追加 ここまで
    // 予約可能の制限のチェック
    String rsrvAmount = "";
    try {
      rsrvAmount = SIDBUtil.getFirstData(lConnection, "SELECT rsrvamount FROM individualtbl WHERE cmdtycode='" + getRsrvCmdtyCodeTxt() + "' AND individualcode='" + getRsrvIndividualCodeTxt() + "'");
    } catch (Exception e) {
      rsrvAmount = "0";
    }
    if (errors.isEmpty() && SIUtil.isNotNull(rsrvAmount) && SICheckUtil.isLess(rsrvAmount, getAmountTxt())) {
      errors.addError(new SICustomError("input.data.less", "予約数", "予約可能数"));// 7.1.1 ST0162 修正
    }
    
    if (SIUtil.isNotNull(getReserveCodeTxt())) {
      SIReserveOrder lReserveOrder = new SIReserveOrder(getReserveCodeTxt());
      lReserveOrder.reset(lConnection);
      if (!lReserveOrder.getCustCode().equals(lUserInfo.getCustCode()) || !lReserveOrder.getReserveFlg().equals("0")) {
        errors.addError(new SICustomError("manager.app.access.disable"));
      }
    }
    
    if (!errors.isEmpty())
      lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY, errors);
    return errors.isEmpty();
  }
  
  public boolean validateCart(HttpServletRequest lRequest, Connection lConnection) {
    SIUserInfo lUserInfo = SIHTMLUtil.getUserInfo(lRequest);// ログイン情報の取得
    SICustomErrors errors = new SICustomErrors();
    SIDateTime lDateTime = new SIDateTime();
    String lNow = lDateTime.getFullDate();
    
    StringBuffer lSqlBuf = new StringBuffer("SELECT aa.ReserveCode ");
    // 7.3.0 PI-NES0501 修正 ここから
    lSqlBuf.append("FROM ReserveOrderTbl aa,IndividualTbl bb ");
    lSqlBuf.append("WHERE aa.ShopCode=bb.ShopCode AND aa.CmdtyCode=bb.CmdtyCode ");
    lSqlBuf.append("AND aa.CustCode=").append(SIDBUtil.SQL2Str(lUserInfo.getCustCode(), " "));
    lSqlBuf.append("AND aa.IndividualCode=bb.IndividualCode ");
    // 7.3.0 PI-NES0501 修正 ここまで
    lSqlBuf.append("AND aa.ReserveFlg='1' ");
    if (SIDBMultiConf.SIDB_CURRENT_INX == SIDBMultiConf.SIDB_POSTGRESQL_INX) {
      lSqlBuf.append("AND (bb.SellFromDate IS NULL OR bb.SellFromDate <= DATE(").append(SIDBUtil.SQL2Str(lNow)).append(")) ");
      lSqlBuf.append("AND (bb.SellToDate IS NULL OR bb.SellToDate >= DATE(").append(SIDBUtil.SQL2Str(lNow)).append(")) ");
    } else {
      lSqlBuf.append("AND (bb.SellFromDate IS NULL OR bb.SellFromDate <= ").append(new SIDateType(lNow).getValue()).append(") ");
      lSqlBuf.append("AND (bb.SellToDate IS NULL OR bb.SellToDate >=").append(new SIDateType(lNow).getValue()).append(") ");
    }
    lSqlBuf.append("AND aa.ReserveCode=").append(SIDBUtil.SQL2Str(getReserveCodeTxt()));
    log.debug("validateCart:lSqlBuf=" + lSqlBuf.toString());
    
    try {
      if (SIDBUtil.hasData(lConnection, lSqlBuf.toString())) {
      } else {
        errors.addError(new SICustomError("manager.app.access.disable"));
      }
    } catch (SIDBAccessException e) {
      e.printStackTrace();
      errors.addError(new SICustomError("manager.app.access.disable"));
    }
    
    if (!errors.isEmpty())
      lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY, errors);
    return errors.isEmpty();
  }
  
  public boolean validateCancel(HttpServletRequest lRequest, Connection lConnection) {
    SIUserInfo lUserInfo = SIHTMLUtil.getUserInfo(lRequest);// ログイン情報の取得
    SICustomErrors errors = new SICustomErrors();
    
    StringBuffer lSqlBuf = new StringBuffer("SELECT ReserveCode FROM ReserveOrderTbl ");
    lSqlBuf.append("WHERE CustCode=").append(SIDBUtil.SQL2Str(lUserInfo.getCustCode()));
    lSqlBuf.append("AND ReserveCode=").append(SIDBUtil.SQL2Str(this.getReserveCodeTxt()));
    lSqlBuf.append("AND ReserveFlg IN ('0','1','4') ");
    log.debug("validateCancel:lSqlBuf=" + lSqlBuf.toString());
    try {
      if (!SIDBUtil.hasData(lConnection, lSqlBuf.toString())) {
        errors.addError(new SICustomError("manager.app.access.disable"));
      }
    } catch (SIDBAccessException e) {
      e.printStackTrace();
      errors.addError(new SICustomError("manager.app.access.disable"));
    }
    
    if (!errors.isEmpty())
      lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY, errors);
    return errors.isEmpty();
  }
  
  /**
   * <b>validateDelete</b> 削除する前に、削除情報のチェック
   * 
   * @param request クライアントからのリクエスト
   * @param lConnection DBへのコネクション
   * @return true 削除が出来る false:削除できない
   * @throws なし
   */
  public boolean validateDelete(HttpServletRequest lRequest, Connection lConnection) {
    SIUserInfo lUserInfo = SIHTMLUtil.getUserInfo(lRequest);// ログイン情報の取得
    SICustomErrors errors = new SICustomErrors();
    
    StringBuffer lSqlBuf = new StringBuffer("SELECT ReserveCode FROM ReserveOrderTbl ");
    lSqlBuf.append("WHERE CustCode=").append(SIDBUtil.SQL2Str(lUserInfo.getCustCode()));
    lSqlBuf.append("AND ReserveCode=").append(SIDBUtil.SQL2Str(getReserveCodeTxt()));
    lSqlBuf.append("AND ReserveFlg='5' ");
    log.debug("validateDelete:lSqlBuf=" + lSqlBuf.toString());
    try {
      if (!SIDBUtil.hasData(lConnection, lSqlBuf.toString())) {
        errors.addError(new SICustomError("manager.app.access.disable"));
      }
    } catch (SIDBAccessException e) {
      e.printStackTrace();
      errors.addError(new SICustomError("manager.app.access.disable"));
    }
    
    if (!errors.isEmpty())
      lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY, errors);
    return errors.isEmpty();
  }
  
  /**
   * <b>initList</b> 予約確認の初期設定。
   * 
   * @param request クライアントからのリクエスト
   * @param lUrlParam
   * @return なし
   * @throws なし
   */
  // 7.1.1 ST0236 修正 ここから
  public void initList(HttpServletRequest lRequest, SIURLParameter lUrlParam) {
    this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
    super.init(lRequest, lUrlParam);
    this.setShopCode((String) lUrlParam.getParam("shc"));
  }
  
  // 7.1.1 ST0236 修正 ここまで
  
  public boolean validate(HttpServletRequest lRequest, Connection lConnection) {
    return true;
  }
  
  /**
   * <b>getCollection</b> 条件に合ったレコードを検索して、結果のコネクションを作成して、戻します。
   * 
   * @param lConnection データベースへの接続コネクション
   * @return レコードのセット
   * @throws なし
   */
  public Collection getCollection(Connection lConnection, SIUserInfo lUserInfo) throws SIDBAccessException {
    Statement lStatement = null;
    ResultSet lResultSet = null;
    SIReserveOrder lBasic = new SIReserveOrder();
    StringBuffer lSqlBuf = new StringBuffer();
    Collection lResultColl = new ArrayList();
    
    lSqlBuf.append("SELECT a.ReserveCode AS ReserveCode , a.CustCode AS CustCode ");
    lSqlBuf.append(", a.CustName AS CustName , a.CustPronName AS CustPronName ");
    lSqlBuf.append(", a.Email AS Email , a.ShopCode AS ShopCode , a.ShopName AS ShopName ");
    lSqlBuf.append(", a.CmdtyCode AS CmdtyCode ,a.IndividualCode AS IndividualCode, a.CmdtyName AS CmdtyName ,b.usedNewFlg ,c.colorName ");
    lSqlBuf.append(",CASE WHEN  a.shipmaildatetime IS NULL THEN NULL ");
    lSqlBuf.append(" ELSE TO_CHAR(shipmaildatetime::date + '7 days'::interval,'MM/DD') END AS shipMailDateTime ");
    //lSqlBuf.append(", a.StndrdCode1 AS StndrdCode1 , a.ElementCode1 AS ElementCode1 ");
    //lSqlBuf.append(", a.StndrdCode2 AS StndrdCode2 , a.ElementCode2 AS ElementCode2 ");
    lSqlBuf.append(", a.Amount AS Amount, a.SplitFlg,a.AssignAmount,a.ReserveDateTime AS ReserveDateTime ");
    lSqlBuf.append(", a.ReserveFlg AS ReserveFlg , b.RsrvAmount AS RsrvAmount,b.SellFromDate AS SellFromDate ");
    //lSqlBuf.append(", e.elementName AS elementName1 , e.stndrdName AS stndrdName1 ");
    //lSqlBuf.append(", h.elementName AS elementName2 , h.stndrdName AS stndrdName2 ");
    lSqlBuf.append("FROM ReserveOrderTbl a ");
    //lSqlBuf.append(" LEFT OUTER JOIN ");
    //lSqlBuf.append(" (SELECT c.ShopCode , c.StndrdCode, d.ElementCode , c.StndrdName , d.ElementName ");
    //lSqlBuf.append(" FROM stndrdnamemtbl c,stndrdcontentmtbl d  ");
    //lSqlBuf.append(" WHERE c.ShopCode = d.ShopCode AND c.StndrdCode = d.StndrdCode ) e ");
    //lSqlBuf.append(" ON (a.ShopCode = e.ShopCode AND a.StndrdCode1 = e.StndrdCode AND a.ElementCode1 = e.ElementCode ) ");
    //lSqlBuf.append(" LEFT OUTER JOIN ");
    //lSqlBuf.append(" (SELECT f.ShopCode , f.StndrdCode, g.ElementCode , f.StndrdName , g.ElementName ");
    //lSqlBuf.append(" FROM stndrdnamemtbl f,stndrdcontentmtbl g  ");
    //lSqlBuf.append(" WHERE f.ShopCode = g.ShopCode AND f.StndrdCode = g.StndrdCode ) h ");
    //lSqlBuf.append(" ON (a.ShopCode = h.ShopCode AND a.StndrdCode2 = h.StndrdCode AND a.ElementCode2 = h.ElementCode ) ");
    lSqlBuf.append(" , cmdtyUnitTbl b , colorTbl c ");
    lSqlBuf.append("WHERE a.CustCode = ").append(SIDBUtil.SQL2Str(lUserInfo.getCustCode()," "));
    //lSqlBuf.append("AND a.ShopCode = b.ShopCode ");
    lSqlBuf.append("AND a.CmdtyCode = b.CmdtyCode ");
    lSqlBuf.append("AND b.ColorCode = c.ColorCode ");
    lSqlBuf.append("AND a.IndividualCode = b.IndividualCode ");
    lSqlBuf.append("AND a.ReserveFlg IN ('0','1') ");
    lSqlBuf.append("AND a.ShopName<>'EYELASHGARAGE' ");
    lSqlBuf.append("AND (a.shipmaildatetime IS NULL OR a.shipmaildatetime::date + '7 days'::interval >= current_date) ");
    lSqlBuf.append("ORDER BY ReserveDateTime DESC ,ReserveCode ASC");
    
    // 検索の条件
    lSqlBuf.append(this.conditionSQL);
    
    log.debug("lSqlBuf=" + lSqlBuf.toString());
    // 実行
    try {
      lStatement = lConnection.createStatement();
      lResultSet = lStatement.executeQuery(lSqlBuf.toString());
      
      // 商品レコードのセットの作成
      while (lResultSet.next()) {
        lBasic = new SIReserveOrder();
        lBasic.setEncode(SIConfig.SIENCODE_NONE);
        lBasic.setReserveCode(lResultSet.getString("reserveCode"));// 予約コード
        lBasic.setCustCode(lResultSet.getString("custCode"));// 顧客コード
        lBasic.setCustName(lResultSet.getString("custName"));// 顧客名
        lBasic.setCustPronName(lResultSet.getString("custPronName"));// 顧客名カナ
        lBasic.setEmail(lResultSet.getString("email"));// EMAIL
        lBasic.setShopCode(lResultSet.getString("shopCode"));// ショップコード
        //lBasic.setShopName(lResultSet.getString("shopName"));// ショップ名
        lBasic.setCmdtyCode(lResultSet.getString("cmdtyCode"));// 商品コード
        lBasic.setIndividualCode(lResultSet.getString("individualCode"));// 在庫コード 7.3.0 PI-NES0501 追加
        lBasic.setCmdtyName(lResultSet.getString("cmdtyName"));// 商品名
        //lBasic.setStndrdCode1(lResultSet.getString("stndrdCode1"));// 規格コード１
        //lBasic.setElementCode1(lResultSet.getString("elementCode1"));// エレメントコード１
        //lBasic.setStndrdName1(lResultSet.getString("stndrdName1"));// 規格名１
        //lBasic.setElementName1(lResultSet.getString("elementName1"));// エレメント名１
        //lBasic.setStndrdCode2(lResultSet.getString("stndrdCode2"));// 規格コード２
        //lBasic.setElementCode2(lResultSet.getString("elementCode2"));// エレメントコード２
        //lBasic.setStndrdName2(lResultSet.getString("stndrdName2"));// 規格名２
        //lBasic.setElementName2(lResultSet.getString("elementName2"));// エレメント名２
        lBasic.setAmount(lResultSet.getString("amount"));// 数量
        lBasic.setAssignAmount(lResultSet.getString("assignAmount"));// 数量
        lBasic.setRsrvAmount(lResultSet.getString("rsrvAmount"));// 予約可数量
        lBasic.setSplitFlg(lResultSet.getString("splitFlg"));// 割当分割可能
        lBasic.setReserveFlg(lResultSet.getString("reserveFlg"));// 予約状態フラグ
        lBasic.setReserveDateTime(SIDBUtil.getDateTime(lResultSet.getTimestamp("reserveDateTime")));// 予約日時
        lBasic.setSellFromDate(SIDBUtil.getDate(lResultSet.getTimestamp("SellFromDate")));// 発売日
        lBasic.setShipMailDateTime(lResultSet.getString("shipMailDateTime"));// 入荷メール送信日（＋７）
        lBasic.setColorName(lResultSet.getString("ColorName"));
        lBasic.setUsedNewFlg(lResultSet.getInt("UsedNewFlg"));
        //lBasic.setCmdtyFullName(lBasic.getCmdtyFullName(lConnection));
        lResultColl.add(lBasic);
      }
    } catch (Exception ex) {
      throw new SIDBAccessException(ex);
    } finally {
      SIDBUtil.close(lResultSet, lStatement);
    }
    return lResultColl;
  }
  

  /**
   * <b>getReserveList</b> 条件に合ったレコードを検索して、結果のコネクションを作成して、戻します。
   * 
   * @param lConnection データベースへの接続コネクション
   * @return レコードのセット
   * @throws なし
   */
  public static Collection getReserveList(Connection lConnection, String custCode) throws SIDBAccessException {
    if (SIUtil.isNull(custCode)) return new ArrayList();
    Statement lStatement = null;
    ResultSet lResultSet = null;
    SIReserveOrder lBasic = new SIReserveOrder();
    StringBuffer lSqlBuf = new StringBuffer();
    Collection lResultColl = new ArrayList();
    
    lSqlBuf.append("SELECT a.ShopCode, a.ReserveCode, a.CmdtyCode ,a.IndividualCode ");
    lSqlBuf.append(", a.CmdtyName, a.AssignAmount, a.ReserveDateTime, b.BranchName ");
    lSqlBuf.append(", CASE i.taxflg WHEN '1' THEN i.unitprice * (100 + (SELECT taxrate FROM taxvw)) / 100 ELSE i.unitprice END AS bgPrice ");
    lSqlBuf.append(", CASE i.taxflg WHEN '0' THEN '（非課税）' ELSE '（税込）' END AS taxFlgName ");
    lSqlBuf.append("FROM ReserveOrderTbl AS a, BranchTbl AS b ,cmdtyunittbl i ");
    lSqlBuf.append("WHERE a.CustCode = ").append(SIDBUtil.SQL2Str(custCode," "));
    lSqlBuf.append("AND a.ReserveBranch = b.BranchCode ");
    lSqlBuf.append("AND a.CmdtyCode = i.CmdtyCode AND a.Individualcode = i.IndividualCode ");
    lSqlBuf.append("AND a.ReserveFlg='1' ");
    lSqlBuf.append("ORDER BY a.ReserveDateTime DESC, a.ReserveCode ASC");
    
    log.debug("lSqlBuf=" + lSqlBuf.toString());
    // 実行
    try {
      lStatement = lConnection.createStatement();
      lResultSet = lStatement.executeQuery(lSqlBuf.toString());
      
      // 商品レコードのセットの作成
      while (lResultSet.next()) {
        lBasic = new SIReserveOrder();
        lBasic.setEncode(SIConfig.SIENCODE_NONE);
        lBasic.setShopCode(lResultSet.getString("ShopCode"));// ショップコード
        lBasic.setReserveCode(lResultSet.getString("ReserveCode"));// 予約コード
        lBasic.setCmdtyCode(lResultSet.getString("CmdtyCode"));// 商品コード
        lBasic.setIndividualCode(lResultSet.getString("IndividualCode"));// 在庫コード
        lBasic.setCmdtyName(lResultSet.getString("CmdtyName"));// 商品名
        lBasic.setAssignAmount(lResultSet.getString("AssignAmount"));// 数量
        lBasic.setReserveBranchName(lResultSet.getString("BranchName"));// 割当支店
        lBasic.setCalcUnitPrice(lResultSet.getString("bgPrice"));// 単価
        lBasic.setTaxFlg(lResultSet.getString("taxFlgName"));// 税区分
        lBasic.setReserveDateTime(SIDBUtil.getDateTime(lResultSet.getTimestamp("reserveDateTime")));// 予約日時
        lResultColl.add(lBasic);
      }
    } catch (Exception ex) {
      throw new SIDBAccessException(ex);
    } finally {
      SIDBUtil.close(lResultSet, lStatement);
    }
    return lResultColl;
  }
  
}
