Package org.projectforge.fibu.kost

Source Code of org.projectforge.fibu.kost.KostZuweisungExport

/////////////////////////////////////////////////////////////////////////////
//
// Project ProjectForge Community Edition
//         www.projectforge.org
//
// Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de)
//
// ProjectForge is dual-licensed.
//
// This community edition is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation; version 3 of the License.
//
// This community edition is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
// Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, see http://www.gnu.org/licenses/.
//
/////////////////////////////////////////////////////////////////////////////

package org.projectforge.fibu.kost;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.hibernate.criterion.Order;
import org.projectforge.common.CurrencyHelper;
import org.projectforge.common.NumberHelper;
import org.projectforge.common.StringHelper;
import org.projectforge.core.QueryFilter;
import org.projectforge.excel.ContentProvider;
import org.projectforge.excel.ExportColumn;
import org.projectforge.excel.ExportSheet;
import org.projectforge.excel.ExportWorkbook;
import org.projectforge.excel.I18nExportColumn;
import org.projectforge.excel.PropertyMapping;
import org.projectforge.export.MyXlsContentProvider;
import org.projectforge.fibu.AbstractRechnungDO;
import org.projectforge.fibu.AbstractRechnungsPositionDO;
import org.projectforge.fibu.EingangsrechnungDO;
import org.projectforge.fibu.EingangsrechnungsPositionDO;
import org.projectforge.fibu.KontoCache;
import org.projectforge.fibu.KontoDO;
import org.projectforge.fibu.KontoDao;
import org.projectforge.fibu.ProjektFormatter;
import org.projectforge.fibu.RechnungDO;
import org.projectforge.fibu.RechnungsPositionDO;
import org.projectforge.registry.Registry;
import org.projectforge.user.PFUserContext;

/**
* For excel export.
*
* @author Kai Reinhard (k.reinhard@micromata.de)
*/
public class KostZuweisungExport
{
  public static final KostZuweisungExport instance = new KostZuweisungExport();

  private class MyContentProvider extends MyXlsContentProvider
  {
    public MyContentProvider(final ExportWorkbook workbook)
    {
      super(workbook);
    }

    @Override
    public ContentProvider newInstance()
    {
      return new MyContentProvider(this.workbook);
    }
  };

  private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(KostZuweisungExport.class);

  private enum InvoicesCol
  {
    BRUTTO("fibu.common.brutto", MyXlsContentProvider.LENGTH_CURRENCY), //
    VAT("fibu.common.vat", MyXlsContentProvider.LENGTH_BOOLEAN), //
    KONTO("fibu.buchungssatz.konto", 14), //
    REFERENZ("fibu.common.reference", MyXlsContentProvider.LENGTH_STD), //
    DATE("date", MyXlsContentProvider.LENGTH_DATE), //
    GEGENKONTO("fibu.buchungssatz.gegenKonto", 14), //
    KOST1("fibu.kost1", MyXlsContentProvider.LENGTH_KOSTENTRAEGER), //
    KOST2("fibu.kost2", MyXlsContentProvider.LENGTH_KOSTENTRAEGER), //
    TEXT("description", MyXlsContentProvider.LENGTH_EXTRA_LONG), //
    KORREKTUR("fibu.common.fehlBetrag", MyXlsContentProvider.LENGTH_CURRENCY);

    final String theTitle;

    final int width;

    InvoicesCol(final String theTitle, final int width)
    {
      this.theTitle = theTitle;
      this.width = (short) width;
    }
  }

