Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Gh6537 #1415

Closed
wants to merge 17 commits into from
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import java.util.Set;
import java.util.stream.Collectors;

import org.adempiere.invoice.service.IInvoiceDAO;
import org.compiere.Adempiere;
import org.compiere.model.I_C_BPartner;
import org.compiere.model.I_C_BankStatementLine;
Expand All @@ -27,6 +26,7 @@
import de.metas.currency.CurrencyCode;
import de.metas.currency.CurrencyRepository;
import de.metas.invoice.InvoiceId;
import de.metas.invoice.service.IInvoiceDAO;
import de.metas.money.CurrencyId;
import de.metas.payment.PaymentId;
import de.metas.payment.api.IPaymentDAO;
Expand Down
73 changes: 57 additions & 16 deletions src/main/java/de/metas/ui/web/payment_allocation/InvoiceRow.java
Original file line number Diff line number Diff line change
@@ -1,18 +1,23 @@
package de.metas.ui.web.payment_allocation;

import java.time.LocalDate;
import java.util.Map;
import java.util.Set;

import javax.annotation.Nullable;

import org.adempiere.util.lang.impl.TableRecordReference;
import org.compiere.model.I_C_Invoice;

import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableMap;

import de.metas.bpartner.BPartnerId;
import de.metas.currency.Amount;
import de.metas.i18n.ITranslatableString;
import de.metas.invoice.InvoiceDocBaseType;
import de.metas.invoice.InvoiceId;
import de.metas.lang.SOTrx;
import de.metas.invoice.invoiceProcessingServiceCompany.InvoiceProcessingFeeCalculation;
import de.metas.organization.ClientAndOrgId;
import de.metas.organization.OrgId;
import de.metas.ui.web.view.IViewRow;
Expand All @@ -23,6 +28,7 @@
import de.metas.ui.web.window.datatypes.DocumentPath;
import de.metas.ui.web.window.datatypes.LookupValue;
import de.metas.ui.web.window.descriptor.DocumentFieldWidgetType;
import de.metas.ui.web.window.descriptor.ViewEditorRenderMode;
import de.metas.ui.web.window.descriptor.WidgetSize;
import lombok.Builder;
import lombok.Getter;
Expand Down Expand Up @@ -72,54 +78,83 @@ public class InvoiceRow implements IViewRow
@Getter
private final Amount openAmt;

@ViewColumn(seqNo = 70, widgetType = DocumentFieldWidgetType.Amount, widgetSize = WidgetSize.Small, captionKey = "Discount")
public static final String FIELD_DiscountAmt = "discountAmt";
@ViewColumn(seqNo = 70, widgetType = DocumentFieldWidgetType.Amount, widgetSize = WidgetSize.Small, captionKey = "Discount", fieldName = FIELD_DiscountAmt)
@Getter
private final Amount discountAmt;

@ViewColumn(seqNo = 80, widgetType = DocumentFieldWidgetType.Text, widgetSize = WidgetSize.Small, captionKey = "C_Currency_ID")
public static final String FIELD_ServiceFeeAmt = "serviceFeeAmt";
@ViewColumn(seqNo = 80, widgetType = DocumentFieldWidgetType.Amount, widgetSize = WidgetSize.Small, captionKey = "ServiceFeeAmt", fieldName = FIELD_ServiceFeeAmt)
@Getter
private final Amount serviceFeeAmt;

@ViewColumn(seqNo = 90, widgetType = DocumentFieldWidgetType.Text, widgetSize = WidgetSize.Small, captionKey = "C_Currency_ID")
private final String currencyCode;

//
//
//

private final DocumentId rowId;
@Getter
private final InvoiceId invoiceId;
private final ClientAndOrgId clientAndOrgId;
@Getter
private final SOTrx soTrx;
private final InvoiceDocBaseType docBaseType;
@Getter
private final boolean creditMemo;
private final InvoiceProcessingFeeCalculation serviceFeeCalculation;

private final ViewRowFieldNameAndJsonValuesHolder<InvoiceRow> values;

