public void processStorno(
      Date from, Date to, File dir, LoggingHandler lh, CSVController cSVController) {
    try {
      List<Invoice> invoices =
          configurationController
              .getInvoiceJpaController()
              .findInvoiceEntitiesOrdertypeDate(4, 10, from, to, 0);

      JDCsvWriter writer = cSVController.getWriterStorno();

      for (Invoice invoice : invoices) {
        writer.write(format.format(invoice.getInvoiceDate()));
        writer.write(invoice.getInvoiceNumber());
        writer.write(Integer.toString(invoice.getPartnerID() + Globals.DEBITORSTARTVALUE));
        writer.endRecord();
      }
    } catch (IOException ex) {
      Logger.getLogger(BookingController.class.getName()).log(Level.SEVERE, null, ex);
    }
  }
  private PaymentStatistic processKZPaymentRecord(
      ArrayList<PaymentRecord> recordList, LoggingHandler lh) throws IOException {

    if (!recordList.isEmpty()) {
      lh.getLogger(Globals.LOGGINGKZ).log(Level.INFO, "  Kunde: " + recordList.get(0).getKontoNr());
    }
    PaymentStatistic statistic = new PaymentStatistic();

    for (PaymentRecord record : recordList) {

      Invoice invoice = null;
      // if (record.getBelegNr() < Globals.MINKUNDENRECHNUNG ||
      // configurationController.getProperty(Globals.PREFIXINVAR + record.getBelegNr()) != null) {
      // wird nicht mehr als Fehler gemeldet, daher keine MIN-Prüfung mehr
      if (configurationController.getProperty(Globals.PREFIXINVAR + record.getBelegNr()) != null) {
        continue;
      }

      // Rechnung noch nicht verarbeitet
      List<Invoice> invoices =
          configurationController
              .getInvoiceJpaController()
              .findInvoiceByNumber(record.getBelegNr());
      if (invoices.size() > 0) {
        invoice = invoices.iterator().next();
      }

      if (invoice != null) {
        lh.getLogger(Globals.LOGGINGKZ)
            .log(Level.INFO, "    Rechnung " + invoice.getInvoiceNumber());
        for (InvoiceItem invoiceItem : invoice.getInvoiceItemCollection()) {

          // nur Gutscheine die gekauft wurden
          // ab Okt. 2012 nicht nur Gutscheine, sondern auch 95er Items
          if (invoiceItem.getUniqueNumber() != null
              && !invoiceItem.getUniqueNumber().equals(Globals.EMPTYSTRING)
              && invoiceItem.getMrcommerceItemID().intValue() < Globals.GUTSCHEINMAXITEMNR
              && invoiceItem.getAmount().doubleValue() > 0.0) {

            lh.getLogger(Globals.LOGGINGKZ)
                .log(
                    Level.INFO,
                    "   Item: "
                                + invoiceItem.getId()
                                + "      Gutschein: "
                                + invoiceItem.getUniqueNumber()
                            != null
                        ? invoiceItem.getUniqueNumber()
                        : Globals.EMPTYSTRING);
            if (invoiceItem.getBHstatus() != null
                && (invoiceItem.getBHstatus().intValue() == Globals.BHSTATUSNICHTBEZ
                    || // nicht bezahlt
                    invoiceItem.getBHstatus().intValue() == Globals.BHSTATUSMAHNUNG
                    || // Mahnung (nicht bez.)
                    invoiceItem.getBHstatus().intValue() == Globals.BHSTATUSMANFREI
                    || // manuell frei für Buchung
                    invoiceItem.getBHstatus().intValue()
                        == Globals.BHSTATUSMAHNFREI) // Mahnung (frei f. Buch.)
            ) {
              int result = 0;

              //                            if (    invoiceItem.getUniqueNumber() != null &&
              //
              // !invoiceItem.getUniqueNumber().equals(Globals.EMPTYSTRING) &&
              //                                    invoiceItem.getMrcommerceItemID().intValue() <
              // Globals.GUTSCHEINMAXITEMNR &&
              //                                    invoiceItem.getAmount().doubleValue() > 0.0) {
              result =
                  configurationController
                      .getInvoiceItemJpaController()
                      .updateInvoiceItemStatus(
                          invoiceItem.getUniqueNumber(), Globals.BHSTATUSBEZAHLT);

              //                            } else {
              //                                result =
              // configurationController.getInvoiceItemJpaController().updateInvoiceItemStatus(invoiceItem, Globals.BHSTATUSBEZAHLT);
              //                            }

              if (result < 0) {
                lh.getLogger(Globals.LOGGINGKZ)
                    .log(
                        Level.SEVERE,
                        "Fehler bei Item: "
                            + invoiceItem.getId()
                            + " Gutschein: "
                            + invoiceItem.getUniqueNumber()
                            + " in Rechnung "
                            + invoice.getInvoiceNumber()
                            + " : "
                            + result);
                statistic.incErrorCounter(1);
              } else if (result > 0) {
                lh.getLogger(Globals.LOGGINGKZ)
                    .log(
                        Level.INFO,
                        "Item: "
                            + invoiceItem.getId()
                            + " Gutschein: "
                            + invoiceItem.getUniqueNumber()
                            + " freigeschaltet");
                statistic.incVoucherOkCounter(1);

                //                                // When das bezahlte Item ein Raktivierungsgebühr
                // war -> den zugehörigen Gutschein wieder auf frei für Einlösung setzen
                //                                if (invoiceItem.getMrcommerceItemID().intValue()
                // == Globals.GUTSCHEINREAKTIVIERUNG) {
                //                                    InvoiceItem invoiceItemOld =
                // invoiceItem.getInvoiceItemHistory().getInvoiceItemOld();
                //                                    if (invoiceItemOld != null) {
                //                                            NukeMrcommerceHistory histEntryBH =
                // new NukeMrcommerceHistory();
                //                                            histEntryBH.setNukeHistoryDate(new
                // Date());
                //
                // histEntryBH.setNukeHistoryPass(invoiceItemOld.getUniqueNumber());
                //
                // histEntryBH.setNukeHistoryMsg("Gutschein: " + invoiceItemOld.getUniqueNumber() +
                // " nach Reaktivierung wieder freigeschaltet - Anpassung BH");
                //
                // histEntryBH.setNukeHistoryStatustype((short) 2);
                //
                // histEntryBH.setNukeHistoryStatus(invoiceItemOld.getBHstatus());
                //                                            NukeMrcommerceHistoryJpaController
                // HistoryJPAController = new NukeMrcommerceHistoryJpaController();
                //
                // HistoryJPAController.create(histEntryBH);
                //                                            NukeMrcommerceHistory histEntryFF =
                // new NukeMrcommerceHistory();
                //                                            histEntryFF.setNukeHistoryDate(new
                // Date());
                //
                // histEntryFF.setNukeHistoryPass(invoiceItemOld.getUniqueNumber());
                //
                // histEntryFF.setNukeHistoryMsg("Gutschein: " + invoiceItemOld.getUniqueNumber() +
                // " nach Reaktivierung wieder freigeschaltet - Anpassung FF");
                //
                // histEntryFF.setNukeHistoryStatustype((short) 1);
                //
                // histEntryFF.setNukeHistoryStatus(invoiceItemOld.getFFstatus());
                //
                // HistoryJPAController.create(histEntryFF);
                //
                //                                        result =
                // configurationController.getInvoiceItemJpaController().updateInvoiceItemStatus(invoiceItemOld.getUniqueNumber(), Globals.BHSTATUSBEZAHLT);
                //                                        int resultFF = 0;
                //                                        resultFF =
                // configurationController.getInvoiceItemJpaController().updateInvoiceItemFFStatus(invoiceItemOld.getUniqueNumber(), Globals.FFSTATUSFREIEINLOESUNG);
                //                                        if (result < 0 || resultFF < 0) {
                //
                // lh.getLogger(Globals.LOGGINGKZ).log(Level.SEVERE, "Fehler bei Item: " +
                // invoiceItemOld.getId() + " Gutschein: " + invoiceItemOld.getUniqueNumber() + " in
                // Rechnung " + invoiceItemOld.getInvoice().getInvoiceNumber() + " : " + result);
                //                                            statistic.incErrorCounter(1);
                //                                        } else if (result > 0 && resultFF > 0) {
                //
                // lh.getLogger(Globals.LOGGINGKZ).log(Level.INFO, "Item: " + invoiceItemOld.getId()
                // + " Gutschein: " + invoiceItemOld.getUniqueNumber() + " nach Reaktivierung wieder
                // freigeschaltet");
                //                                            statistic.incVoucherOkCounter(1);
                //                                        }
                //                                    }
                //
                //                                }
              }

            } else {
              lh.getLogger(Globals.LOGGINGKZ)
                  .log(
                      Level.WARNING,
                      "Item: "
                          + invoiceItem.getId()
                          + " Gutschein "
                          + invoiceItem.getUniqueNumber()
                          + " in Rechnung "
                          + invoice.getInvoiceNumber()
                          + " nicht freigeschalten: hat BH-Status "
                          + invoiceItem.getBHstatus());
              statistic.incStatusNokCounter(1);
            }
            //                    }
          } else if ((invoiceItem.getMrcommerceItemID().intValue() < Globals.GUTSCHEINMAXITEMNR
                  || Globals.NONGUTSCHEINITEMSKZ.contains(
                      invoiceItem.getMrcommerceItemID().intValue()))
              && invoiceItem.getAmount().doubleValue() > 0.0) {

            // InvoiceItem invoiceItemOld = invoiceItem.getInvoiceItemHistory().getInvoiceItemOld();
            lh.getLogger(Globals.LOGGINGKZ).log(Level.INFO, "   Item: " + invoiceItem.getId());
            if (invoiceItem.getBHstatus() != null
                && (invoiceItem.getBHstatus().intValue() == Globals.BHSTATUSNICHTBEZ
                    || // nicht bezahlt
                    invoiceItem.getBHstatus().intValue() == Globals.BHSTATUSMAHNUNG
                    || // Mahnung (nicht bez.)
                    invoiceItem.getBHstatus().intValue() == Globals.BHSTATUSMANFREI
                    || // manuell frei für Buchung
                    invoiceItem.getBHstatus().intValue()
                        == Globals.BHSTATUSMAHNFREI) // Mahnung (frei f. Buch.)
            ) {
              int result = 0;
              int result2 = 0;

              //                            if (    invoiceItem.getUniqueNumber() != null &&
              //
              // !invoiceItem.getUniqueNumber().equals(Globals.EMPTYSTRING) &&
              //                                    invoiceItem.getMrcommerceItemID().intValue() <
              // Globals.GUTSCHEINMAXITEMNR &&
              //                                    invoiceItem.getAmount().doubleValue() > 0.0) {
              // result =
              // configurationController.getInvoiceItemJpaController().updateInvoiceItemStatus(invoiceItem.getUniqueNumber(), Globals.BHSTATUSBEZAHLT);

              //                            } else {
              if (Globals.NONGUTSCHEINITEMSKZ.contains(
                  invoiceItem.getMrcommerceItemID().intValue())) {
                result =
                    configurationController
                        .getInvoiceItemJpaController()
                        .updateInvoiceItemStatus(invoiceItem, Globals.BHSTATUS95ABGESCHLOSSEN);
                result2 =
                    configurationController
                        .getInvoiceItemJpaController()
                        .updateInvoiceItemFFStatus(invoiceItem, Globals.FFSTATUS95ABGESCHLOSSEN);
                lh.getLogger(Globals.LOGGINGKZ)
                    .log(
                        Level.INFO,
                        "   Item: "
                            + invoiceItem.getId()
                            + " auf abgeschlossen gesetzt (95er Item)");
              } else {
                result =
                    configurationController
                        .getInvoiceItemJpaController()
                        .updateInvoiceItemStatus(invoiceItem, Globals.BHSTATUSBEZAHLT);
                result2 =
                    configurationController
                        .getInvoiceItemJpaController()
                        .updateInvoiceItemFFStatus(invoiceItem, Globals.FFSTATUSFREIEINLOESUNG);
                lh.getLogger(Globals.LOGGINGKZ)
                    .log(
                        Level.INFO,
                        "   Item: "
                            + invoiceItem.getId()
                            + " auf bezahlt/frei für Einlösung gesetzt");
              }
              // result =
              // configurationController.getInvoiceItemJpaController().updateInvoiceItemStatus(invoiceItem, Globals.BHSTATUSBEZAHLT);
              //                            }

              if (result < 0) {
                lh.getLogger(Globals.LOGGINGKZ)
                    .log(
                        Level.SEVERE,
                        "Fehler bei Item: "
                            + invoiceItem.getId()
                            + "  in Rechnung "
                            + invoice.getInvoiceNumber()
                            + " : "
                            + result);
                statistic.incErrorCounter(1);
              } else if (result == 0) {
                lh.getLogger(Globals.LOGGINGKZ)
                    .log(Level.INFO, "Item: " + invoiceItem.getId() + " freigeschaltet");
                statistic.incVoucherOkCounter(1);

                // When das bezahlte Item ein Raktivierungsgebühr war -> den zugehörigen Gutschein
                // wieder auf frei für Einlösung setzen
                if (invoiceItem.getMrcommerceItemID().intValue()
                    == Globals.GUTSCHEINREAKTIVIERUNG) {
                  // InvoiceItem invoiceItemOld =
                  // invoiceItem.getInvoiceItemHistory().getInvoiceItemOld();
                  InvoiceItem invoiceItemOld =
                      invoiceItem.getInvoiceItemHistory().getInvoiceItemOld();
                  lh.getLogger(Globals.LOGGINGKZ)
                      .log(
                          Level.INFO,
                          "   Item: "
                                      + invoiceItem.getId()
                                      + " bezieht sich auf Gutschein: "
                                      + invoiceItemOld.getUniqueNumber()
                                  != null
                              ? invoiceItemOld.getUniqueNumber()
                              : Globals.EMPTYSTRING);

                  if (invoiceItemOld != null) {
                    NukeMrcommerceHistory histEntryBH = new NukeMrcommerceHistory();
                    histEntryBH.setNukeHistoryDate(new Date());
                    histEntryBH.setNukeHistoryPass(invoiceItemOld.getUniqueNumber());
                    histEntryBH.setNukeHistoryMsg(
                        "Gutschein: "
                            + invoiceItemOld.getUniqueNumber()
                            + " nach Reaktivierung wieder freigeschaltet - Anpassung BH");
                    histEntryBH.setNukeHistoryStatustype((short) 2);
                    histEntryBH.setNukeHistoryStatus(invoiceItemOld.getBHstatus());
                    NukeMrcommerceHistoryJpaController HistoryJPAController =
                        new NukeMrcommerceHistoryJpaController();
                    HistoryJPAController.create(histEntryBH);
                    NukeMrcommerceHistory histEntryFF = new NukeMrcommerceHistory();
                    histEntryFF.setNukeHistoryDate(new Date());
                    histEntryFF.setNukeHistoryPass(invoiceItemOld.getUniqueNumber());
                    histEntryFF.setNukeHistoryMsg(
                        "Gutschein: "
                            + invoiceItemOld.getUniqueNumber()
                            + " nach Reaktivierung wieder freigeschaltet - Anpassung FF");
                    histEntryFF.setNukeHistoryStatustype((short) 1);
                    histEntryFF.setNukeHistoryStatus(invoiceItemOld.getFFstatus());
                    HistoryJPAController.create(histEntryFF);

                    result =
                        configurationController
                            .getInvoiceItemJpaController()
                            .updateInvoiceItemStatusReact(
                                invoiceItemOld.getUniqueNumber(), Globals.BHSTATUSBEZAHLT);
                    int resultFF = 0;
                    resultFF =
                        configurationController
                            .getInvoiceItemJpaController()
                            .updateInvoiceItemFFStatusReact(
                                invoiceItemOld.getUniqueNumber(), Globals.FFSTATUSFREIEINLOESUNG);
                    if (result < 0 || resultFF < 0) {
                      lh.getLogger(Globals.LOGGINGKZ)
                          .log(
                              Level.SEVERE,
                              "Fehler bei Item: "
                                  + invoiceItemOld.getId()
                                  + " Gutschein: "
                                  + invoiceItemOld.getUniqueNumber()
                                  + " in Rechnung "
                                  + invoiceItemOld.getInvoice().getInvoiceNumber()
                                  + " : "
                                  + result);
                      statistic.incErrorCounter(1);
                    } else if (result > 0 && resultFF > 0) {
                      lh.getLogger(Globals.LOGGINGKZ)
                          .log(
                              Level.INFO,
                              "Item: "
                                  + invoiceItemOld.getId()
                                  + " Gutschein: "
                                  + invoiceItemOld.getUniqueNumber()
                                  + " nach Reaktivierung wieder freigeschaltet");
                      statistic.incVoucherOkCounter(1);
                    }
                  }
                }
              }
            }
          }
        }
        configurationController.setProperty(
            Globals.PREFIXINVAR + record.getBelegNr(), format.format(new Date()));
        // configurationController.getProperty("PREINVAR26890811");

      } else {
        lh.getLogger(Globals.LOGGINGKZ)
            .log(
                Level.WARNING,
                "Fehler bei Rechnung " + record.getBelegStr() + ": Rechnung nicht gefunden! ");
        statistic.incInvoiceNotFoundCounter(1);
      }
    }
    return statistic;
  }