  /**
   * Export all cost assignements of the given invoices as excel list.
   * @param list
   * @return
   */
  public byte[] exportRechnungen(final List< ? extends AbstractRechnungDO< ? extends AbstractRechnungsPositionDO>> list,
      final String sheetTitle, final KontoCache kontoCache)
  {
    final List<KostZuweisungDO> zuweisungen = new ArrayList<KostZuweisungDO>();
    for (final AbstractRechnungDO< ? > rechnung : list) {
      if (rechnung.getPositionen() != null) {
        for (final AbstractRechnungsPositionDO position : rechnung.getPositionen()) {
          if (CollectionUtils.isNotEmpty(position.getKostZuweisungen()) == true) {
            for (final KostZuweisungDO zuweisung : position.getKostZuweisungen()) {
              if (NumberHelper.isZeroOrNull(zuweisung.getBrutto()) == true) {
                // Skip entries with zero amounts.
                continue;
              }
              zuweisungen.add(zuweisung);
            }
          } else {
            final KostZuweisungDO zuweisung = new KostZuweisungDO();
            if (position instanceof RechnungsPositionDO) {
              zuweisung.setRechnungsPosition((RechnungsPositionDO) position);
            } else {
              zuweisung.setEingangsrechnungsPosition((EingangsrechnungsPositionDO) position);
            }
            zuweisungen.add(zuweisung);
          }
        }
      }
    }
    return export(zuweisungen, sheetTitle, kontoCache);
  }

  /**
   * Exports the filtered list as table.
   */
  public byte[] export(final List<KostZuweisungDO> list, final String sheetTitle, final KontoCache kontoCache)
  {
    log.info("Exporting kost zuweisung list.");
    final ExportWorkbook xls = new ExportWorkbook();
    final ContentProvider contentProvider = new MyContentProvider(xls);
    // create a default Date format and currency column
    xls.setContentProvider(contentProvider);

    final ExportSheet sheet = xls.addSheet(sheetTitle);
    sheet.createFreezePane(0, 1);

    final ExportColumn[] cols = new ExportColumn[InvoicesCol.values().length];
    int i = 0;
    for (final InvoicesCol col : InvoicesCol.values()) {
      cols[i++] = new I18nExportColumn(col, col.theTitle, col.width);
    }

    // column property names
    sheet.setColumns(cols);

    final ContentProvider sheetProvider = sheet.getContentProvider();
    sheetProvider.putFormat(InvoicesCol.BRUTTO, "#,##0.00;[Red]-#,##0.00");
    sheetProvider.putFormat(InvoicesCol.KORREKTUR, "#,##0.00;[Red]-#,##0.00");
    sheetProvider.putFormat(InvoicesCol.KOST1, "#");
    sheetProvider.putFormat(InvoicesCol.KOST2, "#");
    sheetProvider.putFormat(InvoicesCol.DATE, "dd.MM.yyyy");

    final PropertyMapping mapping = new PropertyMapping();
    for (final KostZuweisungDO zuweisung : list) {
      final AbstractRechnungsPositionDO position;
      final AbstractRechnungDO< ? > rechnung;
      final String referenz;
      final String text;
      if (zuweisung.getRechnungsPosition() != null) {
        position = zuweisung.getRechnungsPosition();
        rechnung = ((RechnungsPositionDO) position).getRechnung();
        final RechnungDO r = (RechnungDO) rechnung;
        referenz = String.valueOf(r.getNummer());
        text = ProjektFormatter.formatProjektKundeAsString(r.getProjekt(), r.getKunde(), r.getKundeText());
      } else {
        position = zuweisung.getEingangsrechnungsPosition();
        rechnung = ((EingangsrechnungsPositionDO) position).getEingangsrechnung();
        final EingangsrechnungDO r = (EingangsrechnungDO) rechnung;
        referenz = r.getReferenz();
        text = r.getKreditor();
      }
      final BigDecimal grossSum = position.getBruttoSum();

      BigDecimal korrektur = null;
      if (grossSum.compareTo(position.getKostZuweisungGrossSum()) != 0) {
        korrektur = CurrencyHelper.getGrossAmount(position.getKostZuweisungNetFehlbetrag(), position.getVat());
        if (NumberHelper.isZeroOrNull(korrektur) == true) {
          korrektur = null;
        }
      }
      mapping.add(InvoicesCol.BRUTTO, zuweisung.getBrutto());
      mapping.add(InvoicesCol.VAT, NumberHelper.isNotZero(position.getVat()));
      Integer kontoNummer = null;
      if (rechnung instanceof RechnungDO) {
        final KontoDO konto = kontoCache.getKonto(((RechnungDO) rechnung));
        if (konto != null) {
          kontoNummer = konto.getNummer();
        }
      } else if (rechnung instanceof EingangsrechnungDO) {
        final Integer kontoId = ((EingangsrechnungDO) rechnung).getKontoId();
        if (kontoId != null) {
          final KontoDO konto = kontoCache.getKonto(kontoId);
          if (konto != null) {
            kontoNummer = konto.getNummer();
          }
        }
      }
      mapping.add(InvoicesCol.KONTO, kontoNummer != null ? kontoNummer : "");
      mapping.add(InvoicesCol.REFERENZ, StringHelper.removeNonDigitsAndNonASCIILetters(referenz));
      mapping.add(InvoicesCol.DATE, rechnung.getDatum());
      mapping.add(InvoicesCol.GEGENKONTO, "");
      mapping.add(InvoicesCol.KOST1, zuweisung.getKost1() != null ? zuweisung.getKost1().getNummer() : "");
      mapping.add(InvoicesCol.KOST2, zuweisung.getKost2() != null ? zuweisung.getKost2().getNummer() : "");
      mapping.add(InvoicesCol.TEXT, text);
      mapping.add(InvoicesCol.KORREKTUR, korrektur);
      sheet.addRow(mapping.getMapping(), 0);
    }
    addAccounts(xls, contentProvider);
    return xls.getAsByteArray();
  }

