///////////////////////////////////////////////////////////////////////////// // // 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 java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.List; import java.util.Set; import org.apache.commons.collections.CollectionUtils; 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.form.Button; import org.apache.wicket.markup.html.form.CheckBox; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.FormComponent; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.form.validation.IFormValidator; import org.apache.wicket.markup.repeater.RepeatingView; import org.apache.wicket.model.CompoundPropertyModel; import org.apache.wicket.model.Model; import org.apache.wicket.model.PropertyModel; import org.apache.wicket.spring.injection.annot.SpringBean; import org.apache.wicket.util.convert.IConverter; import org.projectforge.common.NumberHelper; import org.projectforge.common.StringHelper; import org.projectforge.core.CurrencyFormatter; import org.projectforge.fibu.AuftragDO; import org.projectforge.fibu.AuftragsPositionDO; import org.projectforge.fibu.AuftragsPositionsArt; import org.projectforge.fibu.AuftragsPositionsStatus; import org.projectforge.fibu.AuftragsStatus; import org.projectforge.fibu.KundeDO; import org.projectforge.fibu.ModeOfPaymentType; import org.projectforge.fibu.PaymentScheduleDO; import org.projectforge.fibu.PeriodOfPerformanceType; import org.projectforge.fibu.ProjektDO; import org.projectforge.fibu.RechnungCache; import org.projectforge.fibu.RechnungDao; import org.projectforge.fibu.RechnungsPositionVO; import org.projectforge.task.TaskDO; import org.projectforge.user.PFUserDO; import org.projectforge.user.UserGroupCache; import org.projectforge.user.UserRightValue; import org.projectforge.user.UserRights; import org.projectforge.web.task.TaskSelectPanel; import org.projectforge.web.user.UserSelectPanel; import org.projectforge.web.wicket.AbstractEditForm; import org.projectforge.web.wicket.AbstractUnsecureBasePage; import org.projectforge.web.wicket.WicketUtils; import org.projectforge.web.wicket.bootstrap.GridBuilder; import org.projectforge.web.wicket.bootstrap.GridSize; import org.projectforge.web.wicket.components.DatePanel; import org.projectforge.web.wicket.components.DatePanelSettings; import org.projectforge.web.wicket.components.LabelValueChoiceRenderer; import org.projectforge.web.wicket.components.MaxLengthTextArea; 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.components.SingleButtonPanel; import org.projectforge.web.wicket.converter.CurrencyConverter; import org.projectforge.web.wicket.flowlayout.CheckBoxButton; import org.projectforge.web.wicket.flowlayout.DivPanel; import org.projectforge.web.wicket.flowlayout.DivTextPanel; import org.projectforge.web.wicket.flowlayout.FieldsetPanel; import org.projectforge.web.wicket.flowlayout.InputPanel; import org.projectforge.web.wicket.flowlayout.TextAreaPanel; import org.projectforge.web.wicket.flowlayout.TextStyle; import org.projectforge.web.wicket.flowlayout.ToggleContainerPanel; import org.projectforge.web.wicket.flowlayout.ToggleContainerPanel.ToggleStatus; public class AuftragEditForm extends AbstractEditForm<AuftragDO, AuftragEditPage> { private static final long serialVersionUID = 3150725003240437752L; private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(AuftragEditForm.class); private static final BigDecimal MAX_PERSON_DAYS = new BigDecimal(10000); private boolean sendEMailNotification = true; @SpringBean(name = "userGroupCache") private UserGroupCache userGroupCache; protected CheckBox sendEMailNotficationCheckBox; protected RepeatingView positionsRepeater, paymentSchedulesRepeater; protected NewCustomerSelectPanel kundeSelectPanel; private final List<Component> ajaxUpdateComponents = new ArrayList<Component>(); private final List<Component> ajaxPosTargets = new ArrayList<Component>(); @SpringBean(name = "rechnungCache") private RechnungCache rechnungCache; private FormComponent< ? >[] positionsDependentFormComponents = new FormComponent[0]; private DatePanel fromDatePanel, endDatePanel; private PaymentSchedulePanel paymentSchedulePanel; protected NewProjektSelectPanel projektSelectPanel; public AuftragEditForm(final AuftragEditPage parentPage, final AuftragDO data) { super(parentPage, data); } public boolean isSendEMailNotification() { return sendEMailNotification; } public void setSendEMailNotification(final boolean sendEMailNotification) { this.sendEMailNotification = sendEMailNotification; } @Override @SuppressWarnings("serial") protected void init() { super.init(); /* GRID8 - BLOCK */ gridBuilder.newSplitPanel(GridSize.COL50); { // Number final FieldsetPanel fs = gridBuilder.newFieldset(getString("fibu.auftrag.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.newSplitPanel(GridSize.COL50); { // Net sum final FieldsetPanel fs = gridBuilder.newFieldset(getString("fibu.auftrag.nettoSumme")).suppressLabelForWarning(); final DivTextPanel netPanel = new DivTextPanel(fs.newChildId(), new Model<String>() { @Override public String getObject() { return CurrencyFormatter.format(data.getNettoSumme()); } }, TextStyle.FORM_TEXT); fs.add(netPanel); ajaxUpdateComponents.add(netPanel.getLabel4Ajax()); fs.add(new DivTextPanel(fs.newChildId(), ", " + getString("fibu.auftrag.commissioned") + ": ")); final DivTextPanel orderedPanel = new DivTextPanel(fs.newChildId(), new Model<String>() { @Override public String getObject() { return CurrencyFormatter.format(data.getBeauftragtNettoSumme()); } }, TextStyle.FORM_TEXT); fs.add(orderedPanel); ajaxUpdateComponents.add(orderedPanel.getLabel4Ajax()); } gridBuilder.newGridPanel(); { // Title final FieldsetPanel fs = gridBuilder.newFieldset(getString("fibu.auftrag.titel")); final MaxLengthTextField subject = new RequiredMaxLengthTextField(InputPanel.WICKET_ID, new PropertyModel<String>(data, "titel")); subject.add(WicketUtils.setFocus()); fs.add(subject); } gridBuilder.newSplitPanel(GridSize.COL50); { // reference final FieldsetPanel fs = gridBuilder.newFieldset(getString("fibu.common.reference")); fs.add(new MaxLengthTextField(InputPanel.WICKET_ID, new PropertyModel<String>(data, "referenz"))); } gridBuilder.newSplitPanel(GridSize.COL50); { // DropDownChoice status final FieldsetPanel fs = gridBuilder.newFieldset(getString("status")); final LabelValueChoiceRenderer<AuftragsStatus> statusChoiceRenderer = new LabelValueChoiceRenderer<AuftragsStatus>(this, AuftragsStatus.values()); final DropDownChoice<AuftragsStatus> statusChoice = new DropDownChoice<AuftragsStatus>(fs.getDropDownChoiceId(), new PropertyModel<AuftragsStatus>(data, "auftragsStatus"), statusChoiceRenderer.getValues(), statusChoiceRenderer); statusChoice.setNullValid(false).setRequired(true); fs.add(statusChoice); } gridBuilder.newSplitPanel(GridSize.COL50); { // project final FieldsetPanel fs = gridBuilder.newFieldset(getString("fibu.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(kundeSelectPanel.getTextField()); } }); // ajaxUpdateComponents.add(projektSelectPanel.getTextField()); fs.add(projektSelectPanel); projektSelectPanel.init(); } gridBuilder.newSplitPanel(GridSize.COL50); { // customer final FieldsetPanel fs = gridBuilder.newFieldset(getString("fibu.kunde")).suppressLabelForWarning(); kundeSelectPanel = new NewCustomerSelectPanel(fs.newChildId(), new PropertyModel<KundeDO>(data, "kunde"), new PropertyModel<String>( data, "kundeText"), parentPage, "kundeId"); kundeSelectPanel.getTextField().setOutputMarkupId(true); fs.add(kundeSelectPanel); kundeSelectPanel.init(); fs.addHelpIcon(getString("fibu.auftrag.hint.kannVonProjektKundenAbweichen")); } gridBuilder.newSplitPanel(GridSize.COL50); { // date final FieldsetPanel fs = gridBuilder.newFieldset(getString("fibu.auftrag.datum")); final DatePanel angebotsDatumPanel = new DatePanel(fs.newChildId(), new PropertyModel<Date>(data, "angebotsDatum"), DatePanelSettings .get().withTargetType(java.sql.Date.class)); angebotsDatumPanel.setRequired(true); fs.add(angebotsDatumPanel); } gridBuilder.newSplitPanel(GridSize.COL50); { // Bindungsfrist final FieldsetPanel fs = gridBuilder.newFieldset(getString("fibu.auftrag.bindungsFrist")); final DatePanel bindungsFristPanel = new DatePanel(fs.newChildId(), new PropertyModel<Date>(data, "bindungsFrist"), DatePanelSettings .get().withTargetType(java.sql.Date.class)); fs.add(bindungsFristPanel); } gridBuilder.newSplitPanel(GridSize.COL50); { // contact person final FieldsetPanel fs = gridBuilder.newFieldset(getString("contactPerson")); final UserSelectPanel contactPersonSelectPanel = new UserSelectPanel(fs.newChildId(), new PropertyModel<PFUserDO>(data, "contactPerson"), parentPage, "contactPersonId"); contactPersonSelectPanel.setRequired(true); fs.add(contactPersonSelectPanel); contactPersonSelectPanel.init(); } gridBuilder.newSplitPanel(GridSize.COL50); { // Beauftragungsdatum final FieldsetPanel fs = gridBuilder.newFieldset(getString("fibu.auftrag.beauftragungsdatum")); final DatePanel beauftragungsDatumPanel = new DatePanel(fs.newChildId(), new PropertyModel<Date>(data, "beauftragungsDatum"), DatePanelSettings.get().withTargetType(java.sql.Date.class)); fs.add(beauftragungsDatumPanel); } gridBuilder.newSplitPanel(GridSize.COL50); { // Period of performance final FieldsetPanel fs = gridBuilder.newFieldset(getString("fibu.periodOfPerformance")); fromDatePanel = new DatePanel(fs.newChildId(), new PropertyModel<Date>(data, "periodOfPerformanceBegin"), DatePanelSettings.get() .withTargetType(java.sql.Date.class)); fs.add(fromDatePanel); fs.add(new DivTextPanel(fs.newChildId(), "-")); endDatePanel = new DatePanel(fs.newChildId(), new PropertyModel<Date>(data, "periodOfPerformanceEnd"), DatePanelSettings.get() .withTargetType(java.sql.Date.class)); fs.add(endDatePanel); } gridBuilder.newSplitPanel(GridSize.COL50); { // Payment schedule final ToggleContainerPanel schedulesPanel = new ToggleContainerPanel(gridBuilder.getPanel().newChildId()) { /** * @see org.projectforge.web.wicket.flowlayout.ToggleContainerPanel#wantsOnStatusChangedNotification() */ @Override protected boolean wantsOnStatusChangedNotification() { return true; } /** * @see org.projectforge.web.wicket.flowlayout.ToggleContainerPanel#onToggleStatusChanged(org.apache.wicket.ajax.AjaxRequestTarget, * boolean) */ @Override protected void onToggleStatusChanged(final AjaxRequestTarget target, final ToggleStatus toggleStatus) { setHeading(getPaymentScheduleHeading(data.getPaymentSchedules(), this)); } }; schedulesPanel.setClosed(); schedulesPanel.setHeading(getPaymentScheduleHeading(data.getPaymentSchedules(), schedulesPanel)); gridBuilder.getPanel().add(schedulesPanel); final GridBuilder innerGridBuilder = schedulesPanel.createGridBuilder(); final DivPanel dp = innerGridBuilder.getPanel(); dp.add(paymentSchedulePanel = new PaymentSchedulePanel(dp.newChildId(), new CompoundPropertyModel<AuftragDO>(data), getUser())); paymentSchedulePanel.setVisible(data.getPaymentSchedules() != null && data.getPaymentSchedules().isEmpty() == false); final Button addPositionButton = new Button(SingleButtonPanel.WICKET_ID) { @Override public final void onSubmit() { data.addPaymentSchedule(new PaymentScheduleDO()); paymentSchedulePanel.rebuildEntries(); paymentSchedulePanel.setVisible(true); } }; final SingleButtonPanel addPositionButtonPanel = new SingleButtonPanel(dp.newChildId(), addPositionButton, getString("add")); addPositionButtonPanel.setTooltip(getString("fibu.auftrag.tooltip.addPosition")); dp.add(addPositionButtonPanel); } gridBuilder.newSplitPanel(GridSize.COL50); { // comment final FieldsetPanel fs = gridBuilder.newFieldset(getString("comment")); fs.add(new MaxLengthTextArea(TextAreaPanel.WICKET_ID, new PropertyModel<String>(data, "bemerkung")), true); } gridBuilder.newSplitPanel(GridSize.COL50); { // status comment final FieldsetPanel fs = gridBuilder.newFieldset(getString("fibu.auftrag.statusBeschreibung")); fs.add(new MaxLengthTextArea(TextAreaPanel.WICKET_ID, new PropertyModel<String>(data, "statusBeschreibung")), true); } // positions gridBuilder.newGridPanel(); positionsRepeater = gridBuilder.newRepeatingView(); refresh(); if (getBaseDao().hasInsertAccess(getUser()) == true) { final DivPanel panel = gridBuilder.newGridPanel().getPanel(); final Button addPositionButton = new Button(SingleButtonPanel.WICKET_ID) { @Override public final void onSubmit() { getData().addPosition(new AuftragsPositionDO()); refresh(); } }; final SingleButtonPanel addPositionButtonPanel = new SingleButtonPanel(panel.newChildId(), addPositionButton, getString("add")); addPositionButtonPanel.setTooltip(getString("fibu.auftrag.tooltip.addPosition")); panel.add(addPositionButtonPanel); } { // email gridBuilder.newFieldset(getString("email")).addCheckBox(new PropertyModel<Boolean>(this, "sendEMailNotification"), null) .setTooltip(getString("label.sendEMailNotification")); } add(new IFormValidator() { @Override public FormComponent< ? >[] getDependentFormComponents() { return positionsDependentFormComponents; } @Override public void validate(final Form< ? > form) { final Date performanceFromDate = fromDatePanel.getDateField().getConvertedInput(); final Date performanceEndDate = endDatePanel.getDateField().getConvertedInput(); if (performanceFromDate == null || performanceEndDate == null) { return; } else if (performanceEndDate.before(performanceFromDate) == true) { endDatePanel.error(getString("error.endDateBeforeBeginDate")); } for (int i = 0; i < positionsDependentFormComponents.length - 1; i += 2) { final Date posPerformanceFromDate = ((DatePanel) positionsDependentFormComponents[i]).getDateField().getConvertedInput(); final Date posPerformanceEndDate = ((DatePanel) positionsDependentFormComponents[i + 1]).getDateField().getConvertedInput(); if (posPerformanceFromDate == null || posPerformanceEndDate == null) { continue; } if (posPerformanceEndDate.before(posPerformanceFromDate) == true) { positionsDependentFormComponents[i + 1].error(getString("error.endDateBeforeBeginDate")); } if (posPerformanceFromDate.before(performanceFromDate) == true) { positionsDependentFormComponents[i + 1].error(getString("error.posFromDateBeforeFromDate")); } } } }); } @SuppressWarnings("serial") void refresh() { positionsRepeater.removeAll(); this.ajaxPosTargets.clear(); final Collection<FormComponent< ? >> dependentComponents = new ArrayList<FormComponent< ? >>(); if (CollectionUtils.isEmpty(data.getPositionen()) == true) { // Ensure that at least one position is available: data.addPosition(new AuftragsPositionDO()); } for (final AuftragsPositionDO position : data.getPositionen()) { final boolean abgeschlossenUndNichtFakturiert = position.isAbgeschlossenUndNichtVollstaendigFakturiert(); final ToggleContainerPanel positionsPanel = new ToggleContainerPanel(positionsRepeater.newChildId()) { /** * @see org.projectforge.web.wicket.flowlayout.ToggleContainerPanel#wantsOnStatusChangedNotification() */ @Override protected boolean wantsOnStatusChangedNotification() { return true; } /** * @see org.projectforge.web.wicket.flowlayout.ToggleContainerPanel#onToggleStatusChanged(org.apache.wicket.ajax.AjaxRequestTarget, * boolean) */ @Override protected void onToggleStatusChanged(final AjaxRequestTarget target, final ToggleStatus toggleStatus) { if (toggleStatus == ToggleStatus.OPENED) { data.getUiStatus().openPosition(position.getNumber()); } else { data.getUiStatus().closePosition(position.getNumber()); } setHeading(getPositionHeading(position, this)); } }; if (abgeschlossenUndNichtFakturiert == true) { positionsPanel.setHighlightedHeader(); } positionsRepeater.add(positionsPanel); if (data.getUiStatus().isClosed(position.getNumber()) == true) { positionsPanel.setClosed(); } else { positionsPanel.setOpen(); } positionsPanel.setHeading(getPositionHeading(position, positionsPanel)); final GridBuilder posGridBuilder = positionsPanel.createGridBuilder(); posGridBuilder.newGridPanel(); { final FieldsetPanel fs = posGridBuilder.newFieldset(getString("fibu.auftrag.titel")); fs.add(new MaxLengthTextField(InputPanel.WICKET_ID, new PropertyModel<String>(position, "titel"))); } posGridBuilder.newSplitPanel(GridSize.COL33); { // DropDownChoice type final FieldsetPanel fs = posGridBuilder.newFieldset(getString("fibu.auftrag.position.art")); final LabelValueChoiceRenderer<AuftragsPositionsArt> artChoiceRenderer = new LabelValueChoiceRenderer<AuftragsPositionsArt>(fs, AuftragsPositionsArt.values()); final DropDownChoice<AuftragsPositionsArt> artChoice = new DropDownChoice<AuftragsPositionsArt>(fs.getDropDownChoiceId(), new PropertyModel<AuftragsPositionsArt>(position, "art"), artChoiceRenderer.getValues(), artChoiceRenderer); artChoice.setNullValid(false); artChoice.setRequired(true); fs.add(artChoice); } posGridBuilder.newSplitPanel(GridSize.COL33); { // Person days final FieldsetPanel fs = posGridBuilder.newFieldset(getString("projectmanagement.personDays")); fs.add(new MinMaxNumberField<BigDecimal>(InputPanel.WICKET_ID, new PropertyModel<BigDecimal>(position, "personDays"), BigDecimal.ZERO, MAX_PERSON_DAYS)); } posGridBuilder.newSplitPanel(GridSize.COL33); { // Net sum final FieldsetPanel fs = posGridBuilder.newFieldset(getString("fibu.auftrag.nettoSumme")); fs.add(new TextField<String>(InputPanel.WICKET_ID, new PropertyModel<String>(position, "nettoSumme")) { @SuppressWarnings({ "rawtypes", "unchecked"}) @Override public IConverter getConverter(final Class type) { return new CurrencyConverter(); } }); if (abgeschlossenUndNichtFakturiert == true) { fs.setWarningBackground(); } } posGridBuilder.newSplitPanel(GridSize.COL33); final Set<RechnungsPositionVO> invoicePositionsByOrderPositionId = rechnungCache .getRechnungsPositionVOSetByAuftragsPositionId(position.getId()); final boolean showInvoices = CollectionUtils.isNotEmpty(invoicePositionsByOrderPositionId); { // Invoices final FieldsetPanel fs = posGridBuilder.newFieldset(getString("fibu.rechnungen")).suppressLabelForWarning(); if (showInvoices == true) { final InvoicePositionsPanel panel = new InvoicePositionsPanel(fs.newChildId()); fs.add(panel); panel.init(invoicePositionsByOrderPositionId); } else { fs.add(AbstractUnsecureBasePage.createInvisibleDummyComponent(fs.newChildId())); } } posGridBuilder.newSplitPanel(GridSize.COL33); { // invoiced final FieldsetPanel fs = posGridBuilder.newFieldset(getString("fibu.fakturiert")).suppressLabelForWarning(); if (showInvoices == true) { fs.add(new DivTextPanel(fs.newChildId(), CurrencyFormatter.format(RechnungDao.getNettoSumme(invoicePositionsByOrderPositionId)))); } else { fs.add(AbstractUnsecureBasePage.createInvisibleDummyComponent(fs.newChildId())); } if (UserRights.getAccessChecker().hasRight(getUser(), RechnungDao.USER_RIGHT_ID, UserRightValue.READWRITE) == true) { final DivPanel checkBoxDiv = fs.addNewCheckBoxButtonDiv(); checkBoxDiv.add(new CheckBoxButton(checkBoxDiv.newChildId(), new PropertyModel<Boolean>(position, "vollstaendigFakturiert"), getString("fibu.auftrag.vollstaendigFakturiert"))); } } posGridBuilder.newSplitPanel(GridSize.COL33); { // DropDownChoice status final FieldsetPanel fs = posGridBuilder.newFieldset(getString("status")); final LabelValueChoiceRenderer<AuftragsPositionsStatus> statusChoiceRenderer = new LabelValueChoiceRenderer<AuftragsPositionsStatus>( fs, AuftragsPositionsStatus.values()); final DropDownChoice<AuftragsPositionsStatus> statusChoice = new DropDownChoice<AuftragsPositionsStatus>(fs.getDropDownChoiceId(), new PropertyModel<AuftragsPositionsStatus>(position, "status"), statusChoiceRenderer.getValues(), statusChoiceRenderer); statusChoice.setNullValid(true); statusChoice.setRequired(false); fs.add(statusChoice); if (abgeschlossenUndNichtFakturiert == true) { fs.setWarningBackground(); } } posGridBuilder.newSplitPanel(GridSize.COL100); { // Task final FieldsetPanel fs = posGridBuilder.newFieldset(getString("task")); final TaskSelectPanel taskSelectPanel = new TaskSelectPanel(fs, new PropertyModel<TaskDO>(position, "task"), parentPage, "taskId:" + position.getNumber()) { @Override protected void selectTask(final TaskDO task) { super.selectTask(task); parentPage.getBaseDao().setTask(position, task.getId()); } }; fs.add(taskSelectPanel); taskSelectPanel.init(); } posGridBuilder.newSplitPanel(GridSize.COL100); { // Period of performance final FieldsetPanel fs = posGridBuilder.newFieldset(getString("fibu.periodOfPerformance")); final LabelValueChoiceRenderer<PeriodOfPerformanceType> performanceChoiceRenderer = new LabelValueChoiceRenderer<PeriodOfPerformanceType>( fs, PeriodOfPerformanceType.values()); final DropDownChoice<PeriodOfPerformanceType> performanceChoice = new DropDownChoice<PeriodOfPerformanceType>( fs.getDropDownChoiceId(), new PropertyModel<PeriodOfPerformanceType>(position, "periodOfPerformanceType"), performanceChoiceRenderer.getValues(), performanceChoiceRenderer) { /** * @see org.apache.wicket.markup.html.form.AbstractSingleSelectChoice#getDefaultChoice(java.lang.String) */ @Override protected CharSequence getDefaultChoice(final String selectedValue) { if (posHasOwnPeriodOfPerformance(position.getNumber()) == true) { return super.getDefaultChoice(PeriodOfPerformanceType.OWN.toString()); } else { return super.getDefaultChoice(PeriodOfPerformanceType.SEEABOVE.toString()); } } }; performanceChoice.add(new AjaxFormComponentUpdatingBehavior("onchange") { @Override protected void onUpdate(final AjaxRequestTarget target) { final short pos = position.getNumber(); final PeriodOfPerformanceType s = performanceChoice.getModelObject(); final boolean visible = s.equals(PeriodOfPerformanceType.OWN); setPosPeriodOfPerformanceVisible(pos, visible); if (ajaxPosTargets != null) { for (final Component ajaxPosTarget : ajaxPosTargets) target.add(ajaxPosTarget); } } }); performanceChoice.setOutputMarkupPlaceholderTag(true); fs.add(performanceChoice); final DatePanel fromDatePanel = new DatePanel(fs.newChildId(), new PropertyModel<Date>(position, "periodOfPerformanceBegin"), DatePanelSettings.get().withTargetType(java.sql.Date.class)); fromDatePanel.getDateField().setOutputMarkupPlaceholderTag(true); fs.add(fromDatePanel); ajaxPosTargets.add(fromDatePanel.getDateField()); dependentComponents.add(fromDatePanel); final DivTextPanel divPanel = new DivTextPanel(fs.newChildId(), "-"); divPanel.getLabel4Ajax().setOutputMarkupPlaceholderTag(true); fs.add(divPanel); ajaxPosTargets.add(divPanel.getLabel4Ajax()); final DatePanel endDatePanel = new DatePanel(fs.newChildId(), new PropertyModel<Date>(position, "periodOfPerformanceEnd"), DatePanelSettings.get().withTargetType(java.sql.Date.class)); endDatePanel.getDateField().setOutputMarkupPlaceholderTag(true); fs.add(endDatePanel); ajaxPosTargets.add(endDatePanel.getDateField()); dependentComponents.add(endDatePanel); final LabelValueChoiceRenderer<ModeOfPaymentType> paymentChoiceRenderer = new LabelValueChoiceRenderer<ModeOfPaymentType>(fs, ModeOfPaymentType.values()); final DropDownChoice<ModeOfPaymentType> paymentChoice = new DropDownChoice<ModeOfPaymentType>(fs.getDropDownChoiceId(), new PropertyModel<ModeOfPaymentType>(position, "modeOfPaymentType"), paymentChoiceRenderer.getValues(), paymentChoiceRenderer); paymentChoice.setOutputMarkupPlaceholderTag(true); fs.add(paymentChoice); ajaxPosTargets.add(paymentChoice); } posGridBuilder.newGridPanel(); { // Comment final FieldsetPanel fs = posGridBuilder.newFieldset(getString("comment")); fs.add(new MaxLengthTextArea(TextAreaPanel.WICKET_ID, new PropertyModel<String>(position, "bemerkung"))); } setPosPeriodOfPerformanceVisible(position.getNumber(), posHasOwnPeriodOfPerformance(position.getNumber())); } positionsDependentFormComponents = dependentComponents.toArray(new FormComponent[0]); } protected String getPositionHeading(final AuftragsPositionDO position, final ToggleContainerPanel positionsPanel) { if (positionsPanel.getToggleStatus() == ToggleStatus.OPENED) { return getString("label.position.short") + " #" + position.getNumber(); } final StringBuffer heading = new StringBuffer(); heading.append(escapeHtml(getString("label.position.short"))).append(" #").append(position.getNumber()); heading.append(": ").append(CurrencyFormatter.format(position.getNettoSumme())); if (position.getStatus() != null) { heading.append(", ").append(getString(position.getStatus().getI18nKey())); } if (position.isVollstaendigFakturiert() == false) { heading.append(" (").append(getString("fibu.fakturiert.not")).append(")"); } if (StringHelper.isNotBlank(position.getTitel()) == true) { heading.append(": ").append(StringUtils.abbreviate(position.getTitel(), 80)); } return heading.toString(); } protected String getPaymentScheduleHeading(final List<PaymentScheduleDO> paymentSchedules, final ToggleContainerPanel schedulesPanel) { BigDecimal ges = BigDecimal.ZERO; BigDecimal invoiced = BigDecimal.ZERO; if (paymentSchedules != null) { for (final PaymentScheduleDO schedule : paymentSchedules) { if (schedule.getAmount() != null) { ges = ges.add(schedule.getAmount()); if (schedule.isVollstaendigFakturiert() == true) { invoiced = invoiced.add(schedule.getAmount()); } } if (schedule.isReached() == true && schedule.isVollstaendigFakturiert() == false) { schedulesPanel.setHighlightedHeader(); } } } if (schedulesPanel.getToggleStatus() == ToggleStatus.OPENED) { return getString("fibu.auftrag.paymentschedule") + " (" + paymentSchedules.size() + ")"; } final StringBuffer heading = new StringBuffer(); heading.append(escapeHtml(getString("fibu.auftrag.paymentschedule"))).append(" (") .append(paymentSchedules != null ? paymentSchedules.size() : "0").append(")"); heading.append(": ").append(CurrencyFormatter.format(ges)).append(" ").append(getString("fibu.fakturiert")).append(" ") .append(CurrencyFormatter.format(invoiced)); return heading.toString(); } @Override protected Logger getLogger() { return log; } private boolean posHasOwnPeriodOfPerformance(final short number) { return ((getData().getPosition(number).getPeriodOfPerformanceBegin() != null && StringUtils.isBlank(getData().getPosition(number) .getPeriodOfPerformanceBegin().toString()) == false) || (getData().getPosition(number).getPeriodOfPerformanceEnd() != null && StringUtils.isBlank(getData().getPosition(number) .getPeriodOfPerformanceEnd().toString()) == false) || getData().getPosition(number).getPeriodOfPerformanceType() == PeriodOfPerformanceType.OWN); } private void setPosPeriodOfPerformanceVisible(final short pos, final boolean visible) { ajaxPosTargets.get(pos * 4 - 4).setVisible(visible); ajaxPosTargets.get(pos * 4 - 3).setVisible(visible); ajaxPosTargets.get(pos * 4 - 2).setVisible(visible); ajaxPosTargets.get(pos * 4 - 1).setVisible(visible); } }