001package io.konik.calculation;
002
003import io.konik.zugferd.Invoice;
004import io.konik.zugferd.entity.trade.MonetarySummation;
005import io.konik.zugferd.entity.trade.TradeTax;
006import org.slf4j.Logger;
007import org.slf4j.LoggerFactory;
008
009import javax.validation.constraints.NotNull;
010import java.util.List;
011
012import static io.konik.validation.AmountCalculator.*;
013
014/**
015 * Recalculates invoice settlement {@link MonetarySummation} and replaces it in the {@link Invoice} object.
016 */
017public final class InvoiceMonetarySummationAndTradeTaxCompleter implements Correction<Invoice> {
018
019        protected static Logger log = LoggerFactory.getLogger(InvoiceMonetarySummationAndTradeTaxCompleter.class);
020
021        @Override
022        public Invoice correct(@NotNull final Invoice invoice) {
023
024                log.debug("Running InvoiceMonetarySummationCompleter...");
025
026                if (invoice.getTrade() != null && invoice.getTrade().getSettlement() != null) {
027                        RecalculationResult result = recalculate(invoice);
028                        MonetarySummation monetarySummation = result.getMonetarySummation();
029                        invoice.getTrade().getSettlement().setMonetarySummation(monetarySummation);
030
031                        TaxAggregator taxAggregator = result.getTaxAggregator();
032                        List<TradeTax> taxes = taxAggregator.generateTradeTaxList(
033                                        invoice.getTrade().getSettlement().getCurrency(),
034                                        invoice.getTrade().getSettlement().getTradeTax()
035                        );
036
037                        invoice.getTrade().getSettlement().getTradeTax().clear();
038
039                        for (TradeTax tradeTax : taxes) {
040                                invoice.getTrade().getSettlement().addTradeTax(tradeTax);
041                        }
042
043                }
044                return invoice;
045        }
046}