private (Amount paid, Money remaining) Pay(Money money, Amount remainder) { var now = Timestamp.Now; switch (money) { case Amount amt when amt.Currency != remainder.Currency: return(Amount.Zero(remainder.Currency), money); case Amount amt when amt.Value <= remainder.Value: return(new Amount(amt.Currency, amt.Value), Amount.Zero(amt.Currency)); case GiftCard gift when gift.Currency != remainder.Currency: return(Amount.Zero(remainder.Currency), gift); case GiftCard gift when gift.ValidBefore.CompareTo(now) < 0: return(Amount.Zero(remainder.Currency), Amount.Zero(gift.Currency)); case GiftCard gift when gift.Value <= remainder.Value: return(new Amount(gift.Currency, gift.Value), Amount.Zero(gift.Currency)); case Amount amt: return(remainder, amt.Subtract(remainder)); case BankCard card when card.ValidBefore.CompareTo(now) < 0: return(Amount.Zero(remainder.Currency), Amount.Zero(remainder.Currency)); case BankCard _: return(remainder, money); default: throw new ArgumentException("Money type not supported."); } }
public override Tuple <Amount, Money> Take(Currency currency, decimal amount) => Tuple.Create(Amount.Zero(currency), (Money)this);
public override Money On(Timestamp time) => time.CompareTo(this.ValidBefore) >= 0 ? Amount.Zero(base.Currency) : this;