@Builder
@Builder(toBuilder = true)
private InvoiceRow(
@NonNull final InvoiceId invoiceId,
@NonNull final ClientAndOrgId clientAndOrgId,
@NonNull final ITranslatableString docTypeName,
@NonNull final String documentNo,
@NonNull final LocalDate dateInvoiced,
@NonNull final LookupValue bpartner,
@NonNull final SOTrx soTrx,
final boolean creditMemo,
@NonNull final InvoiceDocBaseType docBaseType,
@NonNull final Amount grandTotal,
@NonNull final Amount openAmt,
@NonNull final Amount discountAmt)
@NonNull final Amount discountAmt,
@Nullable final InvoiceProcessingFeeCalculation serviceFeeCalculation)
{
rowId = convertInvoiceIdToDocumentId(invoiceId);
this.invoiceId = invoiceId;
this.clientAndOrgId = clientAndOrgId;
this.docTypeName = docTypeName;
this.documentNo = documentNo;
this.dateInvoiced = dateInvoiced;
this.bpartner = bpartner;
this.soTrx = soTrx;
this.creditMemo = creditMemo;
this.docBaseType = docBaseType;

this.grandTotal = grandTotal;
this.openAmt = openAmt;
this.discountAmt = discountAmt;
this.currencyCode = Amount.getCommonCurrencyCodeOfAll(grandTotal, openAmt, discountAmt)
this.serviceFeeAmt = serviceFeeCalculation != null ? serviceFeeCalculation.getFeeAmountIncludingTax() : null;
this.currencyCode = Amount.getCommonCurrencyCodeOfAll(grandTotal, openAmt, discountAmt, this.serviceFeeAmt)
.toThreeLetterCode();

values = ViewRowFieldNameAndJsonValuesHolder.newInstance(InvoiceRow.class);
rowId = convertInvoiceIdToDocumentId(invoiceId);
this.invoiceId = invoiceId;
this.clientAndOrgId = clientAndOrgId;
this.serviceFeeCalculation = serviceFeeCalculation;

this.values = buildViewRowFieldNameAndJsonValuesHolder(serviceFeeCalculation);
}

private static ViewRowFieldNameAndJsonValuesHolder<InvoiceRow> buildViewRowFieldNameAndJsonValuesHolder(
@Nullable final InvoiceProcessingFeeCalculation serviceFeeCalculation)
{
final ImmutableMap.Builder<String, ViewEditorRenderMode> viewEditorRenderModes = ImmutableMap.<String, ViewEditorRenderMode> builder()
.put(FIELD_DiscountAmt, ViewEditorRenderMode.ALWAYS);

if (serviceFeeCalculation != null)
{
viewEditorRenderModes.put(FIELD_ServiceFeeAmt, ViewEditorRenderMode.ALWAYS);
}

return ViewRowFieldNameAndJsonValuesHolder.builder(InvoiceRow.class)
.viewEditorRenderModeByFieldName(viewEditorRenderModes.build())
.build();
}

static DocumentId convertInvoiceIdToDocumentId(@NonNull final InvoiceId invoiceId)
Expand Down Expand Up @@ -181,6 +216,12 @@ public ViewRowFieldNameAndJsonValues getFieldNameAndJsonValues()
return values.get(this);
}

@Override
public Map<String, ViewEditorRenderMode> getViewEditorRenderModeByFieldName()
{
return values.getViewEditorRenderModeByFieldName();
}

