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}