package co.smartreceipts.android.workers.reports.pdf.pdfbox; import android.support.annotation.NonNull; import com.google.common.base.Preconditions; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import co.smartreceipts.android.model.Distance; import co.smartreceipts.android.model.Price; import co.smartreceipts.android.model.PriceCurrency; import co.smartreceipts.android.model.Receipt; import co.smartreceipts.android.model.Trip; import co.smartreceipts.android.model.factory.PriceBuilderFactory; import co.smartreceipts.android.settings.UserPreferenceManager; import co.smartreceipts.android.settings.catalog.UserPreference; /** * Encapsulates the calculations and data of receipts totals. * Independent of the pdf library implementation. */ public class ReceiptsTotals { public final Price netPrice; public final Price receiptsPrice; public final Price reimbursablePrice; public final Price noTaxPrice; public final Price taxPrice; public final Price distancePrice; public ReceiptsTotals(@NonNull Trip trip, @NonNull List<Receipt> receipts, @NonNull List<Distance> distances, @NonNull UserPreferenceManager preferences) { Preconditions.checkNotNull(trip); Preconditions.checkNotNull(receipts); Preconditions.checkNotNull(distances); Preconditions.checkNotNull(preferences); final ArrayList<Price> netTotal = new ArrayList<>(receipts.size()); final ArrayList<Price> receiptTotal = new ArrayList<>(receipts.size()); final ArrayList<Price> reimbursableTotal = new ArrayList<>(receipts.size()); final ArrayList<Price> noTaxesTotal = new ArrayList<>(receipts.size() * 2); final ArrayList<Price> taxesTotal = new ArrayList<>(receipts.size() * 2); final ArrayList<Price> distanceTotal = new ArrayList<>(distances.size()); // Sum up our receipt totals for various conditions final int len = receipts.size(); for (int i = 0; i < len; i++) { final Receipt receipt = receipts.get(i); if (!preferences.get(UserPreference.Receipts.OnlyIncludeReimbursable) || receipt.isReimbursable()) { netTotal.add(receipt.getPrice()); receiptTotal.add(receipt.getPrice()); // Treat taxes as negative prices for the sake of this conversion noTaxesTotal.add(receipt.getPrice()); noTaxesTotal.add(new PriceBuilderFactory().setCurrency(receipt.getTax().getCurrency()).setPrice(receipt.getTax().getPrice().multiply(new BigDecimal(-1))).build()); taxesTotal.add(receipt.getTax()); if (preferences.get(UserPreference.Receipts.UsePreTaxPrice)) { netTotal.add(receipt.getTax()); } if (receipt.isReimbursable()) { reimbursableTotal.add(receipt.getPrice()); } } } // Sum up our distance totals for (int i = 0; i < distances.size(); i++) { final Distance distance = distances.get(i); netTotal.add(distance.getPrice()); distanceTotal.add(distance.getPrice()); } final PriceCurrency tripCurrency = trip.getTripCurrency(); netPrice = new PriceBuilderFactory().setPrices(netTotal, tripCurrency).build(); receiptsPrice = new PriceBuilderFactory().setPrices(receiptTotal, tripCurrency).build(); reimbursablePrice = new PriceBuilderFactory().setPrices(reimbursableTotal, tripCurrency).build(); noTaxPrice = new PriceBuilderFactory().setPrices(noTaxesTotal, tripCurrency).build(); taxPrice = new PriceBuilderFactory().setPrices(taxesTotal, tripCurrency).build(); distancePrice = new PriceBuilderFactory().setPrices(distanceTotal, tripCurrency).build(); } }