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

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import jp.co.sint.basic.SIBasic;
import jp.co.sint.basic.SICmdtyCompositionAppended;
import jp.co.sint.basic.SICmdtyCompositionGroupData;
import jp.co.sint.basic.SICmdtyCompositionGroupDetail;
import jp.co.sint.basic.SICmdtyCompositionOption;
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.SICustomError;
import jp.co.sint.tools.SICustomErrors;
import jp.co.sint.tools.SIURLParameter;
import jp.co.sint.tools.SIUtil;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Category;

/**
 * @version $Id: UICmdtyCompositionopt.java,v 1.0 Exp $
 * @author paku
 * @Description: 構成品選択画面
 * @History
 * @Author
 * Author          Date        Reason
 * ==============  ==========  ===========================
 *           paku 2012/12/04   Original
 */
public class UICmdtyCompositionopt extends SIBasic {

  private static final long serialVersionUID = 1L;

  // ログ用のインスタンスの生成
  private static Category log = Category.getInstance(SIConfig.SILOG4J_WEBSHOP_CATEGORY_NAME);

  // 表示用
  private Collection groupColl = new ArrayList();
  private Collection appendedColl = new ArrayList();
  private Collection optionColl = new ArrayList();

  // 商品構成グループ
  private Collection compositionGroupList = new ArrayList();

  // 添付商品
  private Collection compositionAppendedList = new ArrayList();

  // オプション商品
  private Collection compositionOptionList = new ArrayList();

  // 商品構成フラグ
  private String cmdtyCompositionFlg = "";

  // よりどり点数
  private String sectionCount = "";

  // 数量
  private int amount = 0;

  // セット値引き
  private String setDiscount = "";

  // セット番号
  private int setCode = 0;

  // 在庫チェックフラグ
  private boolean noCheckStock = false;

