package jp.co.sint.beans.mallmgr;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

import jp.co.sint.basic.SIBasic;
import jp.co.sint.basic.SIEstimate;
import jp.co.sint.basic.SIEstimateDelivery;
import jp.co.sint.basic.SIKeepDetail;
import jp.co.sint.config.SIConfig;
import jp.co.sint.database.SIDBAccessException;
import jp.co.sint.database.SIDBUtil;
import jp.co.sint.tools.SICheckDataConf;
import jp.co.sint.tools.SICheckValid;
import jp.co.sint.tools.SICustomError;
import jp.co.sint.tools.SICustomErrors;
import jp.co.sint.tools.SIURLParameter;
import jp.co.sint.tools.SIUtil;

import org.apache.log4j.Category;

/**
 * @version $Id: SIEstimateDetail.java,v 1.0 Exp $
 * @author Tsuyoshi Yagi <br>
 * Description: 見積Bean
 * <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>
 * Tsuyoshi Yagi 2005/12/02 Original
 */
public class UIRegNewEstimate extends SIBasic {
  // ログ用のインスタンスの生成
  private static Category log = Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);
  // 見積番号
  private String estimateNum = "";
  // 見積ヘッダ情報
  private SIEstimate estimate = new SIEstimate();
  // 見積配送先情報
  private SIEstimateDelivery estimateDelivery = new SIEstimateDelivery();
  // 見積明細格納用ハッシュマップ
  private LinkedHashMap hash = new LinkedHashMap();
  // 見積ヘッダ情報
  private String backURL = "";
  // 個別商品カウント
  private String cmdtyCnt1 = "";
  // 小物商品カウント
  private String cmdtyCnt2 = "";
  // 個別所品送料
  private String deliveryFee1 = "";
  // 小物商品送料
  private String deliveryFee2 = "";
  
  // 送料合計
  private String totalDeliveryFee = "0";
  
  /**
   * @return totalDeliveryFee を戻します。
   */
  public String getTotalDeliveryFee() {
    if (SIUtil.isNull(totalDeliveryFee)) return "0";
    return totalDeliveryFee;
  }
  
  /**
   * @param totalDeliveryFee totalDeliveryFee を設定。
   */
  public void setTotalDeliveryFee(String totalDeliveryFee) {
    this.totalDeliveryFee = totalDeliveryFee;
  }
  
  /*
   * getter of estimate.
   */
  public SIEstimate getEstimate() {
    return estimate;
  }
  
  /*
   * getter of estimateDelivery.
   */
  public SIEstimateDelivery getEstimateDelivery() {
    return estimateDelivery;
  }
  
  /*
   * getter of hash.
   */
  public LinkedHashMap getHash() {
    return hash;
  }
  
  /*
   * getter of backURL.
   */
  public String getBackURL() {
    return backURL;
  }
  
  /*
   * setter of backURL
   */
  public void setBackURL(String backURL) {
    this.backURL = backURL;
  }
  
  /*
   * getter of cmndtyCnt1.
   */
  public String getCmdtyCnt1() {
    return cmdtyCnt1;
  }
  
  /*
   * setter of cmndtyCnt1
   */
  public void setCmdtyCnt1(String cmndtyCnt1) {
    this.cmdtyCnt1 = cmndtyCnt1;
  }
  
  /*
   * getter of cmndtyCnt2.
   */
  public String getCmdtyCnt2() {
    return cmdtyCnt2;
  }
  
  /*
   * setter of cmndtyCnt2
   */
  public void setCmdtyCnt2(String cmndtyCnt2) {
    this.cmdtyCnt2 = cmndtyCnt2;
  }
  
  /*
   * getter of deliveryFee1.
   */
  public String getDeliveryFee1() {
    return deliveryFee1;
  }
  
  /*
   * setter of deliveryFee1
   */
  public void setDeliveryFee1(String deliveryFee1) {
    this.deliveryFee1 = deliveryFee1;
  }
  
  /*
   * getter of deliveryFee2.
   */
  public String getDeliveryFee2() {
    return deliveryFee2;
  }
  
  /*
   * setter of deliveryFee2
   */
  public void setDeliveryFee2(String deliveryFee2) {
    this.deliveryFee2 = deliveryFee2;
  }
  
  /*
   * setter of estimate
   */
  public void setEstimate(SIEstimate estimate) {
    this.estimate = estimate;
  }
  
  /*
   * setter of estimateDelivery
   */
  public void setEstimateDelivery(SIEstimateDelivery estimateDelivery) {
    this.estimateDelivery = estimateDelivery;
  }
  
  /*
   * getter of estimateNum.
   */
  public String getEstimateNum() {
    return estimateNum;
  }
  
  /*
   * setter of estimateNum
   */
  public void setEstimateNum(String estimateNum) {
    this.estimateNum = estimateNum;
  }
  
  public void init(HttpServletRequest lRequest, SIURLParameter lUrlParam, Connection conn) throws SIDBAccessException {
    super.init(lRequest, lUrlParam);
    
    backURL = (String) lUrlParam.getParam("backURLTxt");
    cmdtyCnt1 = (String) lUrlParam.getParam("cmdtyCnt1");
    cmdtyCnt2 = (String) lUrlParam.getParam("cmdtyCnt2");
    deliveryFee1 = (String) lUrlParam.getParam("deliveryFee1");
    deliveryFee2 = (String) lUrlParam.getParam("deliveryFee2");
    
    estimate.setKeepNumber((String) lUrlParam.getParam("keepNumberTxt"));
    estimate.setCustCode((String) lUrlParam.getParam("custCode"));
    estimate.setCustName((String) lUrlParam.getParam("custName"));
    estimate.setCustPronName((String) lUrlParam.getParam("custPronName"));
    estimate.setBusinessForm((String) lUrlParam.getParam("job"));
    estimate.setStoreTel((String) lUrlParam.getParam("storeTel"));
    estimate.setTel((String) lUrlParam.getParam("tel"));
    estimate.setFax((String) lUrlParam.getParam("fax"));
    estimate.setEmail((String) lUrlParam.getParam("email"));
    estimate.setFee((String) lUrlParam.getParam("fee"));
    estimate.setPostCode1((String) lUrlParam.getParam("postCode1"));
    estimate.setPostCode2((String) lUrlParam.getParam("postCode2"));
    estimate.setEstimateAddrressee((String) lUrlParam.getParam("addressee"));
    estimate.setCompanyName((String) lUrlParam.getParam("companyName"));
    estimate.setAddress1((String) lUrlParam.getParam("address1"));
    estimate.setAddress2((String) lUrlParam.getParam("address2"));
    estimate.setAddress3((String) lUrlParam.getParam("address3"));
    estimate.setOrderRoute((String) lUrlParam.getParam("orderRouteFlg"));
    estimate.setPayMethodName((String) lUrlParam.getParam("payMethodName"));
    estimate.setContactMsg((String) lUrlParam.getParam("contactMsg"));
    estimate.setBrarnchCode((String) lUrlParam.getParam("belongBranchCodeTxt"));
    estimate.setChargeCode((String) lUrlParam.getParam("chargeCodeTxt"));
    estimate.setSumOfDiscount((String) lUrlParam.getParam("sumOfDiscount"));
    estimate.setMemberLevelCode((String) lUrlParam.getParam("memberLevelCode"));
    // EDBTG003-00 mng-paku add start
    estimate.setSumOfSetDiscount((String) lUrlParam.getParam("sumOfSetDiscount"));
    // EDBTG003-00 mng-paku add end
    
    estimate.setSumOfA((String) lUrlParam.getParam("sumOfA"));
    estimate.setSumOfB((String) lUrlParam.getParam("sumOfB"));
    estimate.setSumOfC((String) lUrlParam.getParam("sumOfC"));
    estimate.setSumOfE((String) lUrlParam.getParam("sumOfE"));
    
    estimate.setSumByPoint((String) lUrlParam.getParam("sumByPoint"));
    estimate.setMaxPoint((String) lUrlParam.getParam("maxPoint"));
    estimate.setDiscountDeliveryFee((String) lUrlParam.getParam("discountDeliveryFee"));
    estimate.setDiscountFee((String) lUrlParam.getParam("discountFee"));
    
    estimateDelivery.setPostCode1((String) lUrlParam.getParam("deliveryPostCode1"));
    estimateDelivery.setPostCode2((String) lUrlParam.getParam("deliveryPostCode2"));
    estimateDelivery.setCompanyName((String) lUrlParam.getParam("deliveryCompanyName"));
    estimateDelivery.setDeliveryAddressee((String) lUrlParam.getParam("deliveryAddressee"));
    estimateDelivery.setAddress1((String) lUrlParam.getParam("deliveryAddress1"));
    estimateDelivery.setAddress2((String) lUrlParam.getParam("deliveryAddress2"));
    estimateDelivery.setAddress3((String) lUrlParam.getParam("deliveryAddress3"));
    estimateDelivery.setTel((String) lUrlParam.getParam("deliveryTel"));
    estimateDelivery.setAddressCode((String) lUrlParam.getParam("addressCode"));
    
    Statement statement = null;
    ResultSet resultSet = null;
    StringBuffer sqlStatement = new StringBuffer();
    // EDBTG003-00 mng-paku mod start
//    sqlStatement.append("select cmdtycode,individualcode,cmdtytype,cmdtytype,price,cost,deliverytype, size,sum(amount)as amount from keepdetailtbl ");
    sqlStatement.append("SELECT cmdtycode,individualcode,cmdtytype,cmdtytype,price,cost,deliverytype, size,sum(amount)as amount, setcode, setdetailcode, setdetailflg ");
    sqlStatement.append("FROM keepdetailtbl ");
    // EDBTG003-00 mng-paku mod end
    sqlStatement.append("where keepnumber = '" + estimate.getKeepNumber() + "'");
    sqlStatement.append(" group by cmdtycode,individualcode ,cmdtytype,price,cost,deliverytype,size ");
    // EDBTG003-00 mng-paku mod start
    sqlStatement.append(" , setcode, setdetailcode, setdetailflg ");
    // EDBTG003-00 mng-paku mod end
    sqlStatement.append("order by cmdtycode,individualcode ");
    
    // 実行
    try {
      statement = conn.createStatement();
      log.debug("SQL=" + sqlStatement.toString());
      resultSet = statement.executeQuery(sqlStatement.toString());
      String deliveryDateFlgStr="deliveryDate_flg";
      String deliveryDateFlg=lRequest.getParameter(deliveryDateFlgStr);
      
      // 商品レコードのセットの作成
      while (resultSet.next()) {
        // EDBTG003-00 nagayoshi mod start
//        String deliveryFee = (String) lUrlParam.getParam("deliveryFee_" + resultSet.getString("cmdtycode") + "_" + resultSet.getString("individualCode"));
//        hash.put("deliveryFee_" + resultSet.getString("cmdtycode") + "_" + resultSet.getString("individualCode"), deliveryFee);
        String suffix = "_" + resultSet.getString("setcode") + "_" + resultSet.getString("setdetailcode");
        if (SIUtil.isNull(resultSet.getString("setdetailflg")) || SIConfig.SET_DETAIL_FLG_NORMAL.equals(resultSet.getString("setdetailflg"))) {
          suffix = "__";
        }
        String deliveryFee = (String) lUrlParam.getParam("deliveryFee_" + resultSet.getString("cmdtycode") + "_" + resultSet.getString("individualCode") + suffix);
        hash.put("deliveryFee_" + resultSet.getString("cmdtycode") + "_" + resultSet.getString("individualCode") + suffix, deliveryFee);
        // EDBTG003-00 nagayoshi mod end
        // EDBTG003-00 ohsugi mod start
//        String deliveryDate = (String) lUrlParam.getParam("deliveryDate_" + resultSet.getString("cmdtycode") + "_" + resultSet.getString("individualCode"));
//        hash.put("deliveryDate_" + resultSet.getString("cmdtycode") + "_" + resultSet.getString("individualCode"), deliveryDate);
//        String deliveryTime = (String) lUrlParam.getParam("deliveryTime_" + resultSet.getString("cmdtycode") + "_" + resultSet.getString("individualCode"));
//        hash.put("deliveryTime_" + resultSet.getString("cmdtycode") + "_" + resultSet.getString("individualCode"), deliveryTime);
        String keyDeliveryDate = "deliveryDate_" + resultSet.getString("cmdtycode") + "_" + resultSet.getString("individualCode") + suffix;
        String deliveryDate = (String) lUrlParam.getParam(keyDeliveryDate);
        hash.put(keyDeliveryDate, deliveryDate);
        String keyDeliveryTime = "deliveryTime_" + resultSet.getString("cmdtycode") + "_" + resultSet.getString("individualCode") + suffix;
        String deliveryTime = (String) lUrlParam.getParam(keyDeliveryTime);
        hash.put(keyDeliveryTime, deliveryTime);
        // EDBTG003-00 ohsugi mod end
        if("1".equals(resultSet.getString("deliveryType"))){
          if("1".equals(lRequest.getParameter("deliveryDate_flg"))){
            // EDBTG003-00 ohsugi mod start
//            hash.put("deliveryDate_" + resultSet.getString("cmdtycode") + "_" + resultSet.getString("individualCode"), lRequest.getParameter("deliveryDate_komono"));
            hash.put(keyDeliveryDate, lRequest.getParameter("deliveryDate_komono"));
            // EDBTG003-00 ohsugi mod end
          }
          if("1".equals(lRequest.getParameter("deliveryTime_flg"))){
            // EDBTG003-00 ohsugi mod start
//            hash.put("deliveryTime_" + resultSet.getString("cmdtycode") + "_" + resultSet.getString("individualCode"), lRequest.getParameter("deliveryTime_komono"));
            hash.put(keyDeliveryTime, lRequest.getParameter("deliveryTime_komono"));
            // EDBTG003-00 ohsugi mod end
          }
        }else{
          if("0".equals(lRequest.getParameter("deliveryDate_flg"))){
            // EDBTG003-00 ohsugi mod start
//            hash.put("deliveryDate_" + resultSet.getString("cmdtycode") + "_" + resultSet.getString("individualCode"), lRequest.getParameter("deliveryDate_kobetsu"));
            hash.put(keyDeliveryDate, lRequest.getParameter("deliveryDate_kobetsu"));
            // EDBTG003-00 ohsugi mod end
          }
          if("0".equals(lRequest.getParameter("deliveryTime_flg"))){
            // EDBTG003-00 ohsugi mod start
//            hash.put("deliveryTime_" + resultSet.getString("cmdtycode") + "_" + resultSet.getString("individualCode"), lRequest.getParameter("deliveryTime_kobetsu"));
            hash.put(keyDeliveryTime, lRequest.getParameter("deliveryTime_kobetsu"));
            // EDBTG003-00 ohsugi mod end
          }
        }
      }
    } catch (Exception ex) {
      log.debug("exception sql = " + sqlStatement.toString());
      throw new SIDBAccessException(ex);
    } finally {
      SIDBUtil.close(statement, resultSet);
    }
    
    StringBuffer sqlStatement2 = new StringBuffer();
    String paymentFlg = "";
    sqlStatement2.append("select paymentflg from paymethodmtbl ");
    sqlStatement2.append("where paymethodname = '" + estimate.getPayMethodName() + "'");
    
    // 実行
    try {
      statement = conn.createStatement();
      log.debug("SQL=" + sqlStatement.toString());
      resultSet = statement.executeQuery(sqlStatement2.toString());
      
      // 商品レコードのセットの作成
      while (resultSet.next()) {
        paymentFlg = resultSet.getString("paymentflg");
      }
      estimate.setPaymentFlg(paymentFlg);
    } catch (Exception ex) {
      log.debug("exception sql = " + sqlStatement.toString());
      throw new SIDBAccessException(ex);
    } finally{
      SIDBUtil.close(statement, resultSet);
    }
  }

  public void initFree(HttpServletRequest lRequest, SIURLParameter lUrlParam, Connection conn) throws SIDBAccessException {
    super.init(lRequest, lUrlParam);
    
    backURL = (String) lUrlParam.getParam("backURLTxt");
    cmdtyCnt1 = (String) lUrlParam.getParam("cmdtyCnt1");
    cmdtyCnt2 = (String) lUrlParam.getParam("cmdtyCnt2");
    deliveryFee1 = (String) lUrlParam.getParam("deliveryFee1");
    deliveryFee2 = (String) lUrlParam.getParam("deliveryFee2");
    
    estimate.setKeepNumber((String) lUrlParam.getParam("keepNumberTxt"));
    estimate.setCustCode((String) lUrlParam.getParam("custCode"));
    estimate.setCustName((String) lUrlParam.getParam("custName"));
    estimate.setCustPronName((String) lUrlParam.getParam("custPronName"));
    estimate.setBusinessForm((String) lUrlParam.getParam("job"));
    estimate.setStoreTel((String) lUrlParam.getParam("storeTel"));
    estimate.setTel((String) lUrlParam.getParam("tel"));
    estimate.setFax((String) lUrlParam.getParam("fax"));
    estimate.setEmail((String) lUrlParam.getParam("email"));
    estimate.setFee((String) lUrlParam.getParam("fee"));
    estimate.setPostCode1((String) lUrlParam.getParam("postCode1"));
    estimate.setPostCode2((String) lUrlParam.getParam("postCode2"));
    estimate.setEstimateAddrressee((String) lUrlParam.getParam("addressee"));
    estimate.setCompanyName((String) lUrlParam.getParam("companyName"));
    estimate.setAddress1((String) lUrlParam.getParam("address1"));
    estimate.setAddress2((String) lUrlParam.getParam("address2"));
    estimate.setAddress3((String) lUrlParam.getParam("address3"));
    estimate.setOrderRoute((String) lUrlParam.getParam("orderRouteFlg"));
    estimate.setPayMethodName((String) lUrlParam.getParam("payMethodName"));
    estimate.setContactMsg((String) lUrlParam.getParam("contactMsg"));
    estimate.setBrarnchCode((String) lUrlParam.getParam("belongBranchCodeTxt"));
    estimate.setChargeCode((String) lUrlParam.getParam("chargeCodeTxt"));
    estimate.setSumOfDiscount((String) lUrlParam.getParam("sumOfDiscount"));
    estimate.setMemberLevelCode((String) lUrlParam.getParam("memberLevelCode"));
    // EDBTG003-00 mng-paku add start
    estimate.setSumOfSetDiscount((String) lUrlParam.getParam("sumOfSetDiscount"));
    // EDBTG003-00 mng-paku add end
    
    estimate.setSumOfA((String) lUrlParam.getParam("sumOfA"));
    estimate.setSumOfB((String) lUrlParam.getParam("sumOfB"));
    estimate.setSumOfC((String) lUrlParam.getParam("sumOfC"));
    estimate.setSumOfE((String) lUrlParam.getParam("sumOfE"));
    
    estimate.setSumByPoint((String) lUrlParam.getParam("sumByPoint"));
    estimate.setMaxPoint((String) lUrlParam.getParam("maxPoint"));
    estimate.setDiscountDeliveryFee((String) lUrlParam.getParam("discountDeliveryFee"));
    estimate.setDiscountFee((String) lUrlParam.getParam("discountFee"));
    
    estimateDelivery.setPostCode1((String) lUrlParam.getParam("deliveryPostCode1"));
    estimateDelivery.setPostCode2((String) lUrlParam.getParam("deliveryPostCode2"));
    estimateDelivery.setCompanyName((String) lUrlParam.getParam("deliveryCompanyName"));
    estimateDelivery.setDeliveryAddressee((String) lUrlParam.getParam("deliveryAddressee"));
    estimateDelivery.setAddress1((String) lUrlParam.getParam("deliveryAddress1"));
    estimateDelivery.setAddress2((String) lUrlParam.getParam("deliveryAddress2"));
    estimateDelivery.setAddress3((String) lUrlParam.getParam("deliveryAddress3"));
    estimateDelivery.setTel((String) lUrlParam.getParam("deliveryTel"));
    estimateDelivery.setAddressCode((String) lUrlParam.getParam("addressCode"));
    
    Collection keepColl = (Collection) lRequest.getSession().getAttribute(SIConfig.SISESSION_MAN_ESTIMATE_FREEKEEP_LIST);
    if (keepColl == null) keepColl = new ArrayList();
    Iterator keepIte = keepColl.iterator();
    
    while (keepIte.hasNext()) {
      SIKeepDetail keep = (SIKeepDetail) keepIte.next();
      // EDBTG003-00 nagayoshi mod start
//      String deliveryFee = (String) lUrlParam.getParam("deliveryFee_" + keep.getCmdtyCode() + "_" + keep.getIndividualCode());
//      hash.put("deliveryFee_" + keep.getCmdtyCode() + "_" + keep.getIndividualCode(), deliveryFee);
      String deliveryFee = (String) lUrlParam.getParam("deliveryFee_" + keep.getCmdtyCode() + "_" + keep.getIndividualCode() + "_" + keep.getSetCode() + "_" + keep.getSetDetailCode());
      hash.put("deliveryFee_" + keep.getCmdtyCode() + "_" + keep.getIndividualCode() + "_" + keep.getSetCode() + "_" + keep.getSetDetailCode(), deliveryFee);
      // EDBTG003-00 nagayoshi mod end
      // EDBTG003-00 mng-paku mod start
//      String deliveryDate = (String) lUrlParam.getParam("deliveryDate_" + keep.getCmdtyCode() + "_" + keep.getIndividualCode());
//      hash.put("deliveryDate_" + keep.getCmdtyCode() + "_" + keep.getIndividualCode(), deliveryDate);
      String keyDeliveryDate = "deliveryDate_" + keep.getCmdtyCode() + "_" + keep.getIndividualCode() + "_" + keep.getSetCode() + "_" + keep.getSetDetailCode();
      String deliveryDate = (String) lUrlParam.getParam(keyDeliveryDate);
      hash.put(keyDeliveryDate, deliveryDate);
      // EDBTG003-00 mng-paku mod end
    }
    
    StringBuffer sqlStatement2 = new StringBuffer();
    String paymentFlg = "";
    sqlStatement2.append("select paymentflg from paymethodmtbl ");
    sqlStatement2.append("where paymethodname = '" + estimate.getPayMethodName() + "'");
    
    // 実行
    try {
      Statement statement = conn.createStatement();
      ResultSet resultSet = statement.executeQuery(sqlStatement2.toString());
      
      // 商品レコードのセットの作成
      while (resultSet.next()) {
        paymentFlg = resultSet.getString("paymentflg");
      }
      estimate.setPaymentFlg(paymentFlg);
      SIDBUtil.close(statement, resultSet);
    } catch (Exception ex) {
      throw new SIDBAccessException(ex);
    }
    
  }
  
  /**
   * <b>validate</b> 入力したデータをチェックして、同時にSQLの条件文を作成します。
   * 
   * @param lRequest クライアントからのリクエスト
   */
  public boolean validate(HttpServletRequest lRequest) {
    SICustomErrors errors = new SICustomErrors();
    
    SICheckValid.checkValid(errors, "顧客コード", estimate.getCustCode(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    SICheckValid.checkValid(errors, "顧客コード", estimate.getCustCode(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 10);
    SICheckValid.checkValid(errors, "顧客コード", estimate.getCustCode(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
    
    if (!estimate.getCustName().equals("")) {
      SICheckValid.checkValid(errors, "顧客名", estimate.getCustName(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 40);
    }
    if (!estimate.getCustPronName().equals("")) {
      SICheckValid.checkValid(errors, "顧客名カナ", estimate.getCustPronName(), SICheckDataConf.SICHECK_DATA_ZENKAKU_KANA_TYPE);
      SICheckValid.checkValid(errors, "顧客名カナ", estimate.getCustPronName(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 50);
    }
    if (!estimate.getStoreTel().equals("")) {
      SICheckValid.checkValid(errors, "連絡先TEL1", estimate.getStoreTel(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
      SICheckValid.checkValid(errors, "連絡先TEL1", estimate.getStoreTel(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 16);
    }
    if (!estimate.getTel().equals("")) {
      SICheckValid.checkValid(errors, "連絡先TEL2", estimate.getTel(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
      SICheckValid.checkValid(errors, "連絡先TEL2", estimate.getTel(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 16);
    }
    if (!estimate.getFax().equals("")) {
      SICheckValid.checkValid(errors, "FAX", estimate.getFax(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
      SICheckValid.checkValid(errors, "FAX", estimate.getFax(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 16);
    }
    if (!estimate.getEmail().equals("")) {
      SICheckValid.checkValid(errors, "E-mail", estimate.getEmail(), SICheckDataConf.SICHECK_DATA_MAIL_TYPE);
      SICheckValid.checkValid(errors, "E-mail", estimate.getEmail(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 128);
    }
    if (!estimate.getPostCode1().equals("")) {
      SICheckValid.checkValid(errors, "郵便番号１", estimate.getPostCode1(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
      SICheckValid.checkValid(errors, "郵便番号１", estimate.getPostCode1(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 3);
    }
    if (!estimate.getPostCode2().equals("")) {
      SICheckValid.checkValid(errors, "郵便番号２", estimate.getPostCode2(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
      SICheckValid.checkValid(errors, "郵便番号２", estimate.getPostCode2(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 4);
    }
    if (!estimate.getEstimateAddrressee().equals("")) {
      SICheckValid.checkValid(errors, "宛名", estimate.getEstimateAddrressee(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 50);
    }
    if (!estimate.getCompanyName().equals("")) {
      SICheckValid.checkValid(errors, "会社名", estimate.getCompanyName(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 100);
    }
    if (!estimate.getAddress2().equals("")) {
      SICheckValid.checkValid(errors, "住所２", estimate.getAddress2(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 100);
    }
    if (!estimate.getAddress3().equals("")) {
      SICheckValid.checkValid(errors, "住所３", estimate.getAddress3(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 100);
    }
    
    if (!estimateDelivery.getPostCode1().equals("")) {
      SICheckValid.checkValid(errors, "配送先：郵便番号１", estimateDelivery.getPostCode1(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
      SICheckValid.checkValid(errors, "配送先：郵便番号１", estimateDelivery.getPostCode1(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 3);
    }
    if (!estimateDelivery.getPostCode2().equals("")) {
      SICheckValid.checkValid(errors, "配送先：郵便番号２", estimateDelivery.getPostCode2(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
      SICheckValid.checkValid(errors, "配送先：郵便番号２", estimateDelivery.getPostCode2(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 4);
    }
    if (!estimateDelivery.getCompanyName().equals("")) {
      SICheckValid.checkValid(errors, "配送先：会社名", estimateDelivery.getCompanyName(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 100);
    }
    if (!estimateDelivery.getDeliveryAddressee().equals("")) {
      SICheckValid.checkValid(errors, "配送先：宛名", estimateDelivery.getDeliveryAddressee(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 50);
    }
    if (!estimateDelivery.getAddress2().equals("")) {
      SICheckValid.checkValid(errors, "配送先：住所２", estimateDelivery.getAddress2(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 100);
    }
    if (!estimateDelivery.getAddress3().equals("")) {
      SICheckValid.checkValid(errors, "配送先：住所３", estimateDelivery.getAddress3(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 100);
    }
    if (!estimateDelivery.getTel().equals("")) {
      SICheckValid.checkValid(errors, "配送先：TEL", estimateDelivery.getTel(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
      SICheckValid.checkValid(errors, "配送先：TEL", estimateDelivery.getTel(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 16);
    }
    SICheckValid.checkValid(errors, "受注経路", estimate.getOrderRoute(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
    
    // ポイント残高（使用可能なポイントの最大数）を超えるチェック
    if (SIUtil.isNotNull(estimate.getMaxPoint()) && SIUtil.isNotNull(estimate.getSumByPoint())) {
      if (SICheckValid.checkValid(errors, "ポイント使用額", estimate.getSumByPoint(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE)) {
        if (estimate.getSumByPoint().equals(estimate.getMaxPoint()) || estimate.getSumByPoint().equals("0")) {} else {
          SICheckValid.checkValid(errors, "ポイント使用額", "ポイント残高", estimate.getSumByPoint(), estimate.getMaxPoint(), SICheckDataConf.SICHECK_DATA_VALUE_LESS_TYPE);
        }
        // ポイント使用額が合計金額を超えるチェック
        if (!estimate.getSumByPoint().equals(SIUtil.sub_LL(estimate.getSumOfC(), estimate.getSumOfDiscount()))) {
          SICheckValid.checkValid(errors, "ポイント使用額と値引金額", "お支払い合計額", estimate.getSumByPoint(), SIUtil.sub_LL(estimate.getSumOfC(), estimate.getSumOfDiscount()),
              SICheckDataConf.SICHECK_DATA_VALUE_LESS_TYPE);
        }
      } else {
        estimate.setSumByPoint("0");
      }
    }
    
    if (SIUtil.isNotNull(estimate.getFee())) {
      if (SICheckValid.checkValid(errors, "手数料", estimate.getFee(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE)
          && SICheckValid.checkValid(errors, "手数料", estimate.getFee(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 8)) {} else {
        estimate.setFee("0");
      }
    } else {
      estimate.setFee("0");
    }
    if (SIUtil.isNotNull(estimate.getSumOfDiscount())) {
      if (SICheckValid.checkValid(errors, "値引金額", estimate.getSumOfDiscount(), SICheckDataConf.SICHECK_DATA_DIGIT_NEGATIVE_TYPE)
          && SICheckValid.checkValid(errors, "値引金額", estimate.getSumOfDiscount(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 8)) {} else {
        estimate.setSumOfDiscount("0");
      }
    } else {
      estimate.setSumOfDiscount("0");
    }
    
    // 送料調整額チェック
    if (SIUtil.isNotNull(estimate.getDiscountDeliveryFee()) && SIUtil.isNotNull(estimate.getSumOfB())) {
      if (SICheckValid.checkValid(errors, "送料調整額", estimate.getDiscountDeliveryFee(), SICheckDataConf.SICHECK_DATA_DIGIT_NEGATIVE_TYPE)
          && SICheckValid.checkValid(errors, "送料調整額", estimate.getDiscountDeliveryFee(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 8)) {
        if (Integer.parseInt(estimate.getDiscountDeliveryFee()) + Integer.parseInt(estimate.getSumOfB()) < 0) {// 総送料がマイナスにならないため
          errors.addError(new SICustomError("input.data.discountDeliveryFee.negative"));
        }
      } else {
        estimate.setDiscountDeliveryFee("0");
      }
    } else {
      estimate.setDiscountDeliveryFee("0");
    }
    // 手数料調整額チェック
    if (SIUtil.isNotNull(estimate.getDiscountFee())) {
      if (SICheckValid.checkValid(errors, "手数料調整額", estimate.getDiscountFee(), SICheckDataConf.SICHECK_DATA_DIGIT_NEGATIVE_TYPE)
          && SICheckValid.checkValid(errors, "手数料調整額", estimate.getDiscountFee(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 8)) {
        if (SIUtil.isNotNull(estimate.getFeeIncTax()) && (Integer.parseInt(estimate.getDiscountFee()) + Integer.parseInt(estimate.getFeeIncTax()) < 0)) {// 総手数料がマイナスにならないため
          errors.addError(new SICustomError("input.data.discountFee.negative"));
        }
      } else {
        estimate.setDiscountFee("0");
      }
    } else {
      estimate.setDiscountFee("0");
    }
    
    Set keymap = hash.keySet();
    Iterator ite = keymap.iterator();
    while (ite.hasNext()) {
      String key = (String) ite.next();
      if (key.startsWith("deliveryFee")) {
        String deliveryFee = (String) hash.get(key);
        if (!SICheckValid.checkValid(errors, "送料", deliveryFee, SICheckDataConf.SICHECK_DATA_EMPTY_TYPE)) {
          hash.put(key, "0");
        }
        if (!SICheckValid.checkValid(errors, "送料", deliveryFee, SICheckDataConf.SICHECK_DATA_DIGIT_TYPE)) {
          hash.put(key, "0");
        }
        if (!SICheckValid.checkValid(errors, "送料", deliveryFee, SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 8)) {
          hash.put(key, "0");
        }
      }
    }
    
    if (!errors.isEmpty()) {
      lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY, errors);
      return false;
    } else {
      lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY);
      return true;
    }
    
  }
  
  public boolean validateRedo(HttpServletRequest lRequest) {
    lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY);
    SICustomErrors errors = new SICustomErrors();
    
    if (SICheckValid.checkValid(errors, "ポイント使用額", estimate.getSumByPoint(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE)) {
      // ポイント残高（使用可能なポイントの最大数）を超えるチェック
      if (SIUtil.isNotNull(estimate.getMaxPoint()) && SIUtil.isNotNull(estimate.getSumByPoint())) {
        if (estimate.getSumByPoint().equals(estimate.getMaxPoint()) || estimate.getSumByPoint().equals("0")) {} else {
          SICheckValid.checkValid(errors, "ポイント使用額", "ポイント残高", estimate.getSumByPoint(), estimate.getMaxPoint(), SICheckDataConf.SICHECK_DATA_VALUE_LESS_TYPE);
        }
      }
      // ポイント使用額が合計金額を超えるチェック
      if (!estimate.getSumByPoint().equals(estimate.getSumOfC())) {
        SICheckValid.checkValid(errors, "ポイント使用額", "お支払い合計額", estimate.getSumByPoint(), estimate.getSumOfC(), SICheckDataConf.SICHECK_DATA_VALUE_LESS_TYPE);
      }
    } else {
      estimate.setSumByPoint("0");
    }
    
    // 値引金額チェック
    if (SIUtil.isNotNull(estimate.getSumOfDiscount())){
      if (SICheckValid.checkValid(errors, "値引金額", estimate.getSumOfDiscount(), SICheckDataConf.SICHECK_DATA_DIGIT_TYPE)
          && SICheckValid.checkValid(errors, "値引金額", estimate.getSumOfDiscount(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 8)){
      } else {
        estimate.setSumOfDiscount("0");
      }
    }
    
    // 送料調整額チェック
    if (SIUtil.isNotNull(estimate.getDiscountDeliveryFee()) && SIUtil.isNotNull(estimate.getSumOfB())) {
      if (SICheckValid.checkValid(errors, "送料調整額", estimate.getDiscountDeliveryFee(), SICheckDataConf.SICHECK_DATA_DIGIT_NEGATIVE_TYPE)
          && SICheckValid.checkValid(errors, "送料調整額", estimate.getDiscountDeliveryFee(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 8)) {
        if (Integer.parseInt(estimate.getDiscountDeliveryFee()) + Integer.parseInt(estimate.getSumOfB()) < 0) {// 総送料がマイナスにならないため
          errors.addError(new SICustomError("input.data.discountDeliveryFee.negative"));
        }
      } else {
        estimate.setDiscountDeliveryFee("0");
      }
    } else {
      estimate.setDiscountDeliveryFee("0");
    }
    // 手数料調整額チェック
    if (SIUtil.isNotNull(estimate.getDiscountFee())) {
      if (SICheckValid.checkValid(errors, "手数料調整額", estimate.getDiscountFee(), SICheckDataConf.SICHECK_DATA_DIGIT_NEGATIVE_TYPE)
          && SICheckValid.checkValid(errors, "手数料調整額", estimate.getDiscountFee(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE, 8)) {
        if (SIUtil.isNotNull(estimate.getFeeIncTax()) && (Integer.parseInt(estimate.getDiscountFee()) + Integer.parseInt(estimate.getFeeIncTax()) < 0)) {// 総手数料がマイナスにならないため
          errors.addError(new SICustomError("input.data.discountFee.negative"));
        }
      } else {
        estimate.setDiscountFee("0");
      }
    } else {
      estimate.setDiscountFee("0");
    }
    
    if (!errors.isEmpty()) lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY, errors);
    return errors.isEmpty();
  }
  
}
