Beispiel #1
0
        /// <inheritdoc/>
        public new int CompareTo(object obj)
        {
            if (obj is Card)
            {
                Card c = obj as Card;

                // Cash should always come before Card.
                return(-1);
            }
            else if (obj is Cash)
            {
                Cash c = obj as Cash;

                return(this.Currency.CompareTo(c.Currency));
            }
            else if (obj is DirectDeposit)
            {
                DirectDeposit d = obj as DirectDeposit;

                // Cash should always come before DirectDeposit.
                return(-1);
            }
            else
            {
                throw new InvalidCastException("Types are incompatible, can only compare subclasses of PurchaseMethod with one another");
            }
        }
        /// <inheritdoc/>
        public override bool Equals(object obj)
        {
            DirectDeposit d = (DirectDeposit)obj;

            return((this.Savings == d.Savings) &&
                   (this.BankName == d.BankName) &&
                   (this.Number == d.Number) &&
                   (this.Name == d.Name));
        }
        /// <inheritdoc/>
        public new int CompareTo(object obj)
        {
            if (obj is Card)
            {
                Card c = obj as Card;

                // DirectDeposit should always come after Card.
                return(1);
            }
            else if (obj is Cash)
            {
                Cash c = obj as Cash;

                // DirectDeposit should always come after Cash.
                return(1);
            }
            else if (obj is DirectDeposit)
            {
                DirectDeposit d = obj as DirectDeposit;

                if (this.BankName.CompareTo(d.BankName) == 0)
                {
                    if (this.Number.CompareTo(d.Number) == 0)
                    {
                        if (this.Savings.CompareTo(d.Savings) == 0)
                        {
                            return(this.Name.CompareTo(d.Name));
                        }
                        else
                        {
                            return(this.Savings.CompareTo(d.Savings));
                        }
                    }
                    else
                    {
                        return(this.Number.CompareTo(d.Number));
                    }
                }
                else
                {
                    return(this.BankName.CompareTo(d.BankName));
                }
            }
            else
            {
                throw new InvalidCastException("Types are incompatible, can only compare subclasses of PurchaseMethod with one another");
            }
        }
Beispiel #4
0
        /// <inheritdoc/>
        public new int CompareTo(object obj)
        {
            if (obj is Card)
            {
                Card c = obj as Card;

                if (this.Number.CompareTo(c.Number) == 0)
                {
                    if (this.Provider.CompareTo(c.Provider) == 0)
                    {
                        if (this.Debit.CompareTo(c.Debit) == 0)
                        {
                            return(this.Name.CompareTo(c.Name));
                        }
                        else
                        {
                            return(this.Debit.CompareTo(c.Debit));
                        }
                    }
                    else
                    {
                        return(this.Provider.CompareTo(c.Provider));
                    }
                }
                else
                {
                    return(this.Number.CompareTo(c.Number));
                }
            }
            else if (obj is Cash)
            {
                Cash c = obj as Cash;

                // Cards should always come after Cash.
                return(1);
            }
            else if (obj is DirectDeposit)
            {
                DirectDeposit d = obj as DirectDeposit;

                // Cards should always come before direct deposit.
                return(-1);
            }
            else
            {
                throw new InvalidCastException("Types are incompatible, can only compare subclasses of PurchaseMethod with one another");
            }
        }
 /// <inheritdoc/>
 public int CompareTo(object obj)
 {
     if (this is Card)
     {
         Card t = this as Card;
         return(t.CompareTo(obj));
     }
     else if (this is Cash)
     {
         Cash t = this as Cash;
         return(t.CompareTo(obj));
     }
     else if (this is DirectDeposit)
     {
         DirectDeposit t = this as DirectDeposit;
         return(t.CompareTo(obj));
     }
     else
     {
         throw new InvalidCastException("Types are incompatible, can only compare subclasses of PurchaseMethod with one another");
     }
 }