public BPartnerId getBPartnerId()
{
return bpartner.getIdAs(BPartnerId::ofRepoId);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package de.metas.ui.web.payment_allocation;

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

import org.adempiere.exceptions.AdempiereException;

import de.metas.currency.Amount;
import de.metas.currency.CurrencyCode;
import de.metas.invoice.invoiceProcessingServiceCompany.InvoiceProcessingFeeCalculation;
import de.metas.ui.web.payment_allocation.InvoiceRow.InvoiceRowBuilder;
import de.metas.ui.web.window.datatypes.json.JSONDocumentChangedEvent;
import lombok.NonNull;

/*
* #%L
* metasfresh-webui-api
* %%
* Copyright (C) 2020 metas GmbH
* %%
* This program 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, either version 2 of the
* License, or (at your option) any later version.
*
* This program 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/gpl-2.0.html>.
* #L%
*/

public class InvoiceRowReducers
{
public static InvoiceRow reduce(
@NonNull final InvoiceRow row,
@NonNull final List<JSONDocumentChangedEvent> fieldChangeRequests)
{
final InvoiceRowBuilder rowBuilder = row.toBuilder();

for (JSONDocumentChangedEvent fieldChangeRequest : fieldChangeRequests)
{
fieldChangeRequest.assertReplaceOperation();
final String fieldName = fieldChangeRequest.getPath();
if (InvoiceRow.FIELD_DiscountAmt.contentEquals(fieldName))
{
final BigDecimal discountAmtBD = fieldChangeRequest.getValueAsBigDecimal(BigDecimal.ZERO);

final CurrencyCode currencyCode = row.getDiscountAmt().getCurrencyCode();
final Amount discountAmt = Amount.of(discountAmtBD, currencyCode);
rowBuilder.discountAmt(discountAmt);
}
else if (InvoiceRow.FIELD_ServiceFeeAmt.contentEquals(fieldName))
{
final BigDecimal serviceFeeAmtBD = fieldChangeRequest.getValueAsBigDecimal(BigDecimal.ZERO);

final InvoiceProcessingFeeCalculation serviceFee = row.getServiceFeeCalculation().withFeeAmountIncludingTax(serviceFeeAmtBD);
rowBuilder.serviceFeeCalculation(serviceFee);
}
else
{
throw new AdempiereException("Changing " + fieldName + " is not allowed");
}
}

return rowBuilder.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,13 @@
import com.google.common.collect.ImmutableSet;

import de.metas.invoice.InvoiceId;
import de.metas.ui.web.view.IEditableView.RowEditingContext;
import de.metas.ui.web.view.template.IEditableRowsData;
import de.metas.ui.web.view.template.IRowsData;
import de.metas.ui.web.view.template.SynchronizedRowsIndexHolder;
import de.metas.ui.web.window.datatypes.DocumentId;
import de.metas.ui.web.window.datatypes.DocumentIdsSelection;
import de.metas.ui.web.window.datatypes.json.JSONDocumentChangedEvent;
import lombok.Builder;
import lombok.NonNull;

Expand All @@ -40,7 +43,7 @@
* #L%
*/

public class InvoiceRows implements IRowsData<InvoiceRow>
public class InvoiceRows implements IEditableRowsData<InvoiceRow>
{
public static InvoiceRows cast(final IRowsData<InvoiceRow> rows)
{
Expand Down Expand Up @@ -103,4 +106,11 @@ public void addInvoice(@NonNull final InvoiceId invoiceId)

rowsHolder.compute(rows -> rows.addingRow(row));
}

@Override
public void patchRow(final RowEditingContext ctx, final List<JSONDocumentChangedEvent> fieldChangeRequests)
{
final DocumentId rowIdToChange = ctx.getRowId();
rowsHolder.compute(rows -> rows.changingRow(rowIdToChange, row -> InvoiceRowReducers.reduce(row, fieldChangeRequests)));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,12 @@
import de.metas.invoice.InvoiceId;
import de.metas.process.RelatedProcessDescriptor;
import de.metas.ui.web.document.filter.provider.NullDocumentFilterDescriptorsProvider;
import de.metas.ui.web.view.IEditableView;
import de.metas.ui.web.view.IView;
import de.metas.ui.web.view.ViewId;
import de.metas.ui.web.view.template.AbstractCustomView;
import de.metas.ui.web.window.datatypes.DocumentId;
import de.metas.ui.web.window.datatypes.LookupValuesList;
import lombok.Builder;
import lombok.NonNull;

Expand All @@ -39,7 +41,7 @@
* #L%
*/

public class InvoicesView extends AbstractCustomView<InvoiceRow>
public class InvoicesView extends AbstractCustomView<InvoiceRow> implements IEditableView
{
public static InvoicesView cast(final IView view)
{
Expand Down Expand Up @@ -85,4 +87,16 @@ public void addInvoice(@NonNull final InvoiceId invoiceId)
final InvoiceRows invoiceRows = getRowsData();
invoiceRows.addInvoice(invoiceId);
}

@Override
public LookupValuesList getFieldTypeahead(final RowEditingContext ctx, final String fieldName, final String query)
{
throw new UnsupportedOperationException();
}

@Override
public LookupValuesList getFieldDropdown(final RowEditingContext ctx, final String fieldName)
{
throw new UnsupportedOperationException();
}
}