private void btnToUnbekanntActionPerformed(ActionEvent e) {
    Lager unbekannt = LagerTools.getUnbekannt();
    StockTableModel2 model = (StockTableModel2) tblVorrat.getModel();
    Tools.log(txtLog, "Folgende Vorräte wurden auf Unbekannt umgebucht:");
    Tools.log(txtLog, "================================================");

    EntityManager em = Main.getEMF().createEntityManager();
    try {
      em.getTransaction().begin();

      for (int row = 0; row < model.getRowCount(); row++) {
        // Model Row Index Umwandlung ist hier unnötig. Markierungen bleiben unberücksichtigt.
        if (model.getStatus(row) == StockTableModel2.STATUS_FRAGLICH) {
          Stock stock = em.merge(model.getVorrat(row));
          em.lock(stock, LockModeType.OPTIMISTIC);
          Tools.log(txtLog, stock.getId(), stock.getProdukt().getBezeichnung(), "");
          stock.setLager(unbekannt);
        }
      }
      em.getTransaction().commit();
    } catch (OptimisticLockException ole) {
      em.getTransaction().rollback();
      Main.warn(ole);
    } catch (Exception ex) {
      em.getTransaction().rollback();
      Main.fatal(ex);
    } finally {
      em.close();
      loadVorratTable();
    }
    Tools.log(txtLog, "================================================");
  }
  public static ArrayList<Menuweekall> getAll() {
    ArrayList<Menuweekall> list = new ArrayList<Menuweekall>();

    EntityManager em = Main.getEMF().createEntityManager();
    Query queryMin = em.createQuery("SELECT t FROM Menuweekall t ORDER BY t.week DESC ");

    list.addAll(queryMin.getResultList());

    em.close();

    return list;
  }
 private void loadLieferant() {
   EntityManager em = Main.getEMF().createEntityManager();
   Query query = em.createQuery("SELECT l FROM Lieferanten l ORDER BY l.firma");
   try {
     java.util.List lieferant = query.getResultList();
     lieferant.add(0, "<html><i>Lieferant nicht &auml;ndern</i></html>");
     cmbLieferant.setModel(tools.Tools.newComboboxModel(new ArrayList<Lieferanten>(lieferant)));
   } catch (Exception e) { // nicht gefunden
     //
   } finally {
     em.close();
   }
 }
  public static Menuweekall get(LocalDate week) {
    ArrayList<Menuweekall> list = new ArrayList<Menuweekall>();

    EntityManager em = Main.getEMF().createEntityManager();
    Query queryMin = em.createQuery("SELECT t FROM Menuweekall t WHERE t.week = :week ");

    queryMin.setParameter("week", week.toDate());

    list.addAll(queryMin.getResultList());

    em.close();

    return list.isEmpty() ? null : list.get(0);
  }
 @Override
 public void removeRow(int row) {
   Stock stock = (Stock) ((Object[]) data.get(row))[0];
   EntityManager em = Main.getEMF().createEntityManager();
   try {
     em.getTransaction().begin();
     em.remove(stock);
     data.remove(row);
     em.getTransaction().commit();
     fireTableRowsDeleted(row, row);
   } catch (Exception e) {
     Main.logger.fatal(e.getMessage(), e);
     em.getTransaction().rollback();
   } finally {
     em.close();
   }
 }
  private void loadVorratTable() {

    EntityManager em = Main.getEMF().createEntityManager();
    try {
      Query query =
          em.createQuery(
              "SELECT v, SUM(b.menge), 0 FROM Buchungen b JOIN b.stock v "
                  +
                  // die 0 ist ein kleiner Kniff und wird für das Umbuchen gebraucht.
                  " WHERE v.lager = :lager AND v.ausgang = "
                  + Const.MYSQL_DATETIME_BIS_AUF_WEITERES
                  + " GROUP BY v");

      query.setParameter("lager", (Lager) cmbLager.getSelectedItem());

      java.util.List list = query.getResultList();

      tblVorrat.setModel(new StockTableModel2(list, spaltenVorrat));
      Tools.packTable(tblVorrat, 0);

      tblVorrat
          .getColumnModel()
          .getColumn(StockTableModel2.COL_VORRAT_ID)
          .setCellRenderer(new UmbuchenRenderer());
      tblVorrat
          .getColumnModel()
          .getColumn(StockTableModel2.COL_BEZEICHNUNG)
          .setCellRenderer(new UmbuchenRenderer());
      tblVorrat
          .getColumnModel()
          .getColumn(StockTableModel2.COL_MENGE)
          .setCellRenderer(new UmbuchenRenderer());
      tblVorrat
          .getColumnModel()
          .getColumn(StockTableModel2.COL_ICON)
          .setCellRenderer(new UmbuchenRenderer());

    } catch (Exception e) { // nicht gefunden
      Main.logger.fatal(e.getMessage(), e);
      // e.printStackTrace();
    } finally {
      em.close();
    }
  }
  private void btnAusbuchenActionPerformed(ActionEvent e) {
    EntityManager em = Main.getEMF().createEntityManager();
    try {
      em.getTransaction().begin();
      int[] rows = tblVorrat.getSelectedRows();

      for (int r = 0; r < rows.length; r++) {
        // Diese Zeile ist sehr wichtig, da sie die Auswahl in der Tabelle bzgl. einer Umsortierung
        // berücksichtigt.
        int row = tblVorrat.convertRowIndexToModel(rows[r]);
        Stock stock = ((StockTableModel2) tblVorrat.getModel()).getVorrat(row);

        Main.logger.info("AUSBUCHEN STOCK: " + stock.toString());
        Tools.log(txtLog, stock.getId(), stock.getProdukt().getBezeichnung(), "AUSGEBUCHT");
        StockTools.ausbuchen(stock, "Abschlussbuchung");
      }
      em.getTransaction().commit();
    } catch (Exception e1) {
      em.getTransaction().rollback();
    } finally {
      em.close();
      loadVorratTable();
    }
  }
  private void umbuchen() {

    EntityManager em = Main.getEMF().createEntityManager();
    try {

      em.getTransaction().begin();

      Stock myStock = em.merge(stock);

      if (myStock.isAusgebucht()) {
        myStock.setAusgang(Const.DATE_BIS_AUF_WEITERES);
        myStock.setAnbruch(Const.DATE_BIS_AUF_WEITERES);

        Query query =
            em.createQuery(
                "DELETE FROM Buchungen b WHERE b.stock = :vorrat AND b.status <> :butnotstatus");
        query.setParameter("vorrat", myStock);
        query.setParameter("butnotstatus", BuchungenTools.BUCHEN_EINBUCHEN_ANFANGSBESTAND);

        query.executeUpdate();

        //                Collection<Buchungen> buchungen = myVorrat.getBuchungenCollection();
        //                for (Buchungen b : buchungen) {
        //                    Buchungen buchung = em.merge(b);
        //                    if (buchung.getStatus() !=
        // BuchungenTools.BUCHEN_EINBUCHEN_ANFANGSBESTAND) {
        //                        em.remove(buchung);
        //                    }
        //                }
        //                for (Buchungen b : buchungen) {
        //                    if (b.getStatus() != BuchungenTools.BUCHEN_EINBUCHEN_ANFANGSBESTAND) {
        //                        myVorrat.getBuchungenCollection().remove(b);
        //                    }
        //                }
      }

      myStock.setLager(em.merge(ziel));
      if (lieferant != null) {
        myStock.setLieferant(em.merge(lieferant));
      }
      //            EntityTools.merge(vorrat);
      em.getTransaction().commit();

      stock = myStock;

      Tools.log(txtLog, myStock.getId(), myStock.getProdukt().getBezeichnung(), "umgebucht");
      if (tblVorrat.getModel() instanceof StockTableModel2) {
        int row =
            ((StockTableModel2) tblVorrat.getModel())
                .addVorrat(stock); // diese Methode fügt den Vorrat nur dann hinzu, wenn nötig.
        Tools.scrollCellToVisible(tblVorrat, row, 1);
        tblVorrat.getSelectionModel().setSelectionInterval(row, row);
      }
      sp.bell();

    } catch (Exception ee) {
      em.getTransaction().rollback();
      ee.printStackTrace();
    } finally {
      em.close();
    }
  }