  private enum AccountsCol
  {
    NUMBER("fibu.konto.nummer", 16), //
    NAME("fibu.konto.bezeichnung", MyXlsContentProvider.LENGTH_STD), //
    STATUS("status", 14), //
    DATE_OF_LAST_MODIFICATION("lastUpdate", MyXlsContentProvider.LENGTH_TIMESTAMP), //
    DATE_OF_CREATION("created", MyXlsContentProvider.LENGTH_TIMESTAMP), //
    DESCRIPTION("comment", MyXlsContentProvider.LENGTH_EXTRA_LONG);

    final String theTitle;

    final int width;

    AccountsCol(final String theTitle, final int width)
    {
      this.theTitle = theTitle;
      this.width = (short) width;
    }
  }

  private void addAccounts(final ExportWorkbook xls, final ContentProvider contentProvider)
  {
    final ExportSheet sheet = xls.addSheet(PFUserContext.getLocalizedString("fibu.konto.konten"));
    sheet.createFreezePane(0, 1);

    final ExportColumn[] cols = new ExportColumn[AccountsCol.values().length];
    int i = 0;
    for (final AccountsCol col : AccountsCol.values()) {
      cols[i++] = new I18nExportColumn(col, col.theTitle, col.width);
    }

    // column property names
    sheet.setColumns(cols);

    final ContentProvider sheetProvider = sheet.getContentProvider();
    sheetProvider.putFormat(AccountsCol.DATE_OF_LAST_MODIFICATION, "dd.MM.yyyy HH:mm");
    sheetProvider.putFormat(AccountsCol.DATE_OF_CREATION, "dd.MM.yyyy HH:mm");
    sheetProvider.putFormat(AccountsCol.NUMBER, "#");

    final KontoDao kontoDao = Registry.instance().getDao(KontoDao.class);
    final QueryFilter filter = new QueryFilter();
    filter.addOrder(Order.desc("lastUpdate"));
    final List<KontoDO> list = kontoDao.getList(filter);

    final PropertyMapping mapping = new PropertyMapping();
    for (final KontoDO konto : list) {
      mapping.add(AccountsCol.NUMBER, konto.getNummer());
      mapping.add(AccountsCol.NAME, konto.getBezeichnung());
      mapping.add(AccountsCol.DATE_OF_LAST_MODIFICATION, konto.getLastUpdate());
      mapping.add(AccountsCol.DATE_OF_CREATION, konto.getCreated());
      String status = "";
      if (konto.isDeleted() == true) {
        status = PFUserContext.getLocalizedString("deleted");
      } else if (konto.getStatus() != null) {
        status = PFUserContext.getLocalizedString(konto.getStatus().getI18nKey());
      }
      mapping.add(AccountsCol.STATUS, status);
      mapping.add(AccountsCol.DESCRIPTION, konto.getDescription());
      sheet.addRow(mapping.getMapping(), 0);
    }
  }
}
TOP

Related Classes of org.projectforge.fibu.kost.KostZuweisungExport

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.