Beispiel #6
0
        /// <summary>
        /// Summarizes the ExpenseFilters set of expenses in SQL, that can be easily added to a where clause.
        /// Sorts by date.
        /// </summary>
        private static void PrepareFilterConstraintCommand(string prefix, SqliteCommand cmd, ExpenseFilter filter)
        {
            // TODO: TEST THIS
            string outstring = string.Empty;

            // add date clause
            outstring += "(Date BETWEEN @mindate AND @maxdate) AND ";
            cmd.Parameters.Add(new SqliteParameter("@mindate", filter.MinDate));
            cmd.Parameters.Add(new SqliteParameter("@maxdate", filter.MaxDate));

            // handle value clause
            outstring += "(Value BETWEEN @minvalue AND @maxvalue)";
            cmd.Parameters.Add(new SqliteParameter("@minvalue", filter.MinValue));
            cmd.Parameters.Add(new SqliteParameter("@maxvalue", filter.MaxValue));

            // handle place clause
            if (filter.Place.Count > 0)
            {
                int i = 0;
                outstring += " AND (Place IN (";
                foreach (var place in filter.Place)
                {
                    outstring += "@place" + i;
                    outstring += (filter.Place.Count - 1 == i) ? string.Empty : ", ";
                    cmd.Parameters.Add(new SqliteParameter("@place" + i, place));
                    ++i;
                }

                outstring += "))";
            }

            // handle tag clause
            if (filter.Tag.Count > 0)
            {
                int i = 0;
                outstring += " AND (";
                foreach (var tag in filter.Tag)
                {
                    outstring += "(Tag LIKE @tag" + i + ")";
                    outstring += (filter.Tag.Count - 1 == i) ? string.Empty : " OR ";
                    cmd.Parameters.Add(new SqliteParameter("@tag" + i, "%" + tag + "%"));
                    ++i;
                }

                outstring += ")";
            }

            // handle keyword clause
            if (filter.Keywords.Count > 0)
            {
                int i = 0;
                outstring += " AND (";
                foreach (var word in filter.Keywords)
                {
                    outstring += "(Notes LIKE @word" + i + ")";
                    outstring += (filter.Keywords.Count - 1 == i) ? string.Empty : " OR ";
                    cmd.Parameters.Add(new SqliteParameter("@word" + i, "%" + word + "%"));
                    ++i;
                }

                outstring += ")";
            }

            // prepare purchasemethod args
            if (filter.Method != null)
            {
                if (filter.Method is Cash)
                {
                    // This is an undesireable solution - ideally would like a way for derived classes to provide this information themselves,
                    // but we dont want that functionality available outside of the engine.
                    Cash c = (Cash)filter.Method;
                    outstring += " AND (Type = @type) AND (Currency = @currency)";
                    cmd.Parameters.Add(new SqliteParameter("@type", (int)EpurchaseMethod.CASH));
                    cmd.Parameters.Add(new SqliteParameter("@currency", c.Currency));
                }
                else if (filter.Method is Card)
                {
                    Card c = (Card)filter.Method;
                    outstring += " AND (Type = @type) AND (Debit = @debit) AND (Provider = @provider) AND (Number = @number) AND (Name = @name)";
                    cmd.Parameters.Add(new SqliteParameter("@type", (int)EpurchaseMethod.CARD));
                    cmd.Parameters.Add(new SqliteParameter("@debit", c.Debit));
                    cmd.Parameters.Add(new SqliteParameter("@provider", c.Provider));
                    cmd.Parameters.Add(new SqliteParameter("@number", c.Number));
                    cmd.Parameters.Add(new SqliteParameter("@name", c.Name));
                }
                else if (filter.Method is DirectDeposit)
                {
                    DirectDeposit d = (DirectDeposit)filter.Method;
                    outstring += " AND (Type = @type) AND (Savings = @savings) AND (Bankname = @bankname) AND (Number = @number) AND (Name = @name)";
                    cmd.Parameters.Add(new SqliteParameter("@type", (int)EpurchaseMethod.DIRECT_DEPOSIT));
                    cmd.Parameters.Add(new SqliteParameter("@savings", d.Savings));
                    cmd.Parameters.Add(new SqliteParameter("@bankname", d.BankName));
                    cmd.Parameters.Add(new SqliteParameter("@number", d.Number));
                    cmd.Parameters.Add(new SqliteParameter("@name", d.Name));
                }
            }

            outstring += " ORDER BY Date ASC;";

            cmd.CommandText = prefix + outstring;
            cmd.Prepare();
        }
