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

import java.sql.Connection;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;

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

import jp.co.sint.basic.SICartCmdty;
import jp.co.sint.basic.SICartDetail;
import jp.co.sint.basic.SICartManager;
import jp.co.sint.basic.SICasherBasic;
import jp.co.sint.basic.SICmdty;
import jp.co.sint.basic.SICustAddress;
import jp.co.sint.basic.SIOrderDelivery;
import jp.co.sint.basic.SIOrderDetail;
import jp.co.sint.basic.SIOrderDetailPK;
import jp.co.sint.basic.SIOrderSetCmdty;
import jp.co.sint.basic.SIReserveCartManager;
import jp.co.sint.basic.SIUserInfo;
import jp.co.sint.config.SIConfig;
import jp.co.sint.database.SIModifyRec;
import jp.co.sint.tools.SICheckDataConf;
//7.1.1 ST0211 削除 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.SIHTMLUtil;
import jp.co.sint.tools.SIUtil;
import jp.co.sint.tools.SIBGUtil;
import jp.co.sint.tools.SIURLParameter;//7.1.1 ST0236 追加

import org.apache.log4j.Category;

/**
 * @version $Id: UIOrderCounter.java,v 1.0 2003/11/18 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   2003/11/18 10:03:15  Original
 */
public class UIOrderCounter extends SICasherBasic{
  //ログ用のインスタンスの生成
  private static Category log=Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);
  
  private HashMap deliveryDetailMap=new HashMap();
  
  private HashMap amountMap=new HashMap();
  
  private HashMap deliveryTypeMap=new HashMap();
  
  private String addressCode="";
  
  private String pageNumberTxt_Order="1";
  
  private String pageNumberTxt_Cust="1";
  
  private String pageNumberTxt_Cmdty="1";
  
  public UIOrderCounter(){}
  
  public void setAmount(String lName,String lValue){
    lValue=SIUtil.str2Int(lValue);//7.1.1 ST0177 追加
    if (SIUtil.isNull(lName)) return ;
    if (SIUtil.isNull(lValue))lValue="";
    else lValue=SIUtil.changeTo(lValue.trim(),this.encode);
    amountMap.put(lName,lValue);
  }
  
  public void setDeliveryType(String lName,String lValue){
    if (SIUtil.isNull(lName)) return ;
    if (SIUtil.isNull(lValue))lValue="";
    else lValue=SIUtil.changeTo(lValue.trim(),this.encode);
    deliveryTypeMap.put(lName,lValue);
  }
  
  public void setPageNumberTxt_Order(String string) {
    if (SIUtil.isNull(string)) string = "1";
    pageNumberTxt_Order = SIUtil.changeTo(string.trim(), this.encode);
  }
  
  public void setPageNumberTxt_Cust(String string) {
    if (SIUtil.isNull(string)) string = "1";
    pageNumberTxt_Cust = SIUtil.changeTo(string.trim(), this.encode);
  }
  
  public void setPageNumberTxt_Cmdty(String string) {
    if (SIUtil.isNull(string)) string = "1";
    pageNumberTxt_Cmdty = SIUtil.changeTo(string.trim(), this.encode);
  }
  
  public String getAmount(String lName){
    String lValue=(String)amountMap.get(lName);
    if (SIUtil.isNull(lValue)) return "";
    else return lValue;
  }
  
  public String getTotalAmount(SICartCmdty lCartCmdty){
    String lPreName=SIConfig.SIPREFIX_ORDER_COUNTER_AMOUNT_NAME+
                    lCartCmdty.getShopCode()+SIConfig.SIWEBSHOPPING_TOKEN+
                    lCartCmdty.getCmdtyCode()+SIConfig.SIWEBSHOPPING_TOKEN+
                    lCartCmdty.getIndividualCode()+SIConfig.SIWEBSHOPPING_TOKEN+
                    lCartCmdty.getStndrdCode1()+SIConfig.SIWEBSHOPPING_TOKEN+
                    lCartCmdty.getElementCode1()+SIConfig.SIWEBSHOPPING_TOKEN+
                    lCartCmdty.getStndrdCode2()+SIConfig.SIWEBSHOPPING_TOKEN+
                    lCartCmdty.getElementCode2()+SIConfig.SIWEBSHOPPING_TOKEN;
    
    String lValue="0";
    Iterator lIta=amountMap.keySet().iterator();
    String lName="";
    String lResult="0";
    String lValidResult="";
    
    while (lIta.hasNext()&&Integer.parseInt(lResult)>-1){
      lName=(String)lIta.next();
      if (lName.startsWith(lPreName)){
        lValue=(String)amountMap.get(lName);
        lValidResult=SICheckValid.checkValid("数量",lValue,SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
        if (SIUtil.isNull(lValidResult)){
          lResult=SIUtil.add_LL(lResult,lValue);
        }else lResult="-1";
      }
    }
    log.debug("getTotalAmount:lResult="+lResult);
    return lResult;
  }
  
  //EDBTG003-00 elecs-matsushima add start
  public String getTotalAmountPos(SICartCmdty lCartCmdty){
    String lPreName=SIConfig.SIPREFIX_ORDER_COUNTER_AMOUNT_NAME+
                      lCartCmdty.getShopCode()+SIConfig.SIWEBSHOPPING_TOKEN+
                      lCartCmdty.getCmdtyCode()+SIConfig.SIWEBSHOPPING_TOKEN+
                      lCartCmdty.getIndividualCode()+SIConfig.SIWEBSHOPPING_TOKEN+
                      lCartCmdty.getStndrdCode1()+SIConfig.SIWEBSHOPPING_TOKEN+
                      lCartCmdty.getElementCode1()+SIConfig.SIWEBSHOPPING_TOKEN+
                      lCartCmdty.getStndrdCode2()+SIConfig.SIWEBSHOPPING_TOKEN+
                      lCartCmdty.getElementCode2()+SIConfig.SIWEBSHOPPING_TOKEN;
    
    // EDBTG003-00 [不具合管理票-No28] 2013/03/15 nagayoshi del start
//    String lPreName2= SIConfig.SIWEBSHOPPING_TOKEN + lCartCmdty.getSetCode()
//                      + SIConfig.SIWEBSHOPPING_TOKEN + lCartCmdty.getSetDetailCode();
    // EDBTG003-00 [不具合管理票-No28] 2013/03/15 nagayoshi del end
    
    String lValue="0";
    Iterator lIta=amountMap.keySet().iterator();
    String lName="";
    String lResult="0";
    String lValidResult="";
    
    while (lIta.hasNext()&&Integer.parseInt(lResult)>-1){
      lName=(String)lIta.next();
      // EDBTG003-00 [不具合管理票-No28] 2013/03/15 nagayoshi del start
//      if (lName.startsWith(lPreName) && lName.endsWith(lPreName2)){
      if (lName.startsWith(lPreName)){
      // EDBTG003-00 [不具合管理票-No28] 2013/03/15 nagayoshi del end
        lValue=(String)amountMap.get(lName);
        lValidResult=SICheckValid.checkValid("数量",lValue,SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
        if (SIUtil.isNull(lValidResult)){
          lResult=SIUtil.add_LL(lResult,lValue);
        }else lResult="-1";
      }
    }
    log.debug("getTotalAmountPos:lResult="+lResult);
    return lResult;
  }
  //EDBTG003-00 elecs-matsushima add end
  
  public String getDeliveryType(String lName){
    String lValue=(String)deliveryTypeMap.get(lName);
    if (SIUtil.isNull(lValue)) return "";
    else return lValue;
  }
  
  public String getPageNumberTxt_Order(){
    return this.pageNumberTxt_Order;
  }
  
  public String getPageNumberTxt_Cust(){
    return this.pageNumberTxt_Cust;
  }
  
  public String getPageNumberTxt_Cmdty(){
    return this.pageNumberTxt_Cmdty;
  }
  
  //7.1.1 ST0236 修正 ここから
  public void init(HttpServletRequest lRequest,Connection lConnection,SIURLParameter lUrlParam){
    this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
    super.init(lRequest,lUrlParam);
    setShopCode((String)lUrlParam.getParam("shc"));
    this.setPageNumberTxt_Order((String)lUrlParam.getParam("pageNumberTxt_order"));
    this.setPageNumberTxt_Cust((String)lUrlParam.getParam("pageNumberTxt_cust"));
    this.setPageNumberTxt_Cmdty((String)lUrlParam.getParam("pageNumberTxt_cmdty"));
    this.calcSum(lRequest,lConnection,lUrlParam);
  }
  //7.1.1 ST0236 修正 ここまで
  
  public void initAmount(HttpServletRequest lRequest,SIURLParameter lUrlParam){//7.1.1 ST0236 修正
    this.init(lRequest,lUrlParam);//7.1.1 ST0236 修正
    setShopCode((String)lUrlParam.getParam("shc"));//7.1.1 ST0236 修正
    Enumeration lNameEnum=lRequest.getParameterNames();
    String lName="";
    this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
    while (lNameEnum.hasMoreElements()){
      lName=(String)lNameEnum.nextElement();
      if (lName.startsWith(SIConfig.SIPREFIX_ORDER_COUNTER_AMOUNT_NAME)){
        log.debug("initAmount:lName=="+lName);
        setAmount(lName,(String)lUrlParam.getParam(lName));//7.1.1 ST0236 修正
      }
    }
  }
  
  public void initAmountDel(HttpServletRequest lRequest,SIURLParameter lUrlParam, String delName){
    this.init(lRequest,lUrlParam);
    setShopCode((String)lUrlParam.getParam("shc"));
    Enumeration lNameEnum=lRequest.getParameterNames();
    String lName="";
    this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
    while (lNameEnum.hasMoreElements()){
      lName=(String)lNameEnum.nextElement();
      if (lName.startsWith(SIConfig.SIPREFIX_ORDER_COUNTER_AMOUNT_NAME)){
        log.debug("initAmount:lName=="+lName);
        if(lName.equals(delName)){
          setAmount(lName,"0");
        }else{
          setAmount(lName,(String)lUrlParam.getParam(lName));
        }
      }
    }
  }
  
  public void initDeliveryType(HttpServletRequest lRequest,Connection lConnection,SIURLParameter lUrlParam){//7.1.1 ST0236 修正
    HttpSession session=lRequest.getSession(true);//セッションの取得
    HashMap detailMap=(HashMap)session.getAttribute(SIConfig.SISESSION_CART_DETAIL_NAME);
    HashMap deliveryMap=(HashMap)session.getAttribute(SIConfig.SISESSION_CART_DELIVERY_NAME);
    
    //ログインユーザーの情報の取得
    SIUserInfo lUserInfo=SIHTMLUtil.getUserInfo(lRequest);
    
    SIOrderDelivery lOrderDelivery=new SIOrderDelivery();
    SIOrderDetail lOrderDetail=new SIOrderDetail();
    SIOrderDetailPK lPk=new SIOrderDetailPK();
    SICustAddress lAddress=new SICustAddress();
    
    Enumeration lNameEnum=lRequest.getParameterNames();
    String lName="";
    String lNewDeliveryTypeName="";
    
    this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
    //7.1.1 ST0236 修正   ここから
    super.init(lRequest,lUrlParam);
    this.setPageNumberTxt_Order((String)lUrlParam.getParam("pageNumberTxt_order"));
    this.setPageNumberTxt_Cust((String)lUrlParam.getParam("pageNumberTxt_cust"));
    this.setPageNumberTxt_Cmdty((String)lUrlParam.getParam("pageNumberTxt_cmdty"));
    //7.1.1 ST0236 修正   ここまで
    
    while (lNameEnum.hasMoreElements()){
      lName=(String)lNameEnum.nextElement();
      
      if (lName.startsWith(SIConfig.SIPREFIX_ORDER_COUNTER_DELIVERY_NAME)){
        lPk=new SIOrderDetailPK();
        lPk.setFieldNameTxt(lName);
        //配送業者のデータの設定
        setDeliveryType(lName,(String)lUrlParam.getParam(lName));//7.1.1 ST0236 修正
        //最新のデータの取得
        lNewDeliveryTypeName=this.getDeliveryType(lName);
        //詳細のデータの取得
        lOrderDetail=(SIOrderDetail)detailMap.get(lPk.getOrderDetailCode());//受注明細の取得
        //受注配送先コードに基づいて、配送種別名称の取得
        lOrderDelivery=(SIOrderDelivery)deliveryMap.get(lOrderDetail.getDeliveryCode());
        
        //変わるかどうか
        if (lOrderDelivery.getDeliveryTypeName().equals(lNewDeliveryTypeName)){//変わらない
          log.debug("initDeliveryType(not changed):lNewDeliveryTypeName="+lNewDeliveryTypeName);
        }else{//変わった、再設定
          log.debug("initDeliveryType(changed):lNewDeliveryTypeName="+lNewDeliveryTypeName);
          lPk.setDeliveryTypeName(lNewDeliveryTypeName);//新規受注配送先コードの作成
          if (deliveryMap.get(lPk.getOrderDeliveryCode())==null){//これは、新規配送先レコードです
            lOrderDelivery=new SIOrderDelivery();
            lAddress=new SICustAddress(lUserInfo.getCustCode(),lPk.getAddressCode());
            lAddress.reset(lConnection);
            SICartDetail.copy(lAddress,lOrderDelivery);
            lOrderDelivery.setDeliveryCode(lPk.getOrderDeliveryCode());
            //7.2.0 ST1030 追加 ここから
            lOrderDelivery.setDeliveryTypeCode(lOrderDetail.getDeliveryTypeCode());
            //7.2.0 ST1030 追加 ここまで
            lOrderDelivery.setDeliveryTypeName(lNewDeliveryTypeName);
            deliveryMap.put(lPk.getOrderDeliveryCode(),lOrderDelivery);
          }
          lOrderDetail.setEncode(SIConfig.SIENCODE_NONE);
          lOrderDetail.setDeliveryCode(lPk.getOrderDeliveryCode());
          detailMap.put(lPk.getOrderDetailCode(),lOrderDetail);
        }
      }
    }
    
    //保存
    session.setAttribute(SIConfig.SISESSION_CART_DELIVERY_NAME,deliveryMap);
    session.setAttribute(SIConfig.SISESSION_CART_DETAIL_NAME,detailMap);
    jp.co.sint.beans.front.UICasher.reset(lRequest);//7.1.1 ST0154 追加
  }
  
  //7.1.1 ST0211 修正 ここから
  /**
   * <b>validate</b>
   * 商品数量などのチェック
   * @param  request  リクエスト
   * @param  lConnection へのコネクション
   * @return チェックの結果(true:エラーなし、false:エラーがある)
   * @throws なし
   */
  public boolean validate(HttpServletRequest lRequest,Connection lConnection){
    return validate(lRequest,lConnection,true);
  }
  
  //7.2.0 ST1030 修正 ここから
  /**
   * <b>validate</b>
   * 商品数量などのチェック
   * @param  request  リクエスト
   * @param  lConnection へのコネクション
   * @param  mode  true:フロント false:バック
   * @return チェックの結果(true:エラーなし、false:エラーがある)
   * @throws なし
   */
  public boolean validate(HttpServletRequest lRequest, Connection lConnection, boolean mode){
  //7.1.1 ST0211 修正 ここまで
    return validate(lRequest, lConnection, mode, false);
  }
  
  public boolean validate(HttpServletRequest lRequest, Connection lConnection, boolean mode, boolean updMode){
    return validate(lRequest, lConnection, mode, updMode, "");
  }
  
  /**
   * <b>validate</b>
   * 商品数量などのチェック
   * @param  request リクエスト
   * @param  lConnection コネクション
   * @param  mode     true:フロント false:バック
   * @param  updMode  true:バックの修正時 false:以外
   * @param  branch 支店コード（ブランクでない場合はレジモード扱い）
   * @return チェックの結果(true:エラーなし、false:エラーがある)
   * @throws なし
   */
  public boolean validate(HttpServletRequest lRequest, Connection lConnection, boolean mode, boolean updMode, String branch){
    //7.1.2 ST0211 修正 ここまで
    //7.2.0 ST1030 修正 ここまで
    HttpSession session=lRequest.getSession(true);//セッションの取得
    HashMap detailMap=(HashMap)session.getAttribute(SIConfig.SISESSION_CART_DETAIL_NAME);
    //7.2.0 ST1030 追加 ここから
    HashMap orgDetailMap = (HashMap)detailMap.clone();
    //7.2.0 ST1030 追加 ここまで
    SIReserveCartManager lRsrCartManager=(SIReserveCartManager)session.getAttribute(SIConfig.SISESSION_RESERVE_CART_INFO_NAME);
    if (lRsrCartManager==null)lRsrCartManager=new SIReserveCartManager();
    
    SICartManager cartMan=new SICartManager();
    SICustomErrors errors=new SICustomErrors();
    
    Iterator lIta=amountMap.keySet().iterator();
    SIOrderDetailPK lPk=new SIOrderDetailPK();
    String lAmountName="";
    String lResValidAmount="";
    
    SIOrderDetail lOrderDetail=new SIOrderDetail();
    String lKeyName="";
    SICmdty lCmdty=new SICmdty();
    
    //予約商品のチェック
    Iterator lRsrIta=lRsrCartManager.getReserveCodes().keySet().iterator();
    String lName="";
    int hCount=lRsrCartManager.getReserveCodes().size();
    int dCount=0;
    String lCode="";
    String[][] cmdtyList =new String[hCount][2];
    while (lRsrIta.hasNext()){
      lCode=(String)lRsrIta.next();
      cmdtyList[dCount][0]=lCode;
      try{cmdtyList[dCount][1]=SIBGUtil.getReserveCmdty(lCode,lConnection);}
      catch(Exception e){e.printStackTrace();}
      dCount++;
    }
    String lReserveAmount="0";
    String lAmount="0";
    SICartCmdty lCartCmdty=new SICartCmdty();
    //7.1.1 ST0211 修正 ここから
    Iterator lDetailIta=detailMap.keySet().iterator();
    HashMap lResultMap=new HashMap();
    while (lDetailIta.hasNext()){
      lName=(String)lDetailIta.next();
      lOrderDetail=(SIOrderDetail)detailMap.get(lName);
      if (lOrderDetail==null)lOrderDetail=new SIOrderDetail();
      Boolean lRes=(Boolean)lResultMap.get(lOrderDetail.getShopCode()+lOrderDetail.getCmdtyCode());
      if (lRes==null)lRes=new Boolean(false);
      
      //予約確認画面からカートに入れる商品数量の取得
      lReserveAmount=lRsrCartManager.getAmount(lOrderDetail.getShopCode(),
                                               lOrderDetail.getCmdtyCode(),
                                               lOrderDetail.getIndividualCode(),
                                               lOrderDetail.getStndrdCode1(),
                                               lOrderDetail.getElementCode1(),
                                               lOrderDetail.getStndrdCode2(),
                                               lOrderDetail.getElementCode2());
      //当分処理する商品情報の取得
      lCartCmdty=new SICartCmdty(lOrderDetail.getShopCode(),
                                 lOrderDetail.getCmdtyCode(),
                                 lOrderDetail.getIndividualCode(),
                                 lOrderDetail.getStndrdCode1(),
                                 lOrderDetail.getElementCode1(),
                                 lOrderDetail.getStndrdCode2(),
                                 lOrderDetail.getElementCode2());
      if (!lCartCmdty.reset(lConnection,mode,branch)){//在庫数量の取得
        lResultMap.put(lOrderDetail.getShopCode()+lOrderDetail.getCmdtyCode(),new Boolean(true));//既にチェックした
        errors.addError(new SICustomError("manager.app.sale.expired"));
        continue;
      }
      
      lAmount=getTotalAmount(lCartCmdty);//画面から入力した商品数量の取得
      
//      if (mode&&Integer.parseInt(lAmount)>-1){//数量のデータが正しい入力された場合
      if (mode&&!lRes.booleanValue()&&Integer.parseInt(lAmount)>-1){//数量のデータが正しい入力された場合
        lResultMap.put(lOrderDetail.getShopCode()+lOrderDetail.getCmdtyCode(),new Boolean(true));//既にチェックした
        int lCartAmount=Integer.parseInt(lAmount)-Integer.parseInt(lReserveAmount);//予約数量を除いてカート数量
        if (lCartAmount<0&&!lAmount.equals("0")){//予約数量を下回り
          errors.addError(new SICustomError("input.data.greater",lCartCmdty.getCartCmdtyName()+"に対して変更後の数量","予約商品の数量("+lReserveAmount+")"));
        }else if (lCartCmdty.getAmountFlg().equals("1")&&//在庫数の超過
                  lCartCmdty.getNoStockFlg().equals("0")&&
                  lCartAmount>Integer.parseInt(lCartCmdty.getAmountWithAllocation(lConnection,this.getOrderCode()))){
          if (Integer.parseInt(lReserveAmount)>0){
            errors.addError(new SICustomError("manager.app.exceed.amount.with.reserve",lCartCmdty.getCartCmdtyName()));
          }else if(Integer.parseInt(lCartCmdty.getAmountWithAllocation(lConnection,this.getOrderCode()))<=0) {
            errors.addError(new SICustomError("manager.app.exceed.amount.no.reserve",lCartCmdty.getCartCmdtyName()));
          }else{
            errors.addError(new SICustomError("manager.app.exceed.amount.with.cancel",lCartCmdty.getCartCmdtyName()));
          } 
        }
        if(lAmount.equals("0")&&!lReserveAmount.equals("0")){
          SIModifyRec lRec = new SIModifyRec();
          String lReserveCode="";
          String lReserveCmdty="0~"+lOrderDetail.getCmdtyCode()+"~"+lOrderDetail.getIndividualCode()+"~~~~";
          try{
            for(int i=0;i<dCount;i++){
              if(cmdtyList[i][1].equals(lReserveCmdty)){ 
                lReserveCode=cmdtyList[i][0];
                log.debug("cancel:lReserveCode="+lReserveCode);
                lRec=new SIModifyRec("ReserveOrderTbl");
                lRec.addCondition("ReserveCode",lReserveCode);
                lRec.add("ReserveFlg","1");
                lRsrCartManager.delete(lRequest,lReserveCmdty,lReserveCode);
              }
              lRec.execute(lConnection);
            }
            lConnection.commit();
          }catch(Exception e){
            e.printStackTrace();
          }
        }
      }
    }
    //7.1.1 ST0211 修正 ここまで
    
    //数量のチェック
    // EDBTG003-00 [不具合管理票-No30] del start
//    boolean lRes[]={false,false};//7.1.1 ST0185 追加
    // EDBTG003-00 [不具合管理票-No30] del end
    if (errors.isEmpty()){
      // EDBTG003-00 [不具合管理票-No30] del start
      /*
      while (lIta.hasNext()){
        lAmountName=(String)lIta.next();
        lResValidAmount=SICheckValid.checkValid("数量",getAmount(lAmountName),SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
        lPk.setFieldNameTxt(lAmountName);
        
        if(SIUtil.isNull(getAmount(lAmountName))){
          if (errors.isEmpty()||!lRes[0]){errors.addError(new SICustomError("input.data.require","数量"));lRes[0]=true;}//7.1.1 ST0185 修正
        }else if (SIUtil.isNull(lResValidAmount)){
          lOrderDetail=(SIOrderDetail)detailMap.get(lPk.getOrderDetailCode());
          if (lOrderDetail==null){
            log.debug("null order detail record.lOrderDetailCode="+lPk.getOrderDetailCode());
          }else if (Integer.parseInt(getAmount(lAmountName))<=0){
            detailMap.remove(lPk.getOrderDetailCode());
            log.debug("remove from cart detail ,detailcode="+lPk.getOrderDetailCode());
          }else{
            lOrderDetail.setAmount(getAmount(lAmountName));
            detailMap.put(lPk.getOrderDetailCode(),lOrderDetail);
            log.debug("change the amoutn to "+getAmount(lAmountName)+" and put into map for "+lPk.getOrderDetailCode());
          }
        }else{
          if (errors.isEmpty()||!lRes[1]){errors.addError(new SICustomError("input.data.digit","数量"));lRes[1]=true;}//7.1.1 ST0185 修正
        }
      }
       */
      // EDBTG003-00 [不具合管理票-No30] del end
      
      //7.2.0 ST1030 修正 ここから
      if (!updMode || (updMode && !detailMap.isEmpty())) {
        session.setAttribute(SIConfig.SISESSION_CART_DETAIL_NAME,detailMap);
        // EDBTG003-00 nagayoshi del start
//        cartMan.adjustAmount(lRequest,lConnection);
//        session.setAttribute(SIConfig.SISESSION_CART_INFO_NAME,cartMan);
        // EDBTG003-00 nagayoshi del end
        jp.co.sint.beans.front.UICasher.reset(lRequest);//7.1.1 ST0154 追加
      //全ての数量を0にされたとき（バックの修正時に）
      } else {
        //変更前の情報を復元（エラーをセット）
        session.setAttribute(SIConfig.SISESSION_CART_DETAIL_NAME, orgDetailMap);
        errors.addError(new SICustomError("manager.app.order.zero"));
      }
      //7.2.0 ST1030 修正 ここまで
    }
    
    if (!errors.isEmpty()) lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY,errors);
    else lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY);
    return errors.isEmpty();
  }
  //EDBTG003-00 elecs-matsushima add start
  /**
   * <b>validate</b>
   * 商品数量などのチェック
   * @param  request リクエスト
   * @param  lConnection コネクション
   * @param  mode     true:フロント false:バック
   * @param  updMode  true:バックの修正時 false:以外
   * @param  branch 支店コード（ブランクでない場合はレジモード扱い）
   * @return チェックの結果(true:エラーなし、false:エラーがある)
   * @throws なし
   */
  public boolean validatePos(HttpServletRequest lRequest, Connection lConnection, boolean mode, boolean updMode, String branch){
    
    HttpSession session=lRequest.getSession(true);//セッションの取得
    HashMap detailMap=(HashMap)session.getAttribute(SIConfig.SISESSION_CART_DETAIL_NAME);
    HashMap orgDetailMap = (HashMap)detailMap.clone();
    SIReserveCartManager lRsrCartManager=(SIReserveCartManager)session.getAttribute(SIConfig.SISESSION_RESERVE_CART_INFO_NAME);
    if (lRsrCartManager==null)lRsrCartManager=new SIReserveCartManager();
    
    SICartManager cartMan=new SICartManager();
    SICustomErrors errors=new SICustomErrors();
    
    Iterator lIta=this.amountMap.keySet().iterator();
    SIOrderDetailPK lPk=new SIOrderDetailPK();
    String lAmountName="";
    String lResValidAmount="";
    
    SIOrderDetail lOrderDetail=new SIOrderDetail();
    
    //予約商品のチェック
    Iterator lRsrIta=lRsrCartManager.getReserveCodes().keySet().iterator();
    String lName="";
    int hCount=lRsrCartManager.getReserveCodes().size();
    int dCount=0;
    String lCode="";
    String[][] cmdtyList =new String[hCount][2];
    while (lRsrIta.hasNext()){
      lCode=(String)lRsrIta.next();
      cmdtyList[dCount][0]=lCode;
      try{cmdtyList[dCount][1]=SIBGUtil.getReserveCmdty(lCode,lConnection);}
      catch(Exception e){e.printStackTrace();}
      dCount++;
    }
    String lReserveAmount="0";
    String lAmount="0";
    SICartCmdty lCartCmdty=new SICartCmdty();
    Iterator lDetailIta=detailMap.keySet().iterator();
    HashMap lResultMap=new HashMap();
    while (lDetailIta.hasNext()){
      lName=(String)lDetailIta.next();
      lOrderDetail=(SIOrderDetail)detailMap.get(lName);
      if (lOrderDetail==null)lOrderDetail=new SIOrderDetail();
      Boolean lRes=(Boolean)lResultMap.get(lOrderDetail.getShopCode()+lOrderDetail.getCmdtyCode()+lOrderDetail.getSetCode()+lOrderDetail.getSetDetailCode());
      if (lRes==null)lRes=new Boolean(false);
      
      //予約確認画面からカートに入れる商品数量の取得
      lReserveAmount=lRsrCartManager.getAmount(lOrderDetail.getShopCode(),
                                               lOrderDetail.getCmdtyCode(),
                                               lOrderDetail.getIndividualCode(),
                                               lOrderDetail.getStndrdCode1(),
                                               lOrderDetail.getElementCode1(),
                                               lOrderDetail.getStndrdCode2(),
                                               lOrderDetail.getElementCode2());
      //当分処理する商品情報の取得
      lCartCmdty=new SICartCmdty(lOrderDetail.getShopCode(),
                                 lOrderDetail.getCmdtyCode(),
                                 lOrderDetail.getIndividualCode(),
                                 lOrderDetail.getStndrdCode1(),
                                 lOrderDetail.getElementCode1(),
                                 lOrderDetail.getStndrdCode2(),
                                 lOrderDetail.getElementCode2());
      if (!lCartCmdty.reset(lConnection,mode,branch)){//在庫数量の取得
        lResultMap.put(lOrderDetail.getShopCode()+lOrderDetail.getCmdtyCode()+lOrderDetail.getSetCode()+lOrderDetail.getSetDetailCode(),new Boolean(true));//既にチェックした
        errors.addError(new SICustomError("manager.app.sale.expired"));
        continue;
      }
      
      lCartCmdty.setSetCode(lOrderDetail.getSetCode());
      lCartCmdty.setSetDetailFlg(lOrderDetail.getSetDetailFlg());
      lCartCmdty.setSetDetailCode(lOrderDetail.getSetDetailCode());
      
      lAmount=getTotalAmountPos(lCartCmdty);//画面から入力した商品数量の取得
      
      if (mode&&!lRes.booleanValue()&&Integer.parseInt(lAmount)>-1){//数量のデータが正しい入力された場合
        //lResultMap.put(lOrderDetail.getShopCode()+lOrderDetail.getCmdtyCode(),new Boolean(true));//既にチェックした
        lResultMap.put(lOrderDetail.getShopCode()+lOrderDetail.getCmdtyCode()+lOrderDetail.getSetCode()+lOrderDetail.getSetDetailCode(),new Boolean(true));//既にチェックした
        int lCartAmount=Integer.parseInt(lAmount)-Integer.parseInt(lReserveAmount);//予約数量を除いてカート数量
        if (lCartAmount<0&&!lAmount.equals("0")){//予約数量を下回り
          errors.addError(new SICustomError("input.data.greater",lCartCmdty.getCartCmdtyName()+"に対して変更後の数量","予約商品の数量("+lReserveAmount+")"));
        }else if (lCartCmdty.getAmountFlg().equals("1")&&//在庫数の超過
                  lCartCmdty.getNoStockFlg().equals("0")&&
                  lCartAmount>Integer.parseInt(lCartCmdty.getAmountWithAllocation(lConnection,this.getOrderCode()))){
          if (Integer.parseInt(lReserveAmount)>0){
            errors.addError(new SICustomError("manager.app.exceed.amount.with.reserve",lCartCmdty.getCartCmdtyName()));
          }else if(Integer.parseInt(lCartCmdty.getAmountWithAllocation(lConnection,this.getOrderCode()))<=0) {
            errors.addError(new SICustomError("manager.app.exceed.amount.no.reserve",lCartCmdty.getCartCmdtyName()));
          }else{
            errors.addError(new SICustomError("manager.app.exceed.amount.with.cancel",lCartCmdty.getCartCmdtyName()));
          }
        }
        if(lAmount.equals("0")&&!lReserveAmount.equals("0")){
          SIModifyRec lRec = new SIModifyRec();
          String lReserveCode="";
          String lReserveCmdty="0~"+lOrderDetail.getCmdtyCode()+"~"+lOrderDetail.getIndividualCode()+"~~~~";
          try{
            for(int i=0;i<dCount;i++){
              if(cmdtyList[i][1].equals(lReserveCmdty)){
                lReserveCode=cmdtyList[i][0];
                log.debug("cancel:lReserveCode="+lReserveCode);
                lRec=new SIModifyRec("ReserveOrderTbl");
                lRec.addCondition("ReserveCode",lReserveCode);
                lRec.add("ReserveFlg","1");
                lRsrCartManager.delete(lRequest,lReserveCmdty,lReserveCode);
              }
              lRec.execute(lConnection);
            }
            lConnection.commit();
          }catch(Exception e){
            e.printStackTrace();
          }
        }
      }
    }
    
    //数量のチェック
    boolean lRes[]={false,false};
    if (errors.isEmpty()){
      while (lIta.hasNext()){
        lAmountName=(String)lIta.next();
        lResValidAmount=SICheckValid.checkValid("数量",getAmount(lAmountName),SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
        lPk.setFieldNameTxtUpdate(lAmountName);
        String[] amountNameAry = lAmountName.split(SIConfig.SIWEBSHOPPING_TOKEN);
        
        if(SIUtil.isNull(getAmount(lAmountName))){
          if (errors.isEmpty()||!lRes[0]){errors.addError(new SICustomError("input.data.require","数量"));lRes[0]=true;}
        }else if (SIUtil.isNull(lResValidAmount)){
          String orderDetailCode = lPk.getOrderDetailCode();
          if (amountNameAry.length < 10) {
            orderDetailCode += SIConfig.SIWEBSHOPPING_TOKEN + amountNameAry[8] + SIConfig.SIWEBSHOPPING_TOKEN ;
          } else {
            orderDetailCode += SIConfig.SIWEBSHOPPING_TOKEN + amountNameAry[8] + SIConfig.SIWEBSHOPPING_TOKEN + amountNameAry[9];
          }
          lOrderDetail=(SIOrderDetail)detailMap.get(orderDetailCode);
          if (lOrderDetail==null){
            log.debug("null order detail record.lOrderDetailCode="+orderDetailCode);
          }else if (Integer.parseInt(getAmount(lAmountName))<=0){
            detailMap.remove(orderDetailCode);
            log.debug("remove from cart detail ,detailcode="+orderDetailCode);
          }else{
            lOrderDetail.setAmount(getAmount(lAmountName));
            detailMap.put(orderDetailCode,lOrderDetail);
            log.debug("change the amoutn to "+getAmount(lAmountName)+" and put into map for "+orderDetailCode);
          }
        }else{
          if (errors.isEmpty()||!lRes[1]){errors.addError(new SICustomError("input.data.digit","数量"));lRes[1]=true;}
        }
      }
      
      if (!updMode || (updMode && !detailMap.isEmpty())) {
        session.setAttribute(SIConfig.SISESSION_CART_DETAIL_NAME,detailMap);
        cartMan.adjustAmount(lRequest,lConnection);
        session.setAttribute(SIConfig.SISESSION_CART_INFO_NAME,cartMan);
        jp.co.sint.beans.front.UICasher.reset(lRequest);
      //全ての数量を0にされたとき（バックの修正時に）
      } else {
        //変更前の情報を復元（エラーをセット）
        session.setAttribute(SIConfig.SISESSION_CART_DETAIL_NAME, orgDetailMap);
        errors.addError(new SICustomError("manager.app.order.zero"));
      }
    }
    
    if (!errors.isEmpty()) lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY,errors);
    else lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY);
    return errors.isEmpty();
  }
//EDBTG003-00 elecs-matsushima add end
}