/**
   * Find if this product as component
   *
   * @param M_Product_ID ID Component
   */
  public void component(int M_Product_ID, BigDecimal qtyRequiered) throws Exception {

    if (LevelNo == p_LevelNo) return;

    String value =
        DB.getSQLValueString(
            get_TrxName(), "SELECT Value FROM M_Product WHERE M_Product_ID=?", M_Product_ID);

    final StringBuilder whereClause =
        new StringBuilder(MPPProductBOM.COLUMNNAME_Value)
            .append("=? AND ")
            .append(MPPProductBOM.COLUMNNAME_M_Product_ID)
            .append("=?");
    List<MPPProductBOM> boms =
        new Query(getCtx(), MPPProductBOM.Table_Name, whereClause.toString(), get_TrxName())
            .setClient_ID()
            .setOnlyActiveRecords(true)
            .setParameters(value, M_Product_ID)
            .list();

    boolean level = false;
    for (MPPProductBOM bom : boms) {
      if (bom.isValidFromTo(p_DateTrx)) {
        if (!level) LevelNo += 1;
        level = true;
        parentExplotion(bom.get_ID(), qtyRequiered);
        LevelNo -= 1;
      }
    }
  }
  /** Action: Fill Tree with all nodes */
  private void loadBOM() throws Exception {
    int count = 0;
    if (p_M_Product_ID == 0) raiseError("Error: ", "Product ID not found");

    MProduct product = new MProduct(getCtx(), p_M_Product_ID, get_TrxName());
    X_T_BOMLine tboml = new X_T_BOMLine(ctx, 0, null);
    tboml.setAD_Org_ID(product.getAD_Org_ID());
    tboml.setPP_Product_BOM_ID(0);
    tboml.setPP_Product_BOMLine_ID(0);
    tboml.setSel_Product_ID(p_M_Product_ID);
    tboml.setM_Product_ID(p_M_Product_ID);
    tboml.setSel_Product_ID(p_M_Product_ID);
    tboml.setDateTrx(p_DateTrx);
    tboml.setImplosion(false);
    tboml.setLevelNo(0);
    tboml.setLevels("0");
    tboml.setQtyBOM(Env.ONE);
    tboml.setQtyRequired(p_QtyRequiered);
    tboml.setM_Warehouse_ID(p_M_Warehouse_ID);
    tboml.setSeqNo(0);
    tboml.setAD_PInstance_ID(AD_PInstance_ID);
    tboml.saveEx();

    final String whereClause = MPPProductBOM.COLUMNNAME_M_Product_ID + "=?";
    List<MPPProductBOM> boms =
        new Query(getCtx(), X_PP_Product_BOM.Table_Name, whereClause, get_TrxName())
            .setClient_ID()
            .setOnlyActiveRecords(true)
            .setParameters(p_M_Product_ID)
            .list();

    for (MPPProductBOM bom : boms) {
      if (bom.isValidFromTo(p_DateTrx)) {
        parentExplotion(bom.get_ID(), p_QtyRequiered);
        ++count;
      }
    }

    if (count == 0) raiseError("Error: ", "Product is not a BOM");
  }