Beispiel #7
0
        /// <summary>
        /// Constructs SQL query format for expense in the form: '(cols) VALUES (vals)'. If the expense has a valid id that will also be included.
        /// The command is constructed so that it is parameterized. Defending from SQLInjection attacks.
        /// </summary>
        /// <param name="prefix">The command to perform such as 'INSERT INTO tablename '.</param>
        /// <param name="cmd">The command to populate with parameters and command text.</param>
        /// <param name="expense">Expense object with populated fields.</param>
        private static void PrepareColValueCommand(string prefix, SqliteCommand cmd, Expense expense)
        {
            string cols = string.Empty;
            string vals = string.Empty;

            if (expense.Id > -1)
            {
                cols += "(Id, Value, Date, Place, Tag, Notes, ";
                vals += "VALUES (@id, @value, @date, @place, @tag, @notes, ";
                cmd.Parameters.Add(new SqliteParameter("@id", expense.Id));
                cmd.Parameters.Add(new SqliteParameter("@value", expense.Value));
                cmd.Parameters.Add(new SqliteParameter("@date", expense.Date));
                cmd.Parameters.Add(new SqliteParameter("@place", expense.Place));
                cmd.Parameters.Add(new SqliteParameter("@tag", string.Join(":", expense.Tag)));
                cmd.Parameters.Add(new SqliteParameter("@notes", expense.Notes));
            }
            else
            {
                cols += "(Value, Date, Place, Tag, Notes, ";
                vals += "VALUES (@value, @date, @place, @tag, @notes, ";
                cmd.Parameters.Add(new SqliteParameter("@value", expense.Value));
                cmd.Parameters.Add(new SqliteParameter("@date", expense.Date));
                cmd.Parameters.Add(new SqliteParameter("@place", expense.Place));
                cmd.Parameters.Add(new SqliteParameter("@tag", string.Join(":", expense.Tag)));
                cmd.Parameters.Add(new SqliteParameter("@notes", expense.Notes));
            }

            if (expense.Method is Cash)
            {
                // This is an undesireable solution - ideally would like a way for derived classes to provide this information themselves,
                // but we dont want that functionality available outside of the engine.
                Cash c = (Cash)expense.Method;
                cols += "Type, Currency) ";
                vals += "@type, @currency);";
                cmd.Parameters.Add(new SqliteParameter("@type", (int)EpurchaseMethod.CASH));
                cmd.Parameters.Add(new SqliteParameter("@currency", c.Currency));
            }
            else if (expense.Method is Card)
            {
                Card c = (Card)expense.Method;
                cols += "Type, Debit, Provider, Number, Name) ";
                vals += "@type, @debit, @provider, @number, @name);";
                cmd.Parameters.Add(new SqliteParameter("@type", (int)EpurchaseMethod.CARD));
                cmd.Parameters.Add(new SqliteParameter("@debit", c.Debit));
                cmd.Parameters.Add(new SqliteParameter("@provider", c.Provider));
                cmd.Parameters.Add(new SqliteParameter("@number", c.Number));
                cmd.Parameters.Add(new SqliteParameter("@name", c.Name));
            }
            else if (expense.Method is DirectDeposit)
            {
                DirectDeposit d = (DirectDeposit)expense.Method;
                cols += "Type, Savings, Bankname, Number, Name) ";
                vals += "@type, @savings, @bankname, @number, @name);";
                cmd.Parameters.Add(new SqliteParameter("@type", (int)EpurchaseMethod.DIRECT_DEPOSIT));
                cmd.Parameters.Add(new SqliteParameter("@savings", d.Savings));
                cmd.Parameters.Add(new SqliteParameter("@bankname", d.BankName));
                cmd.Parameters.Add(new SqliteParameter("@number", d.Number));
                cmd.Parameters.Add(new SqliteParameter("@name", d.Name));
            }

            cmd.CommandText = prefix + cols + vals;
            cmd.Prepare();
        }