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

import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Iterator;

import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import jp.co.sint.basic.SICartCmdty;
import jp.co.sint.basic.SIReserveCartManager;
import jp.co.sint.basic.SIReserveOrder;
import jp.co.sint.basic.SIUserInfo;
import jp.co.sint.beans.front.UIMain;
import jp.co.sint.beans.front.UIReserve;
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.SIDatabaseConnection;
import jp.co.sint.database.SIDateTimeType;
import jp.co.sint.database.SIDeleteRec;
import jp.co.sint.database.SIDuplicateKeyException;
import jp.co.sint.database.SIInsertRec;
import jp.co.sint.database.SIModifyRec;
import jp.co.sint.database.SISpcType;
import jp.co.sint.mail.SISendMail;
import jp.co.sint.servlet.SIServlet;
import jp.co.sint.tools.SIBGUtil;
import jp.co.sint.tools.SICustomError;
import jp.co.sint.tools.SICustomErrors;
import jp.co.sint.tools.SIDateTime;
import jp.co.sint.tools.SIFatalException;
import jp.co.sint.tools.SIHTMLUtil;
import jp.co.sint.tools.SIURLMap;
import jp.co.sint.tools.SIUtil;
import jp.co.sint.tools.SIURLParameter;// 7.1.1 ST0236 追加

import org.apache.log4j.Category;

/**
 * @version $Id: SICustomerSrv.java,v 1.0 2003/10/24 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/10/24 15:00:05 Original
 */
public class SIReserveSrv extends SIServlet {
  
