/////////////////////////////////////////////////////////////////////////////
//
// 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.web.fibu;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
import org.apache.wicket.extensions.markup.html.repeater.data.sort.SortOrder;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.Link;
import org.apache.wicket.markup.repeater.Item;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.projectforge.common.DateHelper;
import org.projectforge.common.NumberHelper;
import org.projectforge.core.Configuration;
import org.projectforge.core.CurrencyFormatter;
import org.projectforge.excel.ContentProvider;
import org.projectforge.excel.ExportColumn;
import org.projectforge.excel.I18nExportColumn;
import org.projectforge.excel.PropertyMapping;
import org.projectforge.export.DOListExcelExporter;
import org.projectforge.export.MyXlsContentProvider;
import org.projectforge.fibu.EingangsrechnungDO;
import org.projectforge.fibu.EingangsrechnungDao;
import org.projectforge.fibu.EingangsrechnungsStatistik;
import org.projectforge.fibu.KontoCache;
import org.projectforge.fibu.KontoDO;
import org.projectforge.fibu.RechnungFilter;
import org.projectforge.fibu.kost.KostZuweisungExport;
import org.projectforge.web.wicket.AbstractListPage;
import org.projectforge.web.wicket.CellItemListener;
import org.projectforge.web.wicket.CellItemListenerPropertyColumn;
import org.projectforge.web.wicket.CurrencyPropertyColumn;
import org.projectforge.web.wicket.DownloadUtils;
import org.projectforge.web.wicket.IListPageColumnsCreator;
import org.projectforge.web.wicket.ListPage;
import org.projectforge.web.wicket.ListSelectActionPanel;
import org.projectforge.web.wicket.RowCssClass;
import org.projectforge.web.wicket.components.ContentMenuEntryPanel;
@ListPage(editPage = EingangsrechnungEditPage.class)
public class EingangsrechnungListPage extends AbstractListPage<EingangsrechnungListForm, EingangsrechnungDao, EingangsrechnungDO> implements
IListPageColumnsCreator<EingangsrechnungDO>
{
private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(EingangsrechnungListPage.class);
private static final long serialVersionUID = 4417254962066648504L;
@SpringBean(name = "eingangsrechnungDao")
private EingangsrechnungDao eingangsrechnungDao;
@SpringBean(name = "kontoCache")
private KontoCache kontoCache;
private EingangsrechnungsStatistik eingangsrechnungsStatistik;
EingangsrechnungsStatistik getEingangsrechnungsStatistik()
{
if (eingangsrechnungsStatistik == null) {
eingangsrechnungsStatistik = eingangsrechnungDao.buildStatistik(getList());
}
return eingangsrechnungsStatistik;
}
public EingangsrechnungListPage(final PageParameters parameters)
{
super(parameters, "fibu.eingangsrechnung");
}
public EingangsrechnungListPage(final ISelectCallerPage caller, final String selectProperty)
{
super(caller, selectProperty, "fibu.eingangsrechnung");
}
/**
* Forces the statistics to be reloaded.
* @see org.projectforge.web.wicket.AbstractListPage#refresh()
*/
@Override
public void refresh()
{
super.refresh();
this.eingangsrechnungsStatistik = null;
}
@SuppressWarnings("serial")
@Override
public List<IColumn<EingangsrechnungDO, String>> createColumns(final WebPage returnToPage, final boolean sortable)
{
final List<IColumn<EingangsrechnungDO, String>> columns = new ArrayList<IColumn<EingangsrechnungDO, String>>();
final CellItemListener<EingangsrechnungDO> cellItemListener = new CellItemListener<EingangsrechnungDO>() {
public void populateItem(final Item<ICellPopulator<EingangsrechnungDO>> item, final String componentId,
final IModel<EingangsrechnungDO> rowModel)
{
final EingangsrechnungDO eingangsrechnung = rowModel.getObject();
appendCssClasses(item, eingangsrechnung.getId(), eingangsrechnung.isDeleted());
if (eingangsrechnung.isDeleted() == true) {
// Do nothing further
} else if (eingangsrechnung.isUeberfaellig() == true) {
appendCssClasses(item, RowCssClass.IMPORTANT_ROW);
} else if (eingangsrechnung.isBezahlt() == false) {
appendCssClasses(item, RowCssClass.BLUE);
}
}
};
columns.add(new CellItemListenerPropertyColumn<EingangsrechnungDO>(new Model<String>(getString("fibu.common.creditor")), getSortable(
"kreditor", sortable), "kreditor", cellItemListener) {
@SuppressWarnings({ "unchecked", "rawtypes"})
@Override
public void populateItem(final Item item, final String componentId, final IModel rowModel)
{
final EingangsrechnungDO eingangsrechnung = (EingangsrechnungDO) rowModel.getObject();
String kreditor = StringEscapeUtils.escapeHtml(eingangsrechnung.getKreditor());
if (form.getSearchFilter().isShowKostZuweisungStatus() == true) {
final BigDecimal fehlBetrag = eingangsrechnung.getKostZuweisungFehlbetrag();
if (NumberHelper.isNotZero(fehlBetrag) == true) {
kreditor += " *** " + CurrencyFormatter.format(fehlBetrag) + " ***";
}
}
final Label kreditorLabel = new Label(ListSelectActionPanel.LABEL_ID, kreditor);
kreditorLabel.setEscapeModelStrings(false);
item.add(new ListSelectActionPanel(componentId, rowModel, EingangsrechnungEditPage.class, eingangsrechnung.getId(), returnToPage,
kreditorLabel));
cellItemListener.populateItem(item, componentId, rowModel);
addRowClick(item);
}
});
columns.add(new CellItemListenerPropertyColumn<EingangsrechnungDO>(new Model<String>(getString("fibu.konto")), null, "konto",
cellItemListener) {
@SuppressWarnings({ "unchecked", "rawtypes"})
@Override
public void populateItem(final Item item, final String componentId, final IModel rowModel)
{
final EingangsrechnungDO rechnung = (EingangsrechnungDO) rowModel.getObject();
final KontoDO konto = kontoCache.getKonto(rechnung.getKontoId());
item.add(new Label(componentId, konto != null ? konto.formatKonto() : ""));
cellItemListener.populateItem(item, componentId, rowModel);
}
});
columns.add(new CellItemListenerPropertyColumn<EingangsrechnungDO>(getString("fibu.common.reference"),
getSortable("referenz", sortable), "referenz", cellItemListener));
columns.add(new CellItemListenerPropertyColumn<EingangsrechnungDO>(getString("fibu.rechnung.betreff"),
getSortable("betreff", sortable), "betreff", cellItemListener));
columns.add(new CellItemListenerPropertyColumn<EingangsrechnungDO>(getString("fibu.rechnung.datum.short"), getSortable("datum",
sortable), "datum", cellItemListener));
columns.add(new CellItemListenerPropertyColumn<EingangsrechnungDO>(getString("fibu.rechnung.faelligkeit.short"), getSortable(
"faelligkeit", sortable), "faelligkeit", cellItemListener));
columns.add(new CellItemListenerPropertyColumn<EingangsrechnungDO>(getString("fibu.rechnung.bezahlDatum.short"), getSortable(
"bezahlDatum", sortable), "bezahlDatum", cellItemListener));
columns.add(new CurrencyPropertyColumn<EingangsrechnungDO>(getString("fibu.common.netto"), getSortable("netSum", sortable), "netSum",
cellItemListener));
columns.add(new CurrencyPropertyColumn<EingangsrechnungDO>(getString("fibu.common.brutto"), getSortable("grossSum", sortable),
"grossSum", cellItemListener));
columns.add(new CellItemListenerPropertyColumn<EingangsrechnungDO>(new Model<String>(getString("comment")), getSortable("bemerkung",
sortable), "bemerkung", cellItemListener));
return columns;
}
@SuppressWarnings("serial")
@Override
protected void init()
{
dataTable = createDataTable(createColumns(this, true), "datum", SortOrder.DESCENDING);
form.add(dataTable);
addExcelExport(getString("fibu.common.creditor"), getString("fibu.eingangsrechnungen"));
if (Configuration.getInstance().isCostConfigured() == true) {
final ContentMenuEntryPanel exportExcelButton = new ContentMenuEntryPanel(getNewContentMenuChildId(), new Link<Object>("link") {
@Override
public void onClick()
{
exportExcelWithCostAssignments();
};
}, getString("fibu.rechnung.kostExcelExport")).setTooltip(getString("fibu.rechnung.kostExcelExport.tootlip"));
addContentMenuEntry(exportExcelButton);
}
}
/**
* @see org.projectforge.web.wicket.AbstractListPage#createExcelExporter(java.lang.String)
*/
@Override
protected DOListExcelExporter createExcelExporter(final String filenameIdentifier)
{
return new DOListExcelExporter(filenameIdentifier) {
/**
* @see org.projectforge.excel.ExcelExporter#onBeforeSettingColumns(java.util.List)
*/
@Override
protected List<ExportColumn> onBeforeSettingColumns(final ContentProvider sheetProvider, final List<ExportColumn> columns)
{
final List<ExportColumn> sortedColumns = reorderColumns(columns, "kreditor", "konto", "kontoBezeichnung", "betreff", "datum",
"faelligkeit", "bezahlDatum", "zahlBetrag");
I18nExportColumn col = new I18nExportColumn("kontoBezeichnung", "fibu.konto.bezeichnung", MyXlsContentProvider.LENGTH_STD);
sortedColumns.add(2, col);
col = new I18nExportColumn("netSum", "fibu.common.netto");
putCurrencyFormat(sheetProvider, col);
sortedColumns.add(7, col);
col = new I18nExportColumn("grossSum", "fibu.common.brutto");
putCurrencyFormat(sheetProvider, col);
sortedColumns.add(8, col);
return sortedColumns;
}
/**
* @see org.projectforge.excel.ExcelExporter#addMapping(org.projectforge.excel.PropertyMapping, java.lang.Object,
* java.lang.reflect.Field)
*/
@Override
public void addMapping(final PropertyMapping mapping, final Object entry, final Field field)
{
if ("konto".equals(field.getName()) == true) {
Integer kontoNummer = null;
final Integer kontoId = ((EingangsrechnungDO) entry).getKontoId();
if (kontoId != null) {
final KontoDO konto = kontoCache.getKonto(kontoId);
if (konto != null) {
kontoNummer = konto.getNummer();
}
}
mapping.add(field.getName(), kontoNummer != null ? kontoNummer : "");
} else {
super.addMapping(mapping, entry, field);
}
}
/**
* @see org.projectforge.excel.ExcelExporter#addMappings(org.projectforge.excel.PropertyMapping, java.lang.Object)
*/
@Override
protected void addMappings(final PropertyMapping mapping, final Object entry)
{
final EingangsrechnungDO invoice = (EingangsrechnungDO) entry;
String kontoBezeichnung = null;
final Integer kontoId = ((EingangsrechnungDO) entry).getKontoId();
if (kontoId != null) {
final KontoDO konto = kontoCache.getKonto(kontoId);
if (konto != null) {
kontoBezeichnung = konto.getBezeichnung();
}
}
mapping.add("kontoBezeichnung", kontoBezeichnung != null ? kontoBezeichnung : "");
mapping.add("grossSum", invoice.getGrossSum());
mapping.add("netSum", invoice.getNetSum());
}
};
}
protected void exportExcelWithCostAssignments()
{
refresh();
final RechnungFilter filter = new RechnungFilter();
final RechnungFilter src = form.getSearchFilter();
filter.setYear(src.getYear());
filter.setMonth(src.getMonth());
final List<EingangsrechnungDO> rechnungen = eingangsrechnungDao.getList(filter);
if (rechnungen == null || rechnungen.size() == 0) {
// Nothing to export.
form.addError("validation.error.nothingToExport");
return;
}
final String filename = "ProjectForge-"
+ getString("fibu.common.creditor")
+ "-"
+ getString("menu.fibu.kost")
+ "_"
+ DateHelper.getDateAsFilenameSuffix(new Date())
+ ".xls";
final byte[] xls = KostZuweisungExport.instance.exportRechnungen(rechnungen, getString("fibu.common.creditor"), kontoCache);
if (xls == null || xls.length == 0) {
log.error("Oups, xls has zero size. Filename: " + filename);
return;
}
DownloadUtils.setDownloadTarget(xls, filename);
}
@Override
protected EingangsrechnungListForm newListForm(final AbstractListPage< ? , ? , ? > parentPage)
{
return new EingangsrechnungListForm(this);
}
@Override
protected EingangsrechnungDao getBaseDao()
{
return eingangsrechnungDao;
}
}