001package io.konik.calculation; 002 003import io.konik.util.Amounts; 004import io.konik.zugferd.Invoice; 005import io.konik.zugferd.entity.trade.Trade; 006import io.konik.zugferd.entity.trade.item.Item; 007import io.konik.zugferd.entity.trade.item.ItemTax; 008import io.konik.zugferd.entity.trade.item.SpecifiedSettlement; 009import io.konik.zugferd.unqualified.Amount; 010 011import javax.validation.constraints.NotNull; 012import java.math.BigDecimal; 013import java.math.RoundingMode; 014 015public class InvoiceTaxCompleter implements Correction<Invoice> { 016 017 @Override 018 public Invoice correct(@NotNull Invoice invoice) { 019 020 if (invoice != null && invoice.getTrade() != null && invoice.getTrade().getItems() != null) { 021 Trade trade = invoice.getTrade(); 022 023 for (Item item : trade.getItems()) { 024 SpecifiedSettlement settlement = item.getSettlement(); 025 026 if (settlement.getMonetarySummation() != null) { 027 Amount lineTotal = settlement.getMonetarySummation().getLineTotal(); 028 029 if (lineTotal != null) { 030 if (settlement.getTradeTax() != null) { 031 for (ItemTax tax : settlement.getTradeTax()) { 032 if (tax.getPercentage() != null) { 033 BigDecimal value = lineTotal.getValue(); 034 BigDecimal calculated = value.multiply(tax.getPercentage().divide(BigDecimal.valueOf(100))).setScale(2, RoundingMode.HALF_UP); 035 036 tax.setCalculated(new Amount(calculated, lineTotal.getCurrency())); 037 } else { 038 tax.setCalculated(Amounts.zero(lineTotal.getCurrency())); 039 } 040 } 041 } 042 } else { 043 if (settlement.getTradeTax() != null) { 044 settlement.getTradeTax().clear(); 045 } 046 } 047 } 048 } 049 } 050 return invoice; 051 } 052}