protected LumberLog fromResultSet(ResultSet rs) throws SQLException {
    LumberLog lumberLog = new LumberLog();
    lumberLog.setId(rs.getLong("id"));
    lumberLog.setLength(rs.getDouble("length"));
    lumberLog.setRealLength(rs.getLong("reallength"));
    lumberLog.setVolume(rs.getDouble("volume"));
    lumberLog.setRealVolume(rs.getDouble("realvolume"));
    lumberLog.setSmallRadius(rs.getDouble("small_diameter"));
    lumberLog.setBigRadius(rs.getDouble("big_diameter"));
    lumberLog.setLumberType(rs.getLong("lumbertype"));
    lumberLog.setLumberClass(rs.getLong("lumberclass"));
    lumberLog.setCutPlanId(rs.getLong("planId"));
    LumberStack stack = new LumberStack();
    stack.setName(rs.getString("stackName"));
    stack.setId(rs.getLong("stack"));
    lumberLog.setStack(stack);
    IDPlate plate = new IDPlate();
    plate.setId(rs.getLong("idplate"));
    plate.setLabel(rs.getString("plateName"));
    lumberLog.setPlate(plate);
    lumberLog.setSupplierId(rs.getLong("SupplierId"));
    lumberLog.setTransportCertifiateId(rs.getLong("TransportCertificateId"));
    if (rs.wasNull()) {
      lumberLog.setTransportCertifiateId(null);
    }
    lumberLog.setMarginPercent(rs.getInt("Margin"));
    lumberLog.setMarginVolume(rs.getDouble("MarginVolume"));
    lumberLog.setMarginRealVolume(rs.getDouble("RealMarginVolume"));

    return lumberLog;
  }
  public static boolean saveLumberLog(
      LumberLog lumberLog, LumberStack stack, LumberLogEntry stockEntry) {

    Logger logger = Logger.getLogger("dao");
    boolean status = false;
    boolean saveNewEntry = false;
    StringBuilder insertStockEntry = null;
    if (stockEntry.getId() == null) {
      saveNewEntry = true;
      insertStockEntry = new StringBuilder("insert into lumberentry(user) values(");
      insertStockEntry.append(stockEntry.getUser().getID()).append(")");
    }

    StringBuilder insertLumberLog =
        new StringBuilder(
            "insert into lumberlog( "
                + "small_diameter, medium_diameter, big_diameter, length, reallength, volume, realvolume, lumbertype, lumberclass,"
                + " idplate, stack, Status, SupplierId, TransportCertificateId, Margin, MarginVolume, RealMarginVolume, TransportEntryId) values (");
    insertLumberLog.append(lumberLog.getSmallRadius()).append(",");
    insertLumberLog.append("0").append(",");
    insertLumberLog.append(lumberLog.getBigRadius()).append(",");
    insertLumberLog.append(lumberLog.getLength()).append(",");
    insertLumberLog.append(lumberLog.getRealLength()).append(",");
    insertLumberLog.append(lumberLog.getVolume()).append(",");
    insertLumberLog.append(lumberLog.getRealVolume()).append(",");
    insertLumberLog.append(lumberLog.getLumberType()).append(",");
    insertLumberLog.append(lumberLog.getLumberClass()).append(",");
    insertLumberLog.append(lumberLog.getPlate().getId()).append(",");
    insertLumberLog.append(stack.getId()).append(",").append(lumberLog.getStatus()).append(",");
    insertLumberLog.append(lumberLog.getSupplierId()).append(",");
    insertLumberLog
        .append(
            lumberLog.getTransportCertifiateId() != null
                ? lumberLog.getTransportCertifiateId()
                : "NULL")
        .append(",");
    insertLumberLog.append(lumberLog.getMarginPercent()).append(",");
    insertLumberLog.append(lumberLog.getMarginVolume()).append(",");
    insertLumberLog.append(lumberLog.getMarginRealVolume()).append(",");
    insertLumberLog.append(lumberLog.getTransportEntryId()).append(")");

    StringBuilder insertMapEntrySql =
        new StringBuilder("insert into lumberentry_to_lumberlog(entryid, lumberlogid) values (");

    StringBuilder insertLumberLogDiameter =
        new StringBuilder(
            "insert into lumberlog_diameter(lumberlog_id, diameter, metric) values(?, ?, 1)");

    Connection con = null;
    Statement stm = null;
    PreparedStatement pstm = null;
    ResultSet rs = null;
    try {
      con = DataAccess.getInstance().getDatabaseConnection();
      con.setAutoCommit(false);
      stm = con.createStatement();
      logger.info(insertLumberLog.toString());
      int rez = stm.executeUpdate(insertLumberLog.toString(), Statement.RETURN_GENERATED_KEYS);
      if (rez > 0) {
        rs = stm.getGeneratedKeys();
        if (rs.next()) {
          lumberLog.setId(rs.getLong(1));
        }
      }
      if (rs != null) {
        rs.close();
      }
      if (saveNewEntry) {
        logger.info(insertStockEntry.toString());
        rez = stm.executeUpdate(insertStockEntry.toString(), Statement.RETURN_GENERATED_KEYS);
        if (rez > 0) {
          rs = stm.getGeneratedKeys();
          if (rs.next()) {
            stockEntry.setId(rs.getLong(1));
          }
        }
      }
      if (lumberLog.getMediumRadius() != null && !lumberLog.getMediumRadius().isEmpty()) {
        pstm = con.prepareStatement(insertLumberLogDiameter.toString());
        for (Double radius : lumberLog.getMediumRadius()) {
          pstm.setLong(1, lumberLog.getId());
          pstm.setDouble(2, radius);
          pstm.executeUpdate();
        }
      }
      if (lumberLog.getId() != null && stockEntry.getId() != null) {
        insertMapEntrySql
            .append(stockEntry.getId())
            .append(",")
            .append(lumberLog.getId())
            .append(")");
        logger.info(insertMapEntrySql.toString());
        rez = stm.executeUpdate(insertMapEntrySql.toString());
        if (rez > 0) {
          status = true;
          IDPlateManager.removeAvailablePlate(lumberLog.getPlate());
        }
      }
    } catch (Exception e) {
      try {
        con.rollback();
      } catch (Exception ex) {
      }
      logger.warning(e.getMessage());
      logger.log(Level.INFO, "Error", e);
      status = false;
    } finally {
      if (con != null) {
        try {
          con.setAutoCommit(true);
        } catch (Exception ex) {
        }
      }
      if (rs != null)
        try {
          rs.close();
        } catch (Exception e) {
        }
      if (stm != null)
        try {
          stm.close();
        } catch (Exception e) {
        }
    }

    return status;
  }