///////////////////////////////////////////////////////////////////////////// // // 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.math.BigDecimal; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.link.Link; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.projectforge.common.NumberHelper; import org.projectforge.fibu.AbstractRechnungsPositionDO; import org.projectforge.fibu.KontoDO; import org.projectforge.fibu.KundeDO; import org.projectforge.fibu.ProjektDO; import org.projectforge.fibu.RechnungDO; import org.projectforge.fibu.RechnungStatus; import org.projectforge.fibu.RechnungTyp; import org.projectforge.fibu.RechnungsPositionDO; import org.projectforge.fibu.kost.AccountingConfig; import org.projectforge.fibu.kost.Kost2DO; import org.projectforge.fibu.kost.KostZuweisungDO; import org.projectforge.registry.Registry; import org.projectforge.web.wicket.AbstractEditPage; import org.projectforge.web.wicket.PresizedImage; import org.projectforge.web.wicket.WebConstants; import org.projectforge.web.wicket.WicketUtils; import org.projectforge.web.wicket.bootstrap.GridSize; import org.projectforge.web.wicket.components.LabelValueChoiceRenderer; import org.projectforge.web.wicket.components.MaxLengthTextField; import org.projectforge.web.wicket.components.MinMaxNumberField; import org.projectforge.web.wicket.components.RequiredMaxLengthTextField; import org.projectforge.web.wicket.flowlayout.FieldsetPanel; import org.projectforge.web.wicket.flowlayout.InputPanel; public class RechnungEditForm extends AbstractRechnungEditForm<RechnungDO, RechnungsPositionDO, RechnungEditPage> { private static final long serialVersionUID = -6018131069720611834L; private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(RechnungEditForm.class); private DropDownChoice<RechnungStatus> statusChoice; protected NewCustomerSelectPanel customerSelectPanel; protected NewProjektSelectPanel projektSelectPanel; public RechnungEditForm(final RechnungEditPage parentPage, final RechnungDO data) { super(parentPage, data); } @SuppressWarnings("serial") @Override protected void onInit() { gridBuilder.newGridPanel(); { // Subject final FieldsetPanel fs = gridBuilder.newFieldset(RechnungDO.class, "betreff"); final MaxLengthTextField subject = new RequiredMaxLengthTextField(InputPanel.WICKET_ID, new PropertyModel<String>(data, "betreff")); subject.add(WicketUtils.setFocus()); fs.add(subject); } // GRID 50% - BLOCK gridBuilder.newSplitPanel(GridSize.COL50, true).newSubSplitPanel(GridSize.COL50); { // Number final FieldsetPanel fs = gridBuilder.newFieldset(RechnungDO.class, "nummer"); final MinMaxNumberField<Integer> number = new MinMaxNumberField<Integer>(InputPanel.WICKET_ID, new PropertyModel<Integer>(data, "nummer"), 0, 99999999); number.setMaxLength(8).add(AttributeModifier.append("style", "width: 6em !important;")); fs.add(number); if (NumberHelper.greaterZero(getData().getNummer()) == false) { fs.addHelpIcon(getString("fibu.tooltip.nummerWirdAutomatischVergeben")); } } gridBuilder.newSubSplitPanel(GridSize.COL50); { // Status final FieldsetPanel fs = gridBuilder.newFieldset(RechnungDO.class, "status"); final LabelValueChoiceRenderer<RechnungStatus> statusChoiceRenderer = new LabelValueChoiceRenderer<RechnungStatus>(this, RechnungStatus.values()); statusChoice = new DropDownChoice<RechnungStatus>(fs.getDropDownChoiceId(), new PropertyModel<RechnungStatus>(data, "status"), statusChoiceRenderer.getValues(), statusChoiceRenderer); statusChoice.setNullValid(false); statusChoice.setRequired(true); fs.add(statusChoice); } { // Type gridBuilder.newSubSplitPanel(GridSize.COL50); final FieldsetPanel fs = gridBuilder.newFieldset(RechnungDO.class, "typ"); final LabelValueChoiceRenderer<RechnungTyp> typeChoiceRenderer = new LabelValueChoiceRenderer<RechnungTyp>(this, RechnungTyp.values()); final DropDownChoice<RechnungTyp> typeChoice = new DropDownChoice<RechnungTyp>(fs.getDropDownChoiceId(), new PropertyModel<RechnungTyp>(data, "typ"), typeChoiceRenderer.getValues(), typeChoiceRenderer); typeChoice.setNullValid(false); typeChoice.setRequired(true); fs.add(typeChoice); } gridBuilder.newSubSplitPanel(GridSize.COL50); if (Registry.instance().getKontoCache().isEmpty() == false) { // Show this field only if DATEV accounts does exist. final FieldsetPanel fs = gridBuilder.newFieldset(RechnungDO.class, "konto"); final KontoSelectPanel kontoSelectPanel = new KontoSelectPanel(fs.newChildId(), new PropertyModel<KontoDO>(data, "konto"), null, "kontoId"); kontoSelectPanel.setKontoNumberRanges(AccountingConfig.getInstance().getDebitorsAccountNumberRanges()); fs.addHelpIcon(getString("fibu.rechnung.konto.tooltip")); fs.add(kontoSelectPanel); kontoSelectPanel.init(); } gridBuilder.newSubSplitPanel(GridSize.COL100); { // Projekt final FieldsetPanel fs = gridBuilder.newFieldset(RechnungDO.class, "projekt").suppressLabelForWarning(); projektSelectPanel = new NewProjektSelectPanel(fs.newChildId(), new PropertyModel<ProjektDO>(data, "projekt"), parentPage, "projektId"); projektSelectPanel.getTextField().add(new AjaxFormComponentUpdatingBehavior("change") { @Override protected void onUpdate(final AjaxRequestTarget target) { if (getData().getKundeId() == null && StringUtils.isBlank(getData().getKundeText()) == true) { getData().setKunde(projektSelectPanel.getModelObject().getKunde()); } target.add(customerSelectPanel.getTextField()); } }); fs.add(projektSelectPanel); projektSelectPanel.init(); } { // Customer final FieldsetPanel fs = gridBuilder.newFieldset(RechnungDO.class, "kunde"); customerSelectPanel = new NewCustomerSelectPanel(fs.newChildId(), new PropertyModel<KundeDO>(data, "kunde"), new PropertyModel<String>(data, "kundeText"), parentPage, "kundeId"); customerSelectPanel.getTextField().setOutputMarkupId(true); fs.add(customerSelectPanel); customerSelectPanel.init(); fs.setLabelFor(customerSelectPanel.getKundeTextField()); fs.addHelpIcon(getString("fibu.rechnung.hint.kannVonProjektKundenAbweichen")); } } @SuppressWarnings("serial") @Override protected void onRenderPosition(final WebMarkupContainer item, final RechnungsPositionDO position) { // item.add(new AuftragsPositionFormComponent("orderPosition", new PropertyModel<AuftragsPositionDO>(position, "auftragsPosition"), // false)); final Link<String> orderLink = new Link<String>("orderLink") { @Override public void onClick() { if (position.getAuftragsPosition() != null) { final PageParameters parameters = new PageParameters(); parameters.add(AbstractEditPage.PARAMETER_KEY_ID, position.getAuftragsPosition().getAuftrag().getId()); final AuftragEditPage auftragEditPage = new AuftragEditPage(parameters); auftragEditPage.setReturnToPage(getParentPage()); setResponsePage(auftragEditPage); } } }; item.add(orderLink); if (position.getAuftragsPosition() == null) { orderLink.setVisible(false); } orderLink.add(new PresizedImage("linkImage", WebConstants.IMAGE_FIND)); } /** * Highlights the cost2 element if it differs from the cost2 of the given project (if any). * @param position * @param cost1 * @param cost2 */ @Override protected void onRenderCostRow(final AbstractRechnungsPositionDO position, final KostZuweisungDO costAssignment, final Component cost1Component, final Component cost2Component) { final RechnungDO invoice = ((RechnungsPositionDO) position).getRechnung(); if (invoice == null) { log.warn("Oups, no invoice given. Shouldn't occur!"); return; } final Kost2DO cost2 = costAssignment.getKost2(); final ProjektDO projekt = invoice.getProjekt(); int numberRange = -1; // First number of cost. int area = -1; // Number 2-4 int number = -1; // Number 5-6. if (projekt != null) { numberRange = projekt.getNummernkreis(); area = projekt.getBereich(); number = projekt.getNummer(); } else { final KundeDO customer = invoice.getKunde(); if (customer == null) { return; } numberRange = customer.getNummernkreis(); number = customer.getBereich(); } boolean differs = false; if (numberRange >= 0 && cost2.getNummernkreis() != numberRange) { differs = true; } else if (area >= 0 && cost2.getBereich() != area) { differs = true; } else if (number >= 0 && cost2.getTeilbereich() != number) { differs = true; } if (differs == true) { WicketUtils.setWarningTooltip(cost2Component); } } @SuppressWarnings("unchecked") @Override protected void validation() { super.validation(); final RechnungStatus status = statusChoice.getConvertedInput(); final TextField<BigDecimal> zahlBetragField = (TextField<BigDecimal>) dependentFormComponents[3]; final BigDecimal zahlBetrag = zahlBetragField.getConvertedInput(); final Integer projektId = getData().getProjektId(); final Integer kundeId = getData().getKundeId(); // final String kundeText = customerSelectPanel.getKundeTextField().getConvertedInput(); final boolean zahlBetragExists = (zahlBetrag != null && zahlBetrag.compareTo(BigDecimal.ZERO) != 0); if (status == RechnungStatus.BEZAHLT && zahlBetragExists == false) { addError("fibu.rechnung.error.statusBezahltErfordertZahlBetrag"); } // if (projektId == null && StringUtils.isBlank(kundeText) == true && kundeId == null) { if (projektId == null && kundeId == null) { addError("fibu.rechnung.error.kundeTextOderProjektRequired"); } } @Override protected Logger getLogger() { return log; } @Override protected RechnungsPositionDO newPositionInstance() { return new RechnungsPositionDO(); } }