  /**
   * <b>init</b> パラメータを設定します。
   *
   * @param lRequest
   *          クライアントからのリクエスト
   * @param lUrlParam
   * @param conn
   * @throws SIDBAccessException
   */
  public void init(HttpServletRequest lRequest, SIURLParameter lUrlParam, Connection conn) throws SIDBAccessException {
    super.init(lRequest, lUrlParam);
    this.cmdtyCompositionFlg = (String) lUrlParam.getParam("cmdtyCompositionFlg");
    String cmdtyCode = (String) lUrlParam.getParam("cmdtyCodeTxt");
    String individualCode = (String) lUrlParam.getParam("individualCodeTxt");
    String branchCode = (String) lUrlParam.getParam("branchCodeTxt");
    String amountStr = (String) lUrlParam.getParam("selectSetAmount");
    String cmdtyName = (String) lUrlParam.getParam("cmdtyName");

    int setDetailCode = 0;

    if (SIUtil.isNull(this.cmdtyCompositionFlg) || this.cmdtyCompositionFlg.equals(SIConfig.CMDTY_COMPOSITION_NORMAL)) return;

    if (this.cmdtyCompositionFlg.equals(SIConfig.CMDTY_COMPOSITION_SELECTION_SET)) {
      amountStr = "1";
      setAmount(Integer.parseInt(amountStr));
      int sectionCount = 0;
      if (SIUtil.isNotNull(this.sectionCount) && StringUtils.isNumeric(this.sectionCount)) {
        sectionCount = Integer.parseInt(this.sectionCount);
      }

      if (sectionCount <= 0) return;

      // 構成品
      Iterator iteGroupData = this.groupColl.iterator();
      while (iteGroupData.hasNext()) {
        SICmdtyCompositionGroupData cmdtyCompositionGroupData = (SICmdtyCompositionGroupData) iteGroupData.next();
        if (cmdtyCompositionGroupData == null)
          break;
        Iterator iteGroupDetail = cmdtyCompositionGroupData.getCompositionGroupDetail().iterator();
        while (iteGroupDetail.hasNext()) {
          SICmdtyCompositionGroupDetail cmdtyCompositionGroupDetail = (SICmdtyCompositionGroupDetail) iteGroupDetail.next();
          if (cmdtyCompositionGroupDetail == null)
            break;

          String selectCmdtyAmountStr = cmdtyCompositionGroupDetail.getCompositionCount();
          if (SIUtil.isNull(selectCmdtyAmountStr) || !StringUtils.isNumeric(selectCmdtyAmountStr))
            continue;
          int selectCmdtyAmount = Integer.parseInt(selectCmdtyAmountStr);

          //
          String selectSetCmdty = (String) lUrlParam.getParam("selectSetCmdty_" + cmdtyCompositionGroupDetail.getDetailIndividualCode() + "_" + cmdtyCompositionGroupData.getGroupCode());
          if (!cmdtyCompositionGroupDetail.getDetailIndividualCode().equals(selectSetCmdty))
            continue;
          selectCmdtyAmountStr = (String) lUrlParam.getParam("selectCmdtyAmount_" + cmdtyCompositionGroupDetail.getDetailIndividualCode() + "_" + cmdtyCompositionGroupData.getGroupCode());
          if (SIUtil.isNull(selectCmdtyAmountStr) || !StringUtils.isNumeric(selectCmdtyAmountStr))
            continue;
          selectCmdtyAmount = selectCmdtyAmount * Integer.parseInt(selectCmdtyAmountStr);

          SIKeepDetail keepDetail = this.createKeepDetail(conn, cmdtyCompositionGroupDetail.getDetailCmdtyCode(), cmdtyCompositionGroupDetail.getDetailIndividualCode());
          keepDetail.setSetCmdtyCode(cmdtyCode);
          keepDetail.setSetIndividualCode(individualCode);
          keepDetail.setCmdtyCode(cmdtyCompositionGroupDetail.getDetailCmdtyCode());
          keepDetail.setIndividualCode(cmdtyCompositionGroupDetail.getDetailIndividualCode());
          keepDetail.setIndividualName(cmdtyCompositionGroupDetail.getDetailIndividualName());
          keepDetail.setUsedNewFlg(cmdtyCompositionGroupDetail.getUsedNewFlg());
          keepDetail.setBranchCode(branchCode);
          keepDetail.setAmount(String.valueOf(selectCmdtyAmount));
          keepDetail.setCost(cmdtyCompositionGroupDetail.getCost());
          keepDetail.setPrice(cmdtyCompositionGroupDetail.getUnitPrice());
          keepDetail.setSetDetailFlg(SIConfig.SET_DETAIL_FLG_COMPOSITION);
          keepDetail.setSetDiscount(this.setDiscount);
          keepDetail.setSetAmount("1"); // よりどりはセット数量1固定
          keepDetail.setSetDetailCode(String.valueOf(++setDetailCode));
          keepDetail.setSetCmdtyName(cmdtyName);
          keepDetail.setCmdtyName(cmdtyCompositionGroupDetail.getCmdtyName());
          this.compositionGroupList.add(keepDetail);
        }
      }

    } else {

      if (SIUtil.isNull(amountStr) || !StringUtils.isNumeric(amountStr))
        return;
      int amount = Integer.parseInt(amountStr);
      this.amount = amount;

      // 構成品
      Iterator iteGroupData = this.groupColl.iterator();
      while (iteGroupData.hasNext()) {
        SICmdtyCompositionGroupData cmdtyCompositionGroupData = (SICmdtyCompositionGroupData) iteGroupData.next();
        if (cmdtyCompositionGroupData == null)
          break;
        Iterator iteGroupDetail = cmdtyCompositionGroupData.getCompositionGroupDetail().iterator();
        while (iteGroupDetail.hasNext()) {
          SICmdtyCompositionGroupDetail cmdtyCompositionGroupDetail = (SICmdtyCompositionGroupDetail) iteGroupDetail.next();
          if (cmdtyCompositionGroupDetail == null)
            break;
          String selectCmdtyAmountStr = cmdtyCompositionGroupDetail.getCompositionCount();
          if (SIUtil.isNull(selectCmdtyAmountStr) || !StringUtils.isNumeric(selectCmdtyAmountStr))
            continue;
          int selectCmdtyAmount = Integer.parseInt(selectCmdtyAmountStr);
          if (SIConfig.CMDTY_COMPOSITION_VARIATION_SET.equals(cmdtyCompositionFlg) || SIConfig.CMDTY_COMPOSITION_SPECIFICATION.equals(cmdtyCompositionFlg)) {
            String selectSetCmdty = (String) lUrlParam.getParam("selectSetCmdty_" + cmdtyCompositionGroupData.getGroupCode());
            if (!cmdtyCompositionGroupDetail.getDetailIndividualCode().equals(selectSetCmdty))
              continue;
          } else if (SIConfig.CMDTY_COMPOSITION_SELECTION_SET.equals(cmdtyCompositionFlg)) {
            String selectSetCmdty = (String) lUrlParam.getParam("selectSetCmdty_" + cmdtyCompositionGroupDetail.getDetailIndividualCode() + "_" + cmdtyCompositionGroupData.getGroupCode());
            if (!cmdtyCompositionGroupDetail.getDetailIndividualCode().equals(selectSetCmdty))
              continue;
            selectCmdtyAmountStr = (String) lUrlParam.getParam("selectCmdtyAmount_" + cmdtyCompositionGroupDetail.getDetailIndividualCode() + "_" + cmdtyCompositionGroupData.getGroupCode());
            if (SIUtil.isNull(selectCmdtyAmountStr) || !StringUtils.isNumeric(selectCmdtyAmountStr))
              continue;
            selectCmdtyAmount = Integer.parseInt(selectCmdtyAmountStr);
          } else if (SIConfig.CMDTY_COMPOSITION_FIXED_SET.equals(cmdtyCompositionFlg)) {
          } else {
          }
          SIKeepDetail keepDetail = this.createKeepDetail(conn, cmdtyCompositionGroupDetail.getDetailCmdtyCode(), cmdtyCompositionGroupDetail.getDetailIndividualCode());
          keepDetail.setSetCmdtyCode(cmdtyCode);
          keepDetail.setSetIndividualCode(individualCode);
          keepDetail.setCmdtyCode(cmdtyCompositionGroupDetail.getDetailCmdtyCode());
          keepDetail.setIndividualCode(cmdtyCompositionGroupDetail.getDetailIndividualCode());
          keepDetail.setIndividualName(cmdtyCompositionGroupDetail.getDetailIndividualName());
          keepDetail.setUsedNewFlg(cmdtyCompositionGroupDetail.getUsedNewFlg());
          keepDetail.setBranchCode(branchCode);
          keepDetail.setAmount(String.valueOf(selectCmdtyAmount * amount));
          keepDetail.setCost(cmdtyCompositionGroupDetail.getCost());
          keepDetail.setPrice(cmdtyCompositionGroupDetail.getUnitPrice());
          keepDetail.setSetDetailFlg(SIConfig.SET_DETAIL_FLG_COMPOSITION);
          keepDetail.setSetDiscount(this.setDiscount);
          keepDetail.setSetAmount(String.valueOf(this.amount));
          keepDetail.setSetDetailCode(String.valueOf(++setDetailCode));
          keepDetail.setSetCmdtyName(cmdtyName);
          keepDetail.setCmdtyName(cmdtyCompositionGroupDetail.getCmdtyName());
          this.compositionGroupList.add(keepDetail);
        }
      }
    }

    if (getAmount() <= 0) return; // セット数がないため

    // 添付品
    Iterator iteAppended = this.appendedColl.iterator();
    while (iteAppended.hasNext()) {
      SICmdtyCompositionAppended cmdtyCompositionAppended = (SICmdtyCompositionAppended) iteAppended.next();
      if (cmdtyCompositionAppended == null)
        break;
      String selectCmdtyAmountStr = cmdtyCompositionAppended.getAppendedCount();
      if (SIUtil.isNull(selectCmdtyAmountStr) || !StringUtils.isNumeric(selectCmdtyAmountStr))
        continue;
      int selectCmdtyAmount = Integer.parseInt(selectCmdtyAmountStr);
      if (SIUtil.isNull(cmdtyCompositionAppended.getSetCount()) || !StringUtils.isNumeric(cmdtyCompositionAppended.getSetCount()))
        continue;
      int setCount = Integer.parseInt(cmdtyCompositionAppended.getSetCount());
      if ((int) (setCount / amount) <= 0)
        continue;
      SIKeepDetail keepDetail = this.createKeepDetail(conn, cmdtyCompositionAppended.getDetailCmdtyCode(), cmdtyCompositionAppended.getDetailIndividualCode());
      keepDetail.setSetCmdtyCode(cmdtyCode);
      keepDetail.setSetIndividualCode(individualCode);
      keepDetail.setCmdtyCode(cmdtyCompositionAppended.getDetailCmdtyCode());
      keepDetail.setIndividualCode(cmdtyCompositionAppended.getDetailIndividualCode());
      keepDetail.setUsedNewFlg(cmdtyCompositionAppended.getUsedNewFlg());
      keepDetail.setBranchCode(branchCode);
      keepDetail.setAmount(String.valueOf(selectCmdtyAmount * amount));
      keepDetail.setCost("0");
      keepDetail.setPrice("0");
      keepDetail.setOrgPrice("0");
      keepDetail.setSetDetailFlg(SIConfig.SET_DETAIL_FLG_APPENDED);
      keepDetail.setSetDiscount(this.setDiscount);
      keepDetail.setSetAmount(String.valueOf(this.amount));
      keepDetail.setSetDetailCode(String.valueOf(++setDetailCode));
      keepDetail.setSetCmdtyName(cmdtyName);
      keepDetail.setCmdtyName(cmdtyCompositionAppended.getCmdtyName());
      this.compositionAppendedList.add(keepDetail);
    }

    // オプション
    Iterator iteOption = this.optionColl.iterator();
    while (iteOption.hasNext()) {
      SICmdtyCompositionOption cmdtyCompositionOption = (SICmdtyCompositionOption) iteOption.next();
      if (cmdtyCompositionOption == null)
        break;
      String selectCmdtyAmountStr = cmdtyCompositionOption.getCompositionCount();
      if (SIUtil.isNull(selectCmdtyAmountStr) || !StringUtils.isNumeric(selectCmdtyAmountStr))
        continue;
      int selectCmdtyAmount = Integer.parseInt(selectCmdtyAmountStr);
      String selectSetCmdty = (String) lUrlParam.getParam("selectSetOption_" + cmdtyCompositionOption.getDetailIndividualCode());
      if (!cmdtyCompositionOption.getDetailIndividualCode().equals(selectSetCmdty))
        continue;
      SIKeepDetail keepDetail = this.createKeepDetail(conn, cmdtyCompositionOption.getDetailCmdtyCode(), cmdtyCompositionOption.getDetailIndividualCode());
      keepDetail.setSetCmdtyCode(cmdtyCode);
      keepDetail.setSetIndividualCode(individualCode);
      keepDetail.setCmdtyCode(cmdtyCompositionOption.getDetailCmdtyCode());
      keepDetail.setIndividualCode(cmdtyCompositionOption.getDetailIndividualCode());
      keepDetail.setUsedNewFlg(cmdtyCompositionOption.getUsedNewFlg());
      keepDetail.setBranchCode(branchCode);
      keepDetail.setAmount(String.valueOf(selectCmdtyAmount * amount));
      keepDetail.setCost(cmdtyCompositionOption.getCost());
      keepDetail.setPrice(cmdtyCompositionOption.getUnitPrice());
      keepDetail.setSetDetailFlg(SIConfig.SET_DETAIL_FLG_OPTION);
      keepDetail.setSetDiscount(this.setDiscount);
      keepDetail.setSetAmount(String.valueOf(this.amount));
      keepDetail.setSetDetailCode(String.valueOf(++setDetailCode));
      keepDetail.setSetCmdtyName(cmdtyName);
      keepDetail.setCmdtyName(cmdtyCompositionOption.getCmdtyName());
      this.compositionOptionList.add(keepDetail);
    }
  }

