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

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

import javax.servlet.http.HttpServletRequest;

import jp.co.sint.basic.SICustAddress;
import jp.co.sint.basic.SIDeliveryFee;
import jp.co.sint.basic.SILogin;
import jp.co.sint.basic.SINameValue;
import jp.co.sint.basic.SIOrderDelivery;
import jp.co.sint.basic.SITax;
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.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.SIHTMLUtil;
import jp.co.sint.tools.SIStringUtil;
import jp.co.sint.tools.SIUtil;
import jp.co.sint.tools.SIURLParameter;//7.1.1 ST0236 追加

import org.apache.log4j.Category;

/**
 * @version $Id: UIRegOrderDelivery.java,v 1.0 2003/11/06 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/06 18:20:33  Original
 */
public class UIRegOrderDelivery extends SIOrderDelivery{
  //ログ用のインスタンスの生成
  private static Category log=Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);
  
  //アドレス帳のコード
  private String addressCode="";
  
  //顧客コード
  private String custCode="";
  
  //
  private String deliveryTime="";
  
  public UIRegOrderDelivery(){}
  
  public UIRegOrderDelivery(String lOrderCode,String lDeliveryCode){
    super(lOrderCode,lDeliveryCode);
  }
  
  public void setAddressCode(String lAddressCode){
    if (SIUtil.isNull(lAddressCode)) lAddressCode="";
    this.addressCode=SIUtil.changeTo(lAddressCode.trim(),this.encode);
  }
  
  public void setCustCode(String lCustCode){
    if (SIUtil.isNull(lCustCode)) lCustCode="";
    this.custCode=SIUtil.changeTo(lCustCode.trim(),this.encode);
  }
  
  public void setDeliveryTime(String lDeliveryTime){
    if (SIUtil.isNull(lDeliveryTime)) lDeliveryTime="";
    this.deliveryTime=SIUtil.changeTo(lDeliveryTime.trim(),this.encode);
    String[] lTime=SIStringUtil.split(lDeliveryTime,"-");
    if (lTime.length==2){
      setDeliveryTimeFrom(lTime[0]);
      setDeliveryTimeTo(lTime[1]);
    }else{
      setDeliveryTimeFrom("");
      setDeliveryTimeTo("");
    }
  }
  
  public String getAddressCode(){
    return this.addressCode;
  }
  
  public String getCustCode(){
    return this.custCode;
  }
  
  public String getDeliveryTime(){
    if (SIUtil.isNotNull(getDeliveryTimeFrom())&&SIUtil.isNotNull(getDeliveryTimeTo())){
      return getDeliveryTimeFrom()+"-"+getDeliveryTimeTo();
    }else return "";
  }
  
  public boolean reset(Connection lConnection){
    super.reset(lConnection);
    return true;
  }
  
  public boolean initByAddress(HttpServletRequest lRequest,Connection lConnection,SIURLParameter lUrlParam){//7.1.1 ST0236 修正
    log.debug("initByAddress start ...");
    this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
    //7.1.1 ST0236 修正 ここから
    super.init(lRequest,lUrlParam);
    this.setCustCode((String)lUrlParam.getParam("custCode"));//顧客コード
    this.setAddressCode((String)lUrlParam.getParam("addressCode"));//アドレス帳のコード
    this.setDeliveryDateYear((String)lUrlParam.getParam("deliveryDateYear"));//配送希望日
    this.setDeliveryDateMonth((String)lUrlParam.getParam("deliveryDateMonth"));//配送希望日
    this.setDeliveryDateDay((String)lUrlParam.getParam("deliveryDateDay"));//配送希望日
    this.setShippmentDateYear((String)lUrlParam.getParam("shippmentDateYear"));//出荷日
    this.setShippmentDateMonth((String)lUrlParam.getParam("shippmentDateMonth"));//出荷日
    this.setShippmentDateDay((String)lUrlParam.getParam("shippmentDateDay"));//出荷日
    this.setDeliveryTypeName((String)lUrlParam.getParam("deliveryTypeName"));//配送種別名称
    this.setDeliveryTime((String)lUrlParam.getParam("deliveryTime"));//配送時間帯
    this.setTaxRate(SITax.getTaxRate(lConnection));//税率
    //7.1.1 ST0236 修正 ここまで
    
    SICustAddress lCustAddress=new SICustAddress(getCustCode(),getAddressCode());
    
    if (lCustAddress.reset(lConnection)==false) return false;
    
    this.setEncode(SIConfig.SIENCODE_NONE);
    this.setDeliveryName(lCustAddress.getDeliveryName());//配送先呼称
    this.setDeliveryAddressee(lCustAddress.getDeliveryAddressee());//配送先正式名
    this.setEmail(lCustAddress.getEmail());//EMAIL
    this.setPostCode1(lCustAddress.getPostCode1());//郵便番号1
    this.setPostCode2(lCustAddress.getPostCode2());//郵便番号2
    this.setAddress1(lCustAddress.getAddress1());//住所1
    this.setAddress2(lCustAddress.getAddress2());//住所2
    this.setAddress3(lCustAddress.getAddress3());//住所3
    this.setCompanyName(lCustAddress.getCompanyName());//会社名
    this.setTel(lCustAddress.getTel());//連絡先電話番号
    this.setFax(lCustAddress.getFax());//連絡先FAX番号
    return true;
  }
  
  public void init(HttpServletRequest lRequest,Connection lConnection,SIURLParameter lUrlParam){//7.1.1 ST0236 修正
    SILogin lLogin=SIHTMLUtil.getLogin(lRequest);
    this.setEncode(SIConfig.SIENCODE_SHIFT_JIS);
    //7.1.1 ST0236 修正 ここから
    super.init(lRequest,lUrlParam);
    this.setOrderCode((String)lUrlParam.getParam("orderCode"));//受注番号
    this.setDeliveryCode((String)lUrlParam.getParam("deliveryCode"));//受注配送先項番
    this.setDeliveryName((String)lUrlParam.getParam("deliveryName"));//配送先宛名
    this.setDeliveryAddressee((String)lUrlParam.getParam("deliveryAddressee"));//配送先呼称
    this.setEmail((String)lUrlParam.getParam("email"));//メール
    this.setPostCode1((String)lUrlParam.getParam("postCode1"));//郵便番号1
    this.setPostCode2((String)lUrlParam.getParam("postCode2"));//郵便番号2
    this.setAddress1((String)lUrlParam.getParam("address1"));//配送先住所1
    this.setAddress2((String)lUrlParam.getParam("address2"));//配送先住所2
    this.setAddress3((String)lUrlParam.getParam("address3"));//配送先住所3
    this.setCompanyName((String)lUrlParam.getParam("companyName"));//会社名
    this.setTel((String)lUrlParam.getParam("tel"));//連絡先電話番号
    this.setFax((String)lUrlParam.getParam("fax"));//連絡先FAX番号
    this.setReCalcFeeFlg((String)lUrlParam.getParam("reCalcFeeFlg"));//送料再計算
    this.setDeliveryDateYear((String)lUrlParam.getParam("deliveryDateYear"));//配送希望日
    this.setDeliveryDateMonth((String)lUrlParam.getParam("deliveryDateMonth"));//配送希望日
    this.setDeliveryDateDay((String)lUrlParam.getParam("deliveryDateDay"));//配送希望日
    this.setShippmentDateYear((String)lUrlParam.getParam("shippmentDateYear"));//出荷日
    this.setShippmentDateMonth((String)lUrlParam.getParam("shippmentDateMonth"));//出荷日
    this.setShippmentDateDay((String)lUrlParam.getParam("shippmentDateDay"));//出荷日
    this.setDeliveryTypeName((String)lUrlParam.getParam("deliveryTypeName"));//配送種別名称
    this.setDeliveryTime((String)lUrlParam.getParam("deliveryTime"));//配送時間帯
    this.setTaxRate((String)lUrlParam.getParam("taxRate"));//税率
    //7.1.1 ST0236 修正 ここまで
    
    if (reloadEnable()==true){
      String deliveryFee="0";
      try {
        deliveryFee =SIDeliveryFee.calcDeliveryFee(lConnection,lLogin.getMallShopCode(),this,false);
      } catch (SIDBAccessException e) {
        e.printStackTrace();
      }
      this.setDeliveryFee(deliveryFee);//送料
    }else{
      this.setDeliveryFee((String)lUrlParam.getParam("deliveryFee"));//送料  //7.1.1 ST0236 修正
    }
  }
  
  public boolean validate(HttpServletRequest lRequest,Connection lConnection){
    lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY);
    SICustomErrors errors=new SICustomErrors();
    
    SICheckValid.checkValid(errors, "配送先宛名", this.getDeliveryAddressee(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
    SICheckValid.checkValid(errors, "配送先宛名", this.getDeliveryAddressee(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,50);
    
    //7.1.1 ST0162 修正 ここから
    SICheckValid.checkValid(errors, "郵便番号(上3桁)", this.getPostCode1(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE + SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    SICheckValid.checkValid(errors, "郵便番号(下4桁)", this.getPostCode2(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE + SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    //7.1.1 ST0162 修正 ここまで
    if (this.getPostCode1().toString().trim().length() != 3||this.getPostCode2().toString().trim().length() != 4) {errors.addError(new SICustomError("manager.app.postcode.form"));}
    
    SICheckValid.checkValid(errors, "配送先呼称", this.getDeliveryName(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
    SICheckValid.checkValid(errors, "配送先呼称", this.getDeliveryName(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,10);
    
    SICheckValid.checkValid(errors, "送料", this.getDeliveryFee(),SICheckDataConf.SICHECK_DATA_DIGIT_TYPE);
    
    //7.1.1 ST0162 修正 ここから
    SICheckValid.checkValid(errors, "住所1(都道府県)", this.getAddress1(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
    
    SICheckValid.checkValid(errors, "住所2(市区町村・番地)", this.getAddress2(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
    SICheckValid.checkValid(errors, "住所2(市区町村・番地)", this.getAddress2(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,100);
    
    SICheckValid.checkValid(errors, "住所3(ビル名・階など)", this.getAddress3(), SICheckDataConf.SICHECK_DATA_BYTE_LEN_WITHIN_TYPE,100);
    //7.1.1 ST0162 修正 ここまで
    
    SICheckValid.checkValid(errors, "連絡先電話番号", this.getTel(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE + SICheckDataConf.SICHECK_DATA_PHONE_TYPE);
    
    SICheckValid.checkValid(errors, "連絡先FAX番号", this.getFax(), SICheckDataConf.SICHECK_DATA_PHONE_TYPE);
    
    SICheckValid.checkValid(errors, "メールアドレス", this.getEmail(), SICheckDataConf.SICHECK_DATA_EMPTY_TYPE+SICheckDataConf.SICHECK_DATA_MAIL_TYPE);
    
    SICheckValid.checkValid(errors,"配送希望日",this.getDeliveryDate(),SICheckDataConf.SICHECK_DATA_DATE_TYPE);
    
    SICheckValid.checkValid(errors,"出荷日",this.getShippmentDate(),SICheckDataConf.SICHECK_DATA_DATE_TYPE);
    
    SICheckValid.checkValid(errors,"出荷日","配送希望日",this.getShippmentDate(),this.getDeliveryDate(),SICheckDataConf.SICHECK_DATA_DATE_LESS_TYPE);
    
    SICheckValid.checkValid(errors,"配送方法",this.getDeliveryTypeName(),SICheckDataConf.SICHECK_DATA_EMPTY_TYPE);
    
    if (!errors.isEmpty()) lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY,errors);
    return errors.isEmpty();
  }
  
  public Collection getDeliveryTypeColl(Connection lConnection,String lMallShopCode){
    Collection lResultColl=new ArrayList();
    HashMap tempMap=new HashMap();
    HashMap resMap=new HashMap();
    
    StringBuffer lSqlBuf=new StringBuffer();
    lSqlBuf.append("SELECT bb.ShopCode AS Code,cc.DeliveryTypeName AS Name ");
    //7.2.0 ST1030 修正 ここから
    lSqlBuf.append("FROM ");
    lSqlBuf.append(SIConfig.SIVIEW_ORDER_DELIVERY_LATEST_NAME).append(" aa,");
    lSqlBuf.append(SIConfig.SIVIEW_ORDER_DETAIL_LATEST_NAME).append(" bb,");
    //lSqlBuf.append("FROM OrderDeliveryTbl").append(SIDBMultiConf.SIALIAS_CURR_NAME).append("aa,");
    //lSqlBuf.append("OrderDetailTbl").append(SIDBMultiConf.SIALIAS_CURR_NAME).append("bb,");
    //7.2.0 ST1030 修正 ここまで
    lSqlBuf.append("DeliveryTypeMTbl cc ");
    lSqlBuf.append("WHERE aa.OrderCode=bb.OrderCode AND aa.DeliveryCode=bb.DeliveryCode AND bb.ShopCode=cc.MallShopCode ");
    lSqlBuf.append("AND aa.OrderCode=").append(SIDBUtil.SQL2Str(getOrderCode()," "));
    lSqlBuf.append("AND aa.DeliveryCode=").append(SIDBUtil.SQL2Str(getDeliveryCode()," "));
    lSqlBuf.append("ORDER BY Code");
    
    log.debug("getDeliveryTypeColl:lSqlBuf="+lSqlBuf.toString());
    
    Statement lStatement=null;
    ResultSet lResultSet=null;
    
    String lCurrCode="";String lPrevCode=""; boolean first=true;String lName="";int ii=0;
    try {
      lStatement=lConnection.createStatement();
      lResultSet=lStatement.executeQuery(lSqlBuf.toString());
      while (lResultSet.next()){
        ii++;
        lCurrCode=lResultSet.getString("Code");
        lName=lResultSet.getString("Name");
        if (!lCurrCode.equals(lPrevCode)){
          if (SIUtil.isNotNull(lPrevCode))first=false;
          resMap=(HashMap)tempMap.clone();
          tempMap=new HashMap();
          lPrevCode=lCurrCode;
        }
        if (first)tempMap.put(lName,null);
        else if (resMap.containsKey(lName))tempMap.put(lName,null);
      }
      resMap=(HashMap)tempMap.clone();
    } catch (SQLException e) {
      e.printStackTrace();
      return new ArrayList();
    }finally{
      SIDBUtil.close( lStatement,lResultSet);
    }
    
    String[] lResArray=(String[])resMap.keySet().toArray(new String[0]);
    for (int jj=0;jj<lResArray.length;jj++){
      lResultColl.add(new SINameValue(lResArray[jj],lResArray[jj]));
    }
    
    //一つでもなければ、管理者が所属する配送先から選択
    if (ii==0){
      lSqlBuf=new StringBuffer();
      lSqlBuf.append("SELECT DeliveryTypeName,DeliveryTypeName FROM DeliveryTypeMTbl ");
      lSqlBuf.append("WHERE  MallShopCode=").append(SIDBUtil.SQL2Str(lMallShopCode," "));
      log.debug("getDeliveryTypeColl:lSqlBuf="+lSqlBuf.toString());
      try {
        lResultColl=SIDBUtil.getCollection(lConnection, lSqlBuf.toString());
      } catch (SIDBAccessException e1) {
        e1.printStackTrace();
        lResultColl=new ArrayList();
      }
    }
    lResultColl=SIUtil.insertColl(lResultColl,new SINameValue("選択してください",""));
    return lResultColl;
  }
}