/////////////////////////////////////////////////////////////////////////////
//
// 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.util.ArrayList;
import java.util.List;
import java.util.Locale;
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.markup.html.form.FormComponent;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.apache.wicket.util.convert.IConverter;
import org.projectforge.common.IntRanges;
import org.projectforge.common.NumberHelper;
import org.projectforge.common.Ranges;
import org.projectforge.core.BaseSearchFilter;
import org.projectforge.fibu.KontoDO;
import org.projectforge.fibu.KontoDao;
import org.projectforge.fibu.KontoStatus;
import org.projectforge.web.wicket.AbstractSelectPanel;
import org.projectforge.web.wicket.autocompletion.PFAutoCompleteTextField;
import org.projectforge.web.wicket.flowlayout.ComponentWrapperPanel;
/**
* This panel is a autocompletion text field for selecting an account (DATEV-Konto).
* @author Kai Reinhard (k.reinhard@micromata.de)
*
*/
public class KontoSelectPanel extends AbstractSelectPanel<KontoDO> implements ComponentWrapperPanel
{
private static final long serialVersionUID = 5452693296383142460L;
private PFAutoCompleteTextField<KontoDO> kontoTextField;
@SpringBean(name = "kontoDao")
private KontoDao kontoDao;
private IntRanges kontoNumberRanges;
/**
* @param id
* @param model
* @param kontoText If no Konto is given then a free text field representing a Konto can be used.
* @param caller
* @param selectProperty
*/
public KontoSelectPanel(final String id, final IModel<KontoDO> model, final ISelectCallerPage caller, final String selectProperty)
{
super(id, model, caller, selectProperty);
kontoTextField = new PFAutoCompleteTextField<KontoDO>("kontoField", getModel()) {
@Override
protected List<KontoDO> getChoices(final String input)
{
final BaseSearchFilter filter = new BaseSearchFilter();
filter.setSearchFields("nummer", "bezeichnung", "description");
filter.setSearchString(input);
final List<KontoDO> list = kontoDao.getList(filter);
if (kontoNumberRanges != null && list != null) {
final List<KontoDO> result = new ArrayList<KontoDO>();
for (final KontoDO konto : list) {
if (konto.getStatus() == KontoStatus.NONACTIVE) {
continue;
}
if (kontoNumberRanges.doesMatch(konto.getNummer()) == true) {
result.add(konto);
}
}
return result;
}
return list;
}
@Override
protected String formatLabel(final KontoDO konto)
{
if (konto == null) {
return "";
}
return konto.formatKonto();
}
@Override
protected String formatValue(final KontoDO konto)
{
if (konto == null) {
return "";
}
return konto.formatKonto();
}
@Override
protected void convertInput()
{
final KontoDO konto = (KontoDO) getConverter(getType()).convertToObject(getInput(), getLocale());
setConvertedInput(konto);
}
@Override
public IConverter getConverter(final Class type)
{
return new IConverter() {
@Override
public Object convertToObject(final String value, final Locale locale)
{
if (StringUtils.isEmpty(value) == true) {
getModel().setObject(null);
return null;
}
final int ind = value.indexOf(" ");
final String kontonummerString = ind >= 0 ? value.substring(0, ind) : value;
final Integer kontonummer = NumberHelper.parseInteger(kontonummerString);
final KontoDO konto;
if (kontonummer != null) {
konto = kontoDao.getKonto(kontonummer);
} else {
konto = null;
}
if (konto == null) {
error(getString("fibu.konto.error.invalidKonto"));
}
getModel().setObject(konto);
return konto;
}
@Override
public String convertToString(final Object value, final Locale locale)
{
if (value == null) {
return "";
}
final KontoDO konto = (KontoDO) value;
return konto.formatKonto();
}
};
}
};
kontoTextField.enableTooltips().withLabelValue(true).withMatchContains(true).withMinChars(2).withAutoSubmit(false).withWidth(400);
kontoTextField.setLabel(new Model<String>() {
@Override
public String getObject()
{
return getString("fibu.konto");
}
});
}
/**
* If set then only accounting numbers are given in auto-completion list, whose number matches the given range(s).
* @param kontoNumberRanges the kontoNumberRanges to set
* @return this for chaining.
* @see Ranges#setRanges(String)
*/
public KontoSelectPanel setKontoNumberRanges(final IntRanges kontoNumberRanges)
{
this.kontoNumberRanges = kontoNumberRanges;
return this;
}
/**
* Must be called before component is added to a field set. This is different to most other Panels in ProjectForge.
* @see org.projectforge.web.wicket.AbstractSelectPanel#init()
*/
@Override
@SuppressWarnings("serial")
public KontoSelectPanel init()
{
super.init();
add(kontoTextField);
return this;
}
@Override
protected void convertInput()
{
setConvertedInput(getModelObject());
}
/**
* @see org.projectforge.web.wicket.flowlayout.ComponentWrapperPanel#getComponentOutputId()
*/
@Override
public String getComponentOutputId()
{
kontoTextField.setOutputMarkupId(true);
return kontoTextField.getMarkupId();
}
/**
* @see org.projectforge.web.wicket.flowlayout.ComponentWrapperPanel#getFormComponent()
*/
@Override
public FormComponent< ? > getFormComponent()
{
return null;
}
}