package co.smartreceipts.android.model.factory; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import com.google.common.base.Preconditions; import java.io.File; import java.math.BigDecimal; import java.sql.Date; import java.util.TimeZone; import co.smartreceipts.android.model.Category; import co.smartreceipts.android.model.PaymentMethod; import co.smartreceipts.android.model.Price; import co.smartreceipts.android.model.PriceCurrency; import co.smartreceipts.android.model.Receipt; import co.smartreceipts.android.model.Source; import co.smartreceipts.android.model.Trip; import co.smartreceipts.android.model.gson.ExchangeRate; import co.smartreceipts.android.model.impl.DefaultReceiptImpl; import co.smartreceipts.android.model.impl.ImmutableCategoryImpl; import co.smartreceipts.android.sync.model.SyncState; import co.smartreceipts.android.sync.model.impl.DefaultSyncState; /** * A {@link co.smartreceipts.android.model.Receipt} {@link BuilderFactory} * implementation, which will be used to generate instances of {@link co.smartreceipts.android.model.Receipt} objects */ public class ReceiptBuilderFactory implements BuilderFactory<Receipt> { private static final int UNKNOWN_ID = -1; private Trip _trip; private PaymentMethod _paymentMethod; private File _file; private String _name; private Category _category; private String _comment; private String _extraEditText1; private String _extraEditText2; private String _extraEditText3; private final PriceBuilderFactory _priceBuilderFactory, _taxBuilderFactory; private Date _date; private TimeZone _timezone; private int _id; private int _index; private boolean _isReimbursable, _isFullPage, _isSelected; private Source _source; private SyncState _syncState; public ReceiptBuilderFactory() { this(UNKNOWN_ID); } public ReceiptBuilderFactory(int id) { _id = id; _name = ""; _comment = ""; _priceBuilderFactory = new PriceBuilderFactory(); _taxBuilderFactory = new PriceBuilderFactory(); _date = new Date(System.currentTimeMillis()); _timezone = TimeZone.getDefault(); _index = -1; _source = Source.Undefined; _syncState = new DefaultSyncState(); } public ReceiptBuilderFactory(@NonNull Receipt receipt) { _id = receipt.getId(); _trip = receipt.getTrip(); _name = receipt.getName(); _file = receipt.getFile(); _priceBuilderFactory = new PriceBuilderFactory().setPrice(receipt.getPrice()); _taxBuilderFactory = new PriceBuilderFactory().setPrice(receipt.getTax()); _date = (Date) receipt.getDate().clone(); _timezone = receipt.getTimeZone(); _category = receipt.getCategory(); _comment = receipt.getComment(); _paymentMethod = receipt.getPaymentMethod(); _isReimbursable = receipt.isReimbursable(); _isFullPage = receipt.isFullPage(); _isSelected = receipt.isSelected(); _extraEditText1 = receipt.getExtraEditText1(); _extraEditText2 = receipt.getExtraEditText2(); _extraEditText3 = receipt.getExtraEditText3(); _index = receipt.getIndex(); _source = receipt.getSource(); _syncState = receipt.getSyncState(); } public ReceiptBuilderFactory(int id, @NonNull Receipt receipt) { this(receipt); _id = id; } public ReceiptBuilderFactory setTrip(@NonNull Trip trip) { _trip = trip; return this; } public ReceiptBuilderFactory setPaymentMethod(PaymentMethod method) { _paymentMethod = method; return this; } public ReceiptBuilderFactory setName(@NonNull String name) { _name = name; return this; } @Deprecated public ReceiptBuilderFactory setCategory(@NonNull String category) { // TODO: Delete me _category = new ImmutableCategoryImpl(category, ""); return this; } public ReceiptBuilderFactory setCategory(@NonNull Category category) { _category = category; return this; } public ReceiptBuilderFactory setComment(@NonNull String comment) { _comment = comment; return this; } /** * Sets the price of this ReceiptBuilderFactory as a string (useful for user input) * * @param price - the desired price as a string * @return the {@link ReceiptBuilderFactory} instance for method chaining */ public ReceiptBuilderFactory setPrice(String price) { _priceBuilderFactory.setPrice(price); return this; } public ReceiptBuilderFactory setPrice(double price) { _priceBuilderFactory.setPrice(price); return this; } public ReceiptBuilderFactory setPrice(BigDecimal price) { _priceBuilderFactory.setPrice(price); return this; } public ReceiptBuilderFactory setPrice(Price price) { _priceBuilderFactory.setPrice(price); return this; } public ReceiptBuilderFactory setExchangeRate(ExchangeRate exchangeRate) { _priceBuilderFactory.setExchangeRate(exchangeRate); _taxBuilderFactory.setExchangeRate(exchangeRate); return this; } /** * Sets the tax of this ReceiptBuilderFactory as a string (useful for user input) * * @param tax - the desired tax as a string * @return the {@link ReceiptBuilderFactory} instance for method chaining */ public ReceiptBuilderFactory setTax(String tax) { _taxBuilderFactory.setPrice(tax); return this; } public ReceiptBuilderFactory setTax(double tax) { _taxBuilderFactory.setPrice(tax); return this; } public ReceiptBuilderFactory setTax(Price tax) { _taxBuilderFactory.setPrice(tax); return this; } public ReceiptBuilderFactory setFile(File file) { _file = file; return this; } public ReceiptBuilderFactory setImage(File image) { _file = image; return this; } public ReceiptBuilderFactory setPDF(File pdf) { _file = pdf; return this; } public ReceiptBuilderFactory setDate(Date date) { _date = date; return this; } public ReceiptBuilderFactory setDate(long datetime) { _date = new Date(datetime); return this; } public ReceiptBuilderFactory setTimeZone(@Nullable String timeZoneId) { if (timeZoneId != null) { _timezone = TimeZone.getTimeZone(timeZoneId); } return this; } public ReceiptBuilderFactory setTimeZone(TimeZone timeZone) { _timezone = timeZone; return this; } public ReceiptBuilderFactory setIsReimbursable(boolean isReimbursable) { _isReimbursable = isReimbursable; return this; } public ReceiptBuilderFactory setIsFullPage(boolean isFullPage) { _isFullPage = isFullPage; return this; } public ReceiptBuilderFactory setIsSelected(boolean isSelected) { _isSelected = isSelected; return this; } public ReceiptBuilderFactory setCurrency(PriceCurrency currency) { _priceBuilderFactory.setCurrency(currency); _taxBuilderFactory.setCurrency(currency); return this; } public ReceiptBuilderFactory setCurrency(String currencyCode) { _priceBuilderFactory.setCurrency(currencyCode); _taxBuilderFactory.setCurrency(currencyCode); return this; } public ReceiptBuilderFactory setExtraEditText1(String extraEditText1) { _extraEditText1 = extraEditText1; return this; } public ReceiptBuilderFactory setExtraEditText2(String extraEditText2) { _extraEditText2 = extraEditText2; return this; } public ReceiptBuilderFactory setExtraEditText3(String extraEditText3) { _extraEditText3 = extraEditText3; return this; } public ReceiptBuilderFactory setIndex(int index) { _index = index; return this; } public ReceiptBuilderFactory setSyncState(@NonNull SyncState syncState) { _syncState = Preconditions.checkNotNull(syncState); return this; } @Override @NonNull public Receipt build() { return new DefaultReceiptImpl(_id, _index, _trip, _file, _paymentMethod, _name, _category, _comment, _priceBuilderFactory.build(), _taxBuilderFactory.build(), _date, _timezone, _isReimbursable, _isFullPage, _isSelected, _source, _extraEditText1, _extraEditText2, _extraEditText3, _syncState); } }