package io.konik.calculation; import io.konik.util.Amounts; import io.konik.zugferd.Invoice; import io.konik.zugferd.entity.trade.Trade; import io.konik.zugferd.entity.trade.item.Item; import io.konik.zugferd.entity.trade.item.ItemTax; import io.konik.zugferd.entity.trade.item.SpecifiedSettlement; import io.konik.zugferd.unqualified.Amount; import javax.validation.constraints.NotNull; import java.math.BigDecimal; import java.math.RoundingMode; public class InvoiceTaxCompleter implements Correction<Invoice> { @Override public Invoice correct(@NotNull Invoice invoice) { if (invoice != null && invoice.getTrade() != null && invoice.getTrade().getItems() != null) { Trade trade = invoice.getTrade(); for (Item item : trade.getItems()) { SpecifiedSettlement settlement = item.getSettlement(); if (settlement.getMonetarySummation() != null) { Amount lineTotal = settlement.getMonetarySummation().getLineTotal(); if (lineTotal != null) { if (settlement.getTradeTax() != null) { for (ItemTax tax : settlement.getTradeTax()) { if (tax.getPercentage() != null) { BigDecimal value = lineTotal.getValue(); BigDecimal calculated = value.multiply(tax.getPercentage().divide(BigDecimal.valueOf(100))).setScale(2, RoundingMode.HALF_UP); tax.setCalculated(new Amount(calculated, lineTotal.getCurrency())); } else { tax.setCalculated(Amounts.zero(lineTotal.getCurrency())); } } } } else { if (settlement.getTradeTax() != null) { settlement.getTradeTax().clear(); } } } } } return invoice; } }