  // ログ用のインスタンスの生成
  private static Category log = Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);
  
  /**
   * <b>doUpdate</b> HTTP リクエストの処理
   * 
   * @param request リクエスト
   * @param response
   * @return なし
   * @throws ServletException
   * @throws IOException
   */
  public void doUpdate(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    HttpSession session = request.getSession(true);// セッションの取得
    SIDatabaseConnection databaseConnection = new SIDatabaseConnection();// DBへのコネクションの作成
    SIURLParameter urlParam = new SIURLParameter(request);// 7.1.1 ST0236 追加
    try {
      Connection lConnection = databaseConnection.getConnection();
      
      String actionName = this.getActionName(urlParam);// 画面からのアクション
      String editMode = this.getEditMode(urlParam);// DBへの編集モード
      SIUserInfo lUserInfo = SIHTMLUtil.getUserInfo(request);// ログイン情報の取得
      
      if (this.getServletPath(request).equals("/reserve")) {// 商品予約
        if (SIConfig.SIACTION_CONFIRM.equals(actionName) || SIUtil.isNull(actionName)) {
          boolean lResult = true;
          UIReserve reserve = (UIReserve) session.getAttribute(SIConfig.SISESSION_RESERVE_EDIT_NAME);
          if (reserve == null) {
            lResult = false;
          } else if (SIConfig.SIACTION_CONFIRM.equals(actionName)) {// 予約数量の変更
            reserve.initAmount1(request, urlParam);
            session.setAttribute(SIConfig.SISESSION_RESERVE_EDIT_NAME, reserve);
            lResult = reserve.validateAmount(false, request, lConnection);
          }
          
          if (reserve == null) {
            redirectKey(request, response, "webshop.servlet.front.main");
          } else if (!lResult) {// 予約数量のチェック
            forwardKey(request, response, "webshop.jsp.front.reserve");
          } else {
            if (Integer.parseInt(reserve.getAmountTxt()) < 1) {
              redirectKey(request, response, "webshop.servlet.front.main");
            } else if (lUserInfo.isNotLogin(request)) {
              redirectHttps(request, response, SIURLMap.getUrl("webshop.servlet.front.user.login") + "?nid=" + SIURLMap.getUrl("webshop.servlet.front.reserve"));
            } else {// チェックOKかつログインした
              // 予約商品を登録
              try {
                insertReserveOrderTbl(databaseConnection.getConnection(), reserve, lUserInfo);
                session.setAttribute(SIConfig.SISESSION_RESERVE_EDIT_NAME, reserve);
                try {
                  databaseConnection.getConnection().commit();
                } catch (SQLException sqle) {}
              } catch (SIDBAccessException sqle) {
                try {
                  databaseConnection.getConnection().rollback();
                } catch (SQLException ee) {}
                sqle.printStackTrace();
                SICustomErrors errors = new SICustomErrors();
                errors.addError(new SICustomError("database.execute.error"));
                request.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY, errors);
                forwardKey(request, response, "webshop.jsp.front.reserve");
              }
              forwardKey(request, response, "webshop.jsp.front.reserveresult");
            }
          }
        } else if (SIConfig.SIACTION_NEW.equals(actionName)) {// 商品予約画面を開く
          UIReserve reserve = new UIReserve();
          reserve.init(request, urlParam);
          session.setAttribute(SIConfig.SISESSION_RESERVE_EDIT_NAME, reserve);
          forwardKey(request, response, "webshop.jsp.front.reserve");
        } else if (SIConfig.SIACTION_BACK.equals(actionName)) {
          UIReserve reserve = (UIReserve) session.getAttribute(SIConfig.SISESSION_RESERVE_EDIT_NAME);
          if (reserve != null && reserve.getReserveOrder() != null && SIUtil.isNotNull(reserve.getReserveOrder().getReserveCode())) {
            forwardKey(request, response, "webshop.jsp.front.reserveresult");
          } else {
            forwardKey(request, response, "webshop.jsp.front.reserve");
          }
        }
      } else if (this.getServletPath(request).equals("/reservelist")) {// 予約確認
        if (SIConfig.SIACTION_MODIFY.equals(actionName)) {// 商品数変更
          if (lUserInfo.isNotLogin(request)) {
            forwardKey(request, response, "webshop.jsp.front.tmout.info");
            return;
          }
          UIReserve reserve = new UIReserve();
          reserve.initAmount2(request, urlParam);// 7.1.1 ST0236 修正
          session.setAttribute(SIConfig.SISESSION_RESERVE_LIST_NAME, reserve);
          if (reserve.validateAmount(true, request, databaseConnection.getConnection())) {
            try {
              updateReserveOrderAmount(databaseConnection.getConnection(), reserve, lUserInfo);
              try {
                databaseConnection.getConnection().commit();
              } catch (SQLException sqle) {}
            } catch (SIDBAccessException e) {
              try {
                databaseConnection.getConnection().rollback();
              } catch (SQLException sqle) {}
              e.printStackTrace();
              SICustomErrors errors = new SICustomErrors();
              errors.addError(new SICustomError("database.execute.error"));
              request.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY, errors);
            }
          }
          forwardKey(request, response, "webshop.jsp.front.reservelist");
        } else if (SIUtil.isNull(actionName) || SIConfig.SIACTION_BACK.equals(actionName)) {
          UIReserve reserve = new UIReserve();
          if (SIConfig.SIACTION_BACK.equals(actionName)) {
            reserve = (UIReserve) session.getAttribute(SIConfig.SISESSION_RESERVE_LIST_NAME);
          } else {
            reserve.initList(request, urlParam);// 7.1.1 ST0236 修正
            session.setAttribute(SIConfig.SISESSION_RESERVE_LIST_NAME, reserve);
          }
          
          if (lUserInfo.isNotLogin(request)) {
            redirectHttps(request, response, SIURLMap.getUrl("webshop.servlet.front.user.login") + "?nid=" + SIURLMap.getUrl("webshop.servlet.front.reservelist"));
          } else {
            SIReserveCartManager lReserveCartManager = (SIReserveCartManager) session.getAttribute(SIConfig.SISESSION_RESERVE_CART_INFO_NAME);
            if (lReserveCartManager == null) lReserveCartManager = new SIReserveCartManager();
            try {
              checkReserveCart(lConnection, lUserInfo.getCustCode(), lReserveCartManager);
              try {
                databaseConnection.getConnection().commit();
              } catch (SQLException sqle) {}
            } catch (SIDBAccessException e) {
              try {
                databaseConnection.getConnection().rollback();
              } catch (SQLException sqle) {}
              e.printStackTrace();
              SICustomErrors errors = new SICustomErrors();
              errors.addError(new SICustomError("database.execute.error"));
              request.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY, errors);
            }
            // 予約商品を登録
            forwardKey(request, response, "webshop.jsp.front.reservelist");
          }
        } else if (SIConfig.SIACTION_CART.equals(actionName)) {// 商品購入
          if (lUserInfo.isNotLogin(request)) {
            forwardKey(request, response, "webshop.jsp.front.tmout.info");
            return;
          }
          
          Connection connection = databaseConnection.getConnection();
          try {
            // カート登録
            UIReserve lReserve = new UIReserve();
            lReserve.initCart(urlParam);// 7.1.1 ST0236 修正
            if (lReserve.validateCart(request, connection)) {// 正しい予約商品のチェック
              lReserve.addCart(request, connection);
              // 予約を注文済み状態に変更
              updateReserveOrderStatus(connection, lUserInfo, lReserve.getReserveCodeTxt(), "3");
              request.setAttribute(SIConfig.SIMESSAGE_ATTRIBUTE_RESULT_NAME, "カートに追加しました。");
              try {
                databaseConnection.getConnection().commit();
              } catch (SQLException sqle) {}
            }
          } catch (SIDBAccessException sqle) {
            try {
              databaseConnection.getConnection().rollback();
            } catch (SQLException ee) {}
            sqle.printStackTrace();
            SICustomErrors errors = new SICustomErrors();
            errors.addError(new SICustomError("database.execute.error"));
            request.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY, errors);
            forwardKey(request, response, "webshop.jsp.front.mypage");
          }
          forwardKey(request, response, "webshop.jsp.front.cart.main");
        } else if (SIConfig.SIACTION_CLEAR.equals(actionName) || SIConfig.SIACTION_DELETE.equals(actionName)) {
          if (lUserInfo.isNotLogin(request)) {
            forwardKey(request, response, "webshop.jsp.front.tmout.info");
            return;
          }
          Connection connection = databaseConnection.getConnection();
          UIReserve lReserve = new UIReserve();
          lReserve.initCancel(request, urlParam);
          try {
            // 予約をキャンセル
            if (lReserve.validateCancel(request, connection)) {
              SIBGUtil.sendReserveDeleteMail(lConnection, lReserve.getReserveCodeTxt(), "");
              updateReserveOrderStatus(connection, lUserInfo, lReserve.getReserveCodeTxt(), "2");
              SICustomErrors errors = new SICustomErrors();
              errors.addError(new SICustomError("manager.message.success.cancel"));
              request.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY, errors);
              try {databaseConnection.getConnection().commit();} catch (SQLException sqle) {}
            }
          } catch (SIDBAccessException sqle) {
            try {databaseConnection.getConnection().rollback();} catch (SQLException ee) {}
            sqle.printStackTrace();
            SICustomErrors errors = new SICustomErrors();
            errors.addError(new SICustomError("database.execute.error"));
            request.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY, errors);
          }
          if (SIConfig.SIACTION_CLEAR.equals(actionName)) {
            forwardKey(request, response, "webshop.jsp.front.reservelist");
          } else if(SIConfig.SIACTION_DELETE.equals(actionName)){
            forwardKey(request, response, "webshop.jsp.front.mypage");
          }
        } else if (SIConfig.SIACTION_LIST.equals(actionName)) {
          UIReserve reserve = new UIReserve();
          reserve.initList(request, urlParam);// 7.1.1 ST0236 修正
          session.setAttribute(SIConfig.SISESSION_RESERVE_LIST_NAME, reserve);
          forwardKey(request, response, "webshop.jsp.front.reservelist");
        }
      }
    } catch (SQLException e) {
      e.printStackTrace();
      throw new ServletException();
    } catch (NamingException e) {
      e.printStackTrace();
      throw new ServletException();
    } finally {
      databaseConnection.close();
    }
  }
  
  /**
   * <b>insertReserveOrderTbl</b> 予約商品を新規登録します。
   * 
   * @param lConnection DBへのコネクション
   * @param reserve 挿入するデータ
   * @param lUserInfo 顧客情報
   * @return なし
   * @throws SIDBAccessException
   */
  private void insertReserveOrderTbl(Connection lConnection, UIReserve reserve, SIUserInfo lUserInfo) throws SIDBAccessException {
    String lReserveDateTime = (new SIDateTime()).getFullDateTime();
    // 予約番号の采番
    String lReserveOrderCode = SIDBUtil.getFirstData(lConnection, SIDBUtil.getNextVal("RESERVEORDERTBL_RESERVECD_SEQ"));
    SICartCmdty lCartCmdty = new SICartCmdty(reserve.getRsrvShopCodeTxt(), reserve.getRsrvCmdtyCodeTxt(), reserve.getRsrvIndividualCodeTxt(), reserve.getRsrvStndrdCodeTxt1(),
        reserve.getRsrvElementCodeTxt1(), reserve.getRsrvStndrdCodeTxt2(), reserve.getRsrvElementCodeTxt2());
    lCartCmdty.reset(lConnection);
    
    SIInsertRec lRec = new SIInsertRec("ReserveOrderTbl");
    lRec.add("ReserveCode", lReserveOrderCode);// 予約番号
    lRec.add("CustCode", lUserInfo.getCustCode());// 顧客コード
    lRec.add("CustName", lUserInfo.getCustName());// 顧客名
    lRec.add("CustPronName", lUserInfo.getCustPronName());// 顧客名カナ
    lRec.add("Email", lUserInfo.getEmail());// EMAIL
    lRec.add("ShopCode", reserve.getRsrvShopCodeTxt());// ショップコード
    lRec.add("ShopName", lCartCmdty.getFrontShopName());// ショップ名
    lRec.add("CmdtyCode", reserve.getRsrvCmdtyCodeTxt());// 商品コード
    lRec.add("IndividualCode", reserve.getRsrvIndividualCodeTxt());// 在庫コード 7.3.0 PI-NES0501 追加
    lRec.add("CmdtyName", lCartCmdty.getCmdtyName());// 商品名
    lRec.add("StndrdCode1", reserve.getRsrvStndrdCodeTxt1());// 規格コード１
    lRec.add("ElementCode1", reserve.getRsrvElementCodeTxt1());// エレメントコード１
    lRec.add("StndrdCode2", reserve.getRsrvStndrdCodeTxt2());// 規格コード２
    lRec.add("ElementCode2", reserve.getRsrvElementCodeTxt2());// エレメントコード２
    lRec.add("Amount", reserve.getAmountTxt());// 数量
    lRec.add("SplitFlg", reserve.getSplitFlgRdo());// 分割可能
    if (SIDBMultiConf.SIDB_CURRENT_INX == SIDBMultiConf.SIDB_POSTGRESQL_INX) {
      lRec.add("ReserveDateTime", lReserveDateTime);// 予約日時
    } else {
      lRec.add("ReserveDateTime", new SIDateTimeType(lReserveDateTime));// 予約日時
    }
    lRec.add("ReserveFlg", "0");// 予約状態フラグ
    lRec.add("ArrivalScheduleMsg",lCartCmdty.getArrivalScheduleMsg());// 入荷時期コメント
    
    try {
      // 商品マスタテーブルの挿入
      lRec.execute(lConnection);
      String rsrvAmount = SIDBUtil.getFirstData(lConnection, "SELECT rsrvamount FROM individualtbl WHERE cmdtycode='" + reserve.getRsrvCmdtyCodeTxt() + "' AND individualcode='"
          + reserve.getRsrvIndividualCodeTxt() + "'");
      SIModifyRec lMod = new SIModifyRec("Individualtbl");
      if (SIUtil.isNotNull(rsrvAmount)) {
        lMod.addCondition("CmdtyCode", reserve.getRsrvCmdtyCodeTxt());// 商品コード
        lMod.addCondition("IndividualCode", reserve.getRsrvIndividualCodeTxt());// 在庫コード
        lMod.add("RsrvAmount", SIUtil.sub(rsrvAmount, reserve.getAmountTxt()));
        lMod.execute(lConnection);
      }
      reserve.setReserveCodeTxt(lReserveOrderCode);
    } catch (SIDuplicateKeyException e) {
      throw new SIDBAccessException(e);
    }
    
    // 予約受付メールを送信
    StringBuffer lMailBuf = new StringBuffer();
    SISendMail lSendMail = new SISendMail();
    try {
      lSendMail.setMailTemp(lConnection, reserve.getRsrvShopCodeTxt(), SIConfig.SIMAIL_TEMPLATE_RESERVE_COMFIRM);
    } catch (SIFatalException e2) {
      e2.printStackTrace();
    }
    
    lMailBuf.append("\n予約日時:" + lReserveDateTime);
    lMailBuf.append("\n予約番号:" + lReserveOrderCode);
    
    // メールの本文の作成(予約商品情報)
    lMailBuf.append("\n\nご予約商品");
    lMailBuf.append("\n=============");
    lMailBuf.append("\n商品コード:").append(lCartCmdty.getIndividualCode());
    lMailBuf.append("\n商品名:").append(lCartCmdty.getCmdtyName());
    lMailBuf.append("\n予約数:").append(reserve.getAmountTxt());
    lMailBuf.append("\n=============");
    
    // 14.メールの本文の作成(メールテンプレートの内容2)
    lMailBuf.append("\n");
    lSendMail.appendContent1(lMailBuf.toString());
    lMailBuf = new StringBuffer();
    // 18.メールの本文の作成(メールテンプレートの内容3)
    lSendMail.appendContent2(lMailBuf.toString());
    
    // 21.送信開始
    try {
      lSendMail.setToMailAddress(lUserInfo.getEmail());
      lSendMail.execute();
    } catch (SIFatalException e) {
      e.printStackTrace();
    }
  }
  
  private void deleteReserveOrder(Connection lConnection, SIUserInfo lUserInfo, UIReserve reserve) throws SIDBAccessException {
    SIDeleteRec lRec = new SIDeleteRec("ReserveOrderTbl");
    lRec.addCondition("ReserveCode", reserve.getReserveCodeTxt());
    lRec.addCondition("CustCode", lUserInfo.getCustCode());
    lRec.addCondition("ReserveFlg", "5");
    
    try {
      lRec.execute(lConnection);
    } catch (SIDuplicateKeyException e) {
      throw new SIDBAccessException();
    }
  }
  
  /**
   * <b>updateReserveOrderAmount</b> 予約商品を変更します。
   * 
   * @param lConnection DBへのコネクション
   * @param reserve 挿入するデータ
   * @param lUserInfo 顧客情報
   * @return なし
   * @throws SIDBAccessException
   */
  private void updateReserveOrderAmount(Connection lConnection, UIReserve reserve, SIUserInfo lUserinfo) throws SIDBAccessException {
    SIModifyRec lRec = new SIModifyRec("ReserveOrderTbl");
    lRec.addCondition("ReserveCode", reserve.getReserveCodeTxt());
    lRec.add("Amount", reserve.getAmountTxt());
    lRec.add("SplitFlg", reserve.getSplitFlgRdo());
    
    try {
      lRec.execute(lConnection);
      
      // 予約変更メールを送信
      StringBuffer lMailBuf = new StringBuffer();
      SISendMail lSendMail = new SISendMail();
      SICartCmdty lCartCmdty = new SICartCmdty(reserve.getRsrvShopCodeTxt(), reserve.getRsrvCmdtyCodeTxt(), reserve.getRsrvIndividualCodeTxt(),// 7.3.0 PI-NES0501 追加
          reserve.getRsrvStndrdCodeTxt1(), reserve.getRsrvElementCodeTxt1(), reserve.getRsrvStndrdCodeTxt2(), reserve.getRsrvElementCodeTxt2());
      lCartCmdty.reset(lConnection);
      try {
        lSendMail.setMailTemp(lConnection, reserve.getRsrvShopCodeTxt(), SIConfig.SIMAIL_TEMPLATE_RESERVE_CHANGE);
      } catch (SIFatalException e2) {
        e2.printStackTrace();
      }
      
      String lReserveChangeDateTime = (new SIDateTime()).getFullDateTime();
      lMailBuf.append("\n変更日時:" + lReserveChangeDateTime);
      lMailBuf.append("\n予約番号:" + reserve.getReserveCodeTxt());
      
      // メールの本文の作成(予約商品情報)
      lMailBuf.append("\n\nご予約商品");
      lMailBuf.append("\n=============");
      lMailBuf.append("\n商品コード:").append(lCartCmdty.getIndividualCode());
      lMailBuf.append("\n商品名:").append(lCartCmdty.getCmdtyName());
      lMailBuf.append("\n予約数:").append(reserve.getAmountTxt());
      lMailBuf.append("\n=============");
      
      // 14.メールの本文の作成(メールテンプレートの内容2)
      lMailBuf.append("\n");
      lSendMail.appendContent1(lMailBuf.toString());
      lMailBuf = new StringBuffer();
      // 18.メールの本文の作成(メールテンプレートの内容3)
      lSendMail.appendContent2(lMailBuf.toString());
      
      // 21.送信開始
      try {
        lSendMail.setToMailAddress(lUserinfo.getEmail());
        lSendMail.execute();
      } catch (SIFatalException e) {
        e.printStackTrace();
      }
      
    } catch (SIDuplicateKeyException e) {
      throw new SIDBAccessException();
    }
  }
  
  /**
   * <b>updateReserveOrderStatus</b> 予約商品を変更します。
   * 
   * @param lConnection DBへのコネクション
   * @param reserve 挿入するデータ
   * @param lUserInfo 顧客情報
   * @return なし
   * @throws SIDBAccessException
   */
  private void updateReserveOrderStatus(Connection lConnection, SIUserInfo lUserInfo, String ReserveCode, String lReserveFlg) throws SIDBAccessException {
    try {
      SIReserveOrder lReserveOrder = new SIReserveOrder(ReserveCode);
      lReserveOrder.reset(lConnection);
      
      // 1.予約フラグの更新
      SIModifyRec lRec = new SIModifyRec("ReserveOrderTbl");
      lRec.addCondition("ReserveCode", ReserveCode);// 予約番号
      lRec.addCondition("CustCode", lUserInfo.getCustCode());// 顧客コード
      lRec.add("ReserveFlg", lReserveFlg);// 予約状態フラグ
      if (lReserveFlg.equals("2")) lRec.add("ReserveBranch", "");
      lRec.execute(lConnection);
      
      if (lReserveFlg.equals("2")) {
        // 予約キャンセルメールを送信
        StringBuffer lMailBuf = new StringBuffer();
        SISendMail lSendMail = new SISendMail();
        SICartCmdty lCartCmdty = new SICartCmdty(lReserveOrder.getShopCode(), lReserveOrder.getCmdtyCode(), lReserveOrder.getIndividualCode(),// 7.3.0 PI-NES0501 追加
            lReserveOrder.getStndrdCode1(), lReserveOrder.getElementCode1(), lReserveOrder.getStndrdCode2(), lReserveOrder.getElementCode2());
        lCartCmdty.reset(lConnection);
        try {
          lSendMail.setMailTemp(lConnection, lReserveOrder.getShopCode(), SIConfig.SIMAIL_TEMPLATE_RESERVE_CANCEL);
        } catch (SIFatalException e2) {
          e2.printStackTrace();
        }
        
        String lReserveChangeDateTime = (new SIDateTime()).getFullDateTime();
        lMailBuf.append("\nキャンセル日時：" + lReserveChangeDateTime);
        lMailBuf.append("\n予約番号:" + lReserveOrder.getReserveCode());
        
        // メールの本文の作成(予約商品情報)
        lMailBuf.append("\n\nキャンセル商品");
        lMailBuf.append("\n=============");
        lMailBuf.append("\n商品コード:").append(lReserveOrder.getIndividualCode());
        lMailBuf.append("\n商品名:").append(lReserveOrder.getCmdtyName());
        lMailBuf.append("\n予約数:").append(lReserveOrder.getAmount());
        lMailBuf.append("\n=============");
        
        // 14.メールの本文の作成(メールテンプレートの内容2)
        lMailBuf.append("\n");
        lSendMail.appendContent1(lMailBuf.toString());
        lMailBuf = new StringBuffer();
        // 18.メールの本文の作成(メールテンプレートの内容3)
        lSendMail.appendContent2(lMailBuf.toString());
        
        // 21.送信開始
        try {
          lSendMail.setToMailAddress(lReserveOrder.getCurrentEmail());// 7.2.0 ST1018 修正
          lSendMail.execute();
        } catch (SIFatalException e) {
          e.printStackTrace();
        }
      }
      
      // 7.3.0 PI-NES0501 修正 ここから
      StringBuffer lSqlBuf = new StringBuffer();
      lSqlBuf.append("SELECT AmountFlg FROM IndividualTbl ");
      lSqlBuf.append(" WHERE ShopCode=").append(SIDBUtil.SQL2Str(lReserveOrder.getShopCode(), " "));
      lSqlBuf.append(" AND CmdtyCode=").append(SIDBUtil.SQL2Str(lReserveOrder.getCmdtyCode(), " "));
      lSqlBuf.append(" AND IndividualCode=").append(SIDBUtil.SQL2Str(lReserveOrder.getIndividualCode(), " "));
      String lAmountFlg = SIDBUtil.getFirstData(lConnection, lSqlBuf.toString());
      // 在庫数量管理かつキャンセルかつ割当済みの場合には、割当済み数量を在庫に戻る
      if (lAmountFlg.equals("1") && lReserveFlg.equals("2") && lReserveOrder.getReserveFlg().equals("1")) {// キャンセル
      
        SISpcType lSpc = new SISpcType("Amount+" + lReserveOrder.getAssignAmount());
        
        // 在庫数量の更新
        lRec = new SIModifyRec("StoreStockTbl");
        lRec.addCondition("CmdtyCode", lReserveOrder.getCmdtyCode());
        lRec.addCondition("IndividualCode", lReserveOrder.getIndividualCode());
        lRec.addCondition("BranchCode", lReserveOrder.getReserveBranchCode());
        lRec.add("Amount", lSpc);
        lRec.execute(lConnection);
      }
      // キャンセル時に予約可能数が無制限でない場合、予約可能数を商品マスタに引き戻す
      if (lReserveFlg.equals("2") && !lReserveOrder.getRsrvAmount().equals("")) {// キャンセル
        SISpcType lSpc = new SISpcType("RsrvAmount+" + lReserveOrder.getAmount());
        
        // 予約可能数量の更新
        lRec = new SIModifyRec("IndividualTbl");
        lRec.addCondition("CmdtyCode", lReserveOrder.getCmdtyCode());
        lRec.addCondition("IndividualCode", lReserveOrder.getIndividualCode());
        lRec.add("RsrvAmount", lSpc);
        lRec.execute(lConnection);
      }
    } catch (SIDuplicateKeyException e) {
      throw new SIDBAccessException(e);
    } catch (SIDBAccessException e) {
      throw new SIDBAccessException(e);
    }
  }
  
  /**
   * <b>updateReserveOrderStatus</b> 予約商品を変更します。
   * 
   * @param lConnection DBへのコネクション
   * @param reserve 挿入するデータ
   * @param lUserInfo 顧客情報
   * @return なし
   * @throws SIDBAccessException
   */
  private void checkReserveCart(Connection lConnection, String lCustCode, SIReserveCartManager lReserveCartManager) throws SIDBAccessException {
    HashMap lReserveCart = lReserveCartManager.getReserveCodes();
    Iterator lIta = lReserveCart.keySet().iterator();
    String lCode = "";
    int count = 0;
    while (lIta.hasNext()) {
      lCode = lCode + lIta.next();
      count++;
      if (count != lReserveCart.size()) lCode = lCode + ",";
    }
    Statement lStatement = null;
    ResultSet lResultSet = null;
    StringBuffer lSqlBuf = new StringBuffer();
    lSqlBuf.append("SELECT ReserveCode FROM ReserveOrderTbl ");
    lSqlBuf.append("WHERE CustCode=").append(SIDBUtil.SQL2Str(lCustCode, " "));
    lSqlBuf.append("AND ReserveFlg=").append(SIDBUtil.SQL2Str("3", " "));
    if (SIUtil.isNotNull(lCode)) lSqlBuf.append("AND ReserveCode NOT IN(").append(lCode).append(")");
    log.debug("lSqlBuf=" + lSqlBuf.toString());
    try {
      lStatement = lConnection.createStatement();
      lResultSet = lStatement.executeQuery(lSqlBuf.toString());
      while (lResultSet.next()) {
        SIModifyRec lRec = new SIModifyRec("ReserveOrderTbl");
        lRec.addCondition("ReserveCode", lResultSet.getString("ReserveCode"));
        lRec.addCondition("CustCode", lCustCode);
        lRec.add("ReserveFlg", "1");
        lRec.execute(lConnection);
      }
    } catch (Exception e) {
      throw new SIDBAccessException(e);
    } finally {
      SIDBUtil.close(lResultSet, lStatement);
    }
  }
}