  /**
   * <b>validate</b> 入力したデータをチェックして、同時にSQLの条件文を作成します。
   *
   * @param lRequest
   *          クライアントからのリクエスト
   */
  public boolean validate(HttpServletRequest lRequest, Connection conn) {
    SICustomErrors errors = new SICustomErrors();
    SIURLParameter lUrlParam = new SIURLParameter(lRequest);

//    String amountStr = (String) lUrlParam.getParam("selectSetAmount");
//    int amount = 0;
//    if (SIUtil.isNotNull(amountStr) || StringUtils.isNumeric(amountStr)) {
//      amount = Integer.parseInt(amountStr);
//    }

    if (!SIConfig.CMDTY_COMPOSITION_SELECTION_SET.equals(this.cmdtyCompositionFlg)){
      if (getAmount() <= 0) {
        errors.addError(new SICustomError("input.data.check.require", "数量"));
      }
    }

    int sectionCount = 0;
    if (SIUtil.isNotNull(this.sectionCount) && StringUtils.isNumeric(this.sectionCount)) {
      sectionCount = Integer.parseInt(this.sectionCount);
    }

    // EDBTG003-00 [不具合管理票-No25] 2013/03/14 nagayoshi add start
    Map tempMap = new HashMap();
    // EDBTG003-00 [不具合管理票-No25] 2013/03/14 nagayoshi add end

    // 構成品
    int countSectionCount = 0;
    Iterator iteGroupData = this.groupColl.iterator();
    while (iteGroupData.hasNext()) {
      SICmdtyCompositionGroupData cmdtyCompositionGroupData = (SICmdtyCompositionGroupData) iteGroupData.next();
      if (cmdtyCompositionGroupData == null)
        break;
      int branchStock = 0;
      Iterator iteGroupDetail = cmdtyCompositionGroupData.getCompositionGroupDetail().iterator();
      while (iteGroupDetail.hasNext()) {
        SICmdtyCompositionGroupDetail cmdtyCompositionGroupDetail = (SICmdtyCompositionGroupDetail) iteGroupDetail.next();
        if (cmdtyCompositionGroupDetail == null)
          break;
        String selectCmdtyAmountStr = cmdtyCompositionGroupDetail.getCompositionCount();
        if (SIUtil.isNull(selectCmdtyAmountStr) || !StringUtils.isNumeric(selectCmdtyAmountStr))
          continue;
        int selectCmdtyAmount = Integer.parseInt(selectCmdtyAmountStr);
        if (SIConfig.CMDTY_COMPOSITION_VARIATION_SET.equals(cmdtyCompositionFlg) || SIConfig.CMDTY_COMPOSITION_SPECIFICATION.equals(cmdtyCompositionFlg)) {
          String selectSetCmdty = (String) lUrlParam.getParam("selectSetCmdty_" + cmdtyCompositionGroupData.getGroupCode());
          if (!cmdtyCompositionGroupDetail.getDetailIndividualCode().equals(selectSetCmdty))
            continue;
        } else if (SIConfig.CMDTY_COMPOSITION_SELECTION_SET.equals(cmdtyCompositionFlg)) {

          String selectSetCmdty = (String) lUrlParam.getParam("selectSetCmdty_" + cmdtyCompositionGroupDetail.getDetailIndividualCode() + "_" + cmdtyCompositionGroupData.getGroupCode());
          if (!cmdtyCompositionGroupDetail.getDetailIndividualCode().equals(selectSetCmdty))
            continue;
          selectCmdtyAmountStr = (String) lUrlParam.getParam("selectCmdtyAmount_" + cmdtyCompositionGroupDetail.getDetailIndividualCode() + "_" + cmdtyCompositionGroupData.getGroupCode());
          if (SIUtil.isNotNull(selectCmdtyAmountStr) && StringUtils.isNumeric(selectCmdtyAmountStr)) {
            selectCmdtyAmount = selectCmdtyAmount * Integer.parseInt(selectCmdtyAmountStr);
            countSectionCount += Integer.parseInt(selectCmdtyAmountStr);
          }
        } else if (SIConfig.CMDTY_COMPOSITION_FIXED_SET.equals(cmdtyCompositionFlg)) {
        } else {
        }
//        countSectionCount += selectCmdtyAmount;

        // [ 各構成品数量 * セット品数量 ] にて、各構成品の在庫数量を算出し、在庫数量チェックを行う。在庫なしの場合は、エラーとする。
        branchStock = 0;
        String branchStockStr = (String) lUrlParam.getParam("branchStock_" + cmdtyCompositionGroupDetail.getDetailIndividualCode() + "_" + cmdtyCompositionGroupData.getGroupCode());
        if (SIUtil.isNotNull(branchStockStr) && StringUtils.isNumeric(branchStockStr)) {
          branchStock = Integer.parseInt(branchStockStr);
        }
        if (SIConfig.CMDTY_COMPOSITION_SELECTION_SET.equals(this.cmdtyCompositionFlg)) {
          if (!this.noCheckStock && !cmdtyCompositionGroupDetail.getAmountFlg().equals("0") && (branchStock == 0 || branchStock < selectCmdtyAmount)) {
            errors.addError(new SICustomError("input.data.check.stock", "構成品(" + cmdtyCompositionGroupDetail.getDetailIndividualCode() + ")"));
          }
        } else {
          if (!this.noCheckStock && !cmdtyCompositionGroupDetail.getAmountFlg().equals("0") && (branchStock == 0 || branchStock < selectCmdtyAmount * amount)) {
            errors.addError(new SICustomError("input.data.check.stock", "構成品(" + cmdtyCompositionGroupDetail.getDetailIndividualCode() + ")"));
          }
        }

        // EDBTG003-00 [不具合管理票-No25] 2013/03/14 nagayoshi add start
        if (tempMap.containsKey(cmdtyCompositionGroupDetail.getDetailIndividualCode())) {
          String tmpamount = (String)tempMap.get(cmdtyCompositionGroupDetail.getDetailIndividualCode());
          tempMap.put(cmdtyCompositionGroupDetail.getDetailIndividualCode(), String.valueOf((selectCmdtyAmount * amount) + Integer.parseInt(tmpamount)));
        } else {
          tempMap.put(cmdtyCompositionGroupDetail.getDetailIndividualCode(), String.valueOf((selectCmdtyAmount * amount)));
        }
        // EDBTG003-00 [不具合管理票-No25] 2013/03/14 nagayoshi add end

      }

//      // [ よりどりセット品 ]の場合、(グループ毎)構成品、未選択の場合は、エラーとする
//      if (SIConfig.CMDTY_COMPOSITION_SELECTION_SET.equals(cmdtyCompositionFlg) && countGrp < 1) {
//        errors.addError(new SICustomError("input.data.check.require", "構成品(グループ" + cmdtyCompositionGroupData.getGroupCode() + ")"));
//      }
    }

    // [ よりどりセット品 ]の場合、選択された構成品の在庫数量を加算し、よりどり点数に満たない場合は、エラーとする
    if (SIConfig.CMDTY_COMPOSITION_SELECTION_SET.equals(this.cmdtyCompositionFlg) && sectionCount != countSectionCount) {
      errors.addError(new SICustomError("input.data.sectioncount", String.valueOf(sectionCount)));
    }

    // 添付品
    int countAppended = 0;
    Iterator iteAppendedData = this.appendedColl.iterator();
    while (iteAppendedData.hasNext()) {
      SICmdtyCompositionAppended cmdtyCompositionAppended = (SICmdtyCompositionAppended) iteAppendedData.next();
      if (cmdtyCompositionAppended == null) {
        break;
      }
      // EDBTG003-00 [不具合管理票-No25] 2013/03/14 nagayoshi mod start
//      int branchStock = 0;
//      countAppended++;
//      String selectCmdtyAmountStr = cmdtyCompositionAppended.getAppendedCount();
//      if (SIUtil.isNull(selectCmdtyAmountStr) || !StringUtils.isNumeric(selectCmdtyAmountStr))
//        continue;
//      int selectCmdtyAmount = Integer.parseInt(selectCmdtyAmountStr);
//
//      // [ 各構成品数量 * セット品数量 ] にて、各構成品の在庫数量を算出し、在庫数量チェックを行う。在庫なしの場合は、エラーとする。
//      String branchStockStr = (String) lUrlParam.getParam("appendedStock_" + cmdtyCompositionAppended.getDetailIndividualCode() + "_" + countAppended);
//      if (SIUtil.isNotNull(branchStockStr) && StringUtils.isNumeric(branchStockStr)) {
//        branchStock = Integer.parseInt(branchStockStr);
//      }
//      if (!this.noCheckStock && !cmdtyCompositionAppended.getAmountFlg().equals("0") && (branchStock == 0 || branchStock < selectCmdtyAmount * amount)){
//        errors.addError(new SICustomError("input.data.check.stock", "添付品(" + cmdtyCompositionAppended.getDetailIndividualCode() + ")"));
//      }
      // 在庫数量
      int branchStock = 0;
      // 添付品数量
      int selectCmdtyAmount = 0;
      countAppended++;
      // [ 各構成品数量 * セット品数量 ] にて、各構成品の在庫数量を算出し、在庫数量チェックを行う。在庫なしの場合は、エラーとする。
      String branchStockStr = (String) lUrlParam.getParam("appendedStock_" + cmdtyCompositionAppended.getDetailIndividualCode() + "_" + countAppended);
      if (SIUtil.isNotNull(branchStockStr) && StringUtils.isNumeric(branchStockStr)) {
        branchStock = Integer.parseInt(branchStockStr);
      }
      // 添付商品数の計算
      String setCount = cmdtyCompositionAppended.getSetCount(); // 添付のセット数(セット毎設定値)
      BigDecimal a = new BigDecimal(amount);
      BigDecimal b = new BigDecimal(setCount);
      BigDecimal calc = a.divide(b, BigDecimal.ROUND_DOWN);
      if (calc.compareTo(new BigDecimal(0)) > 0) {
        selectCmdtyAmount = Integer.parseInt(cmdtyCompositionAppended.getAppendedCount());
        if (tempMap.containsKey(cmdtyCompositionAppended.getDetailIndividualCode())) {
          selectCmdtyAmount = selectCmdtyAmount + Integer.parseInt((String)tempMap.get(cmdtyCompositionAppended.getDetailIndividualCode()));
        }
      }
      if (!this.noCheckStock && !cmdtyCompositionAppended.getAmountFlg().equals("0") && (branchStock == 0 || branchStock < selectCmdtyAmount)){
        errors.addError(new SICustomError("input.data.check.stock", "添付品(" + cmdtyCompositionAppended.getDetailIndividualCode() + ")"));
      }
      // EDBTG003-00 [不具合管理票-No25] 2013/03/14 nagayoshi mod end
    }

    // オプション
    int countOption = 0;
    Iterator iteOptionData = this.optionColl.iterator();
    while (iteOptionData.hasNext()) {
      SICmdtyCompositionOption cmdtyCompositionOption = (SICmdtyCompositionOption) iteOptionData.next();
      if (cmdtyCompositionOption == null)
        break;
      int branchStock = 0;
      countOption++;
      String selectCmdtyAmountStr = cmdtyCompositionOption.getCompositionCount();
      if (SIUtil.isNull(selectCmdtyAmountStr) || !StringUtils.isNumeric(selectCmdtyAmountStr))
        continue;
      int selectCmdtyAmount = Integer.parseInt(selectCmdtyAmountStr);
      String selectSetCmdty = (String) lUrlParam.getParam("selectSetOption_" + cmdtyCompositionOption.getDetailIndividualCode());
      if (!cmdtyCompositionOption.getDetailIndividualCode().equals(selectSetCmdty))
        continue;

      // [ 各構成品数量 * セット品数量 ] にて、各構成品の在庫数量を算出し、在庫数量チェックを行う。在庫なしの場合は、エラーとする。
      String branchStockStr = (String) lUrlParam.getParam("optionStock_" + cmdtyCompositionOption.getDetailIndividualCode() + "_" + countOption);
      if (SIUtil.isNotNull(branchStockStr) && StringUtils.isNumeric(branchStockStr)) {
        branchStock = Integer.parseInt(branchStockStr);
      }
      if (!this.noCheckStock && !cmdtyCompositionOption.getAmountFlg().equals("0") && (branchStock == 0 || branchStock < selectCmdtyAmount * amount)) {
        errors.addError(new SICustomError("input.data.check.stock", "オプション(" + cmdtyCompositionOption.getDetailIndividualCode() + ")"));
      }
    }

    if (!errors.isEmpty()) {
      lRequest.setAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY, errors);
      return false;
    } else {
      lRequest.removeAttribute(SIConfig.SIERROR_ATTRIBUTE_MESSAGE_KEY);
      return true;
    }
  }

  public SIKeepDetail createKeepDetail(Connection conn, String cmdtyCode, String individualCode) throws SIDBAccessException {
    SIKeepDetail keepDetail = new SIKeepDetail();
    Statement lStatement = null;
    ResultSet lResultSet = null;

    StringBuffer sql = new StringBuffer();
    sql.append("SELECT a.cmdtyname,a.cmdtysize,a.deliverytypecode,b.bgprice");
    sql.append(",CASE b.amountflg WHEN 0 THEN 1 ELSE 0 END AS cmdtyType ");
    sql.append(",CASE b.amountflg WHEN 0 THEN b.purchaseprice2 ELSE COALESCE(b.purchaseprice,0) END AS purchaseprice ");
    sql.append(",COALESCE(b.processingexpence,0) AS processingexpence ");
    sql.append("FROM cmdtymtbl a,individualtbl b ");
    sql.append("WHERE b.cmdtycode = ").append(SIDBUtil.SQL2Str(cmdtyCode, " "));
    sql.append("AND b.individualcode = ").append(SIDBUtil.SQL2Str(individualCode, " "));
    sql.append("AND b.cmdtycode = a.cmdtycode");

    try {
      lStatement = conn.createStatement();
      lResultSet = lStatement.executeQuery(sql.toString());
      while (lResultSet.next()) {
        keepDetail.setSize((String) lResultSet.getString("cmdtysize"));
        keepDetail.setDeliveryType((String) lResultSet.getString("deliverytypecode"));
        keepDetail.setOrgPrice((String) lResultSet.getString("bgprice"));
        keepDetail.setCmdtyType((String) lResultSet.getString("cmdtytype"));
        keepDetail.setPurchasePrice((String) lResultSet.getString("purchaseprice"));
        keepDetail.setProcessingExpence((String) lResultSet.getString("processingexpence"));
        keepDetail.setCost((String) lResultSet.getString("purchaseprice"));
      }
    } catch (Exception ex) {
      throw new SIDBAccessException(ex);
    } finally {
      SIDBUtil.close(lStatement, lResultSet);
    }
    return keepDetail;
  }

  /**
   * @return the groupColl
   */
  public Collection getGroupColl() {
    return groupColl;
  }

  /**
   * @param groupColl the groupColl to set
   */
  public void setGroupColl(Collection groupColl) {
    this.groupColl = groupColl;
  }

  /**
   * @return the appendedColl
   */
  public Collection getAppendedColl() {
    return appendedColl;
  }

  /**
   * @param appendedColl the appendedColl to set
   */
  public void setAppendedColl(Collection appendedColl) {
    this.appendedColl = appendedColl;
  }

  /**
   * @return the optionColl
   */
  public Collection getOptionColl() {
    return optionColl;
  }

  /**
   * @param optionColl the optionColl to set
   */
  public void setOptionColl(Collection optionColl) {
    this.optionColl = optionColl;
  }

  /**
   * @return the compositionGroupList
   */
  public Collection getCompositionGroupList() {
    return compositionGroupList;
  }

  /**
   * @param compositionGroupList the compositionGroupList to set
   */
  public void setCompositionGroupList(Collection compositionGroupList) {
    this.compositionGroupList = compositionGroupList;
  }

  /**
   * @return the compositionAppendedList
   */
  public Collection getCompositionAppendedList() {
    return compositionAppendedList;
  }

  /**
   * @param compositionAppendedList the compositionAppendedList to set
   */
  public void setCompositionAppendedList(Collection compositionAppendedList) {
    this.compositionAppendedList = compositionAppendedList;
  }

  /**
   * @return the compositionOptionList
   */
  public Collection getCompositionOptionList() {
    return compositionOptionList;
  }

  /**
   * @param compositionOptionList the compositionOptionList to set
   */
  public void setCompositionOptionList(Collection compositionOptionList) {
    this.compositionOptionList = compositionOptionList;
  }

  /**
   * @return the cmdtyCompositionFlg
   */
  public String getCmdtyCompositionFlg() {
    return cmdtyCompositionFlg;
  }

  /**
   * @param cmdtyCompositionFlg the cmdtyCompositionFlg to set
   */
  public void setCmdtyCompositionFlg(String cmdtyCompositionFlg) {
    this.cmdtyCompositionFlg = cmdtyCompositionFlg;
  }

  /**
   * @return the sectionCount
   */
  public String getSectionCount() {
    return sectionCount;
  }

  /**
   * @param sectionCount the sectionCount to set
   */
  public void setSectionCount(String sectionCount) {
    this.sectionCount = sectionCount;
  }

  /**
   * @return the amount
   */
  public int getAmount() {
    return amount;
  }

  /**
   * @param amount the amount to set
   */
  public void setAmount(int amount) {
    this.amount = amount;
  }

  /**
   * @return the setDiscount
   */
  public String getSetDiscount() {
    return setDiscount;
  }

  /**
   * @param setDiscount the setDiscount to set
   */
  public void setSetDiscount(String setDiscount) {
    this.setDiscount = setDiscount;
  }

  /**
   * @return the setCode
   */
  public int getSetCode() {
    return setCode;
  }

  /**
   * @param setCode the setCode to set
   */
  public void setSetCode(int setCode) {
    this.setCode = setCode;
  }

  /**
   * @return the noCheckStock
   */
  public boolean isNoCheckStock() {
    return noCheckStock;
  }

  /**
   * @param noCheckStock the noCheckStock to set
   */
  public void setNoCheckStock(boolean noCheckStock) {
    this.noCheckStock = noCheckStock;
  }

}
