From dadc34655c3ab961b0b0b94a10eaaba710f0b5e8 Mon Sep 17 00:00:00 2001 From: tpearson Date: Mon, 4 Jul 2011 22:38:03 +0000 Subject: Added kmymoney git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/kmymoney@1239792 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- kmymoney2/mymoney/mymoneyscheduled.h | 695 +++++++++++++++++++++++++++++++++++ 1 file changed, 695 insertions(+) create mode 100644 kmymoney2/mymoney/mymoneyscheduled.h (limited to 'kmymoney2/mymoney/mymoneyscheduled.h') diff --git a/kmymoney2/mymoney/mymoneyscheduled.h b/kmymoney2/mymoney/mymoneyscheduled.h new file mode 100644 index 0000000..46303b2 --- /dev/null +++ b/kmymoney2/mymoney/mymoneyscheduled.h @@ -0,0 +1,695 @@ +/*************************************************************************** + mymoneyscheduled.h + ------------------- + copyright : (C) 2000-2002 by Michael Edwardes + (C) 2007 by Thomas Baumgart + email : mte@users.sourceforge.net + Thomas Baumgart + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#ifndef MYMONEYSCHEDULED_H +#define MYMONEYSCHEDULED_H + +#ifdef HAVE_CONFIG_H +#include +#endif + +// ---------------------------------------------------------------------------- +// QT Includes + +#include +#include +#include + + +// ---------------------------------------------------------------------------- +// Project Includes + +#include "mymoneytransaction.h" +#include "mymoneyaccount.h" +#include +#include + +class MyMoneyStorageANON; + +/** + * @author Michael Edwardes + */ + +/** + * This class represents a schedule. (A series of bills, deposits or + * transfers). + * + * @short A class to represent a schedule. + * @see MyMoneyScheduled + */ +class KMYMONEY_EXPORT MyMoneySchedule : public MyMoneyObject +{ + friend class MyMoneyStorageANON; +public: + /** + * This enum is used to describe all the possible schedule frequencies. + * The special entry, OCCUR_ANY, is used to combine all the other types. + */ + enum occurenceE { OCCUR_ANY=0, OCCUR_ONCE=1, OCCUR_DAILY=2, OCCUR_WEEKLY=4, OCCUR_FORTNIGHTLY=8, + OCCUR_EVERYOTHERWEEK=16, + OCCUR_EVERYHALFMONTH=18, + OCCUR_EVERYTHREEWEEKS=20, + OCCUR_EVERYTHIRTYDAYS=30, + OCCUR_MONTHLY=32, OCCUR_EVERYFOURWEEKS=64, + OCCUR_EVERYEIGHTWEEKS=126, + OCCUR_EVERYOTHERMONTH=128, OCCUR_EVERYTHREEMONTHS=256, + OCCUR_TWICEYEARLY=1024, OCCUR_EVERYOTHERYEAR=2048, OCCUR_QUARTERLY=4096, + OCCUR_EVERYFOURMONTHS=8192, OCCUR_YEARLY=16384 + }; + + /** + * This enum is used to describe the schedule type. + */ + enum typeE { TYPE_ANY=0, TYPE_BILL=1, TYPE_DEPOSIT=2, TYPE_TRANSFER=4, TYPE_LOANPAYMENT=5 }; + + /** + * This enum is used to describe the schedule's payment type. + */ + enum paymentTypeE { STYPE_ANY=0, STYPE_DIRECTDEBIT=1, STYPE_DIRECTDEPOSIT=2, + STYPE_MANUALDEPOSIT=4, STYPE_OTHER=8, + STYPE_WRITECHEQUE=16, + STYPE_STANDINGORDER=32, + STYPE_BANKTRANSFER=64 }; + + /** + * This enum is used by the auto-commit functionality. + * + * Depending upon the value of m_weekendOption the schedule can + * be entered on a different date + **/ + enum weekendOptionE { MoveFriday=0, MoveMonday=1, MoveNothing=2 }; + + /** + * Standard constructor + */ + MyMoneySchedule(); + + /** + * Constructor for initialising the object. + * + * Please note that the optional fields are not set and the transaction + * MUST be set before it can be used. + * + * @a startDate is not used anymore and internally set to QDate() + */ + MyMoneySchedule(const QString& name, typeE type, occurenceE occurence, int occurenceMultiplier, + paymentTypeE paymentType, const QDate& startDate, const QDate& endDate, bool fixed, bool autoEnter); + + MyMoneySchedule(const QDomElement& node); + + MyMoneySchedule(const QString& id, const MyMoneySchedule& right); + + /** + * Standard destructor + */ + ~MyMoneySchedule() {} + + /** + * Simple get method that returns the occurence frequency. + * + * @return occurenceE The instance frequency. + */ + occurenceE occurence(void) const; + + /** + * Simple get method that returns the occurence period + * multiplier and occurence + * + * @return occurenceE The instance period + * + */ + occurenceE occurencePeriod(void) const { return m_occurence; } + + /** + * Simple get method that returns the occurence period multiplier. + * + * @return int The frequency multiplier + */ + int occurenceMultiplier(void) const { return m_occurenceMultiplier; } + + /** + * Simple get method that returns the schedule type. + * + * @return typeE The instance type. + */ + typeE type(void) const { return m_type; } + + /** + * Simple get method that returns the schedule startDate. If + * the schedule has been executed once, the date of the first + * execution is returned. Otherwise, the next due date is + * returned. + * + * @return reference to QDate containing the start date. + */ + const QDate& startDate(void) const; + + /** + * Simple get method that returns the schedule paymentType. + * + * @return paymentTypeE The instance paymentType. + */ + paymentTypeE paymentType(void) const { return m_paymentType; } + + /** + * Simple get method that returns true if the schedule is fixed. + * + * @return bool To indicate whether the instance is fixed. + */ + bool isFixed(void) const { return m_fixed; } + + /** + * Simple get method that returns true if the schedule will end + * at some time. + * + * @return bool Indicates whether the instance will end. + */ + bool willEnd(void) const { return m_endDate.isValid(); } + + /** + * Simple get method that returns the number of transactions remaining. + * + * @return int The number of transactions remaining for the instance. + */ + int transactionsRemaining(void) const; + + /** + * Simple get method that returns the schedule end date. + * + * @return QDate The end date for the instance. + */ + const QDate& endDate(void) const { return m_endDate; } + + /** + * Simple get method that returns true if the transaction should be + * automatically entered into the register. + * + * @return bool Indicates whether the instance will be automatically entered. + */ + bool autoEnter(void) const { return m_autoEnter; } + + /** + * Simple get method that returns the transaction data for the schedule. + * + * @return MyMoneyTransaction The transaction data for the instance. + */ + const MyMoneyTransaction& transaction(void) const { return m_transaction; } + + /** + * Simple method that returns the schedules last payment. If the + * schedule has never been executed, QDate() will be returned. + * + * @return QDate The last payment for the schedule. + */ + const QDate& lastPayment(void) const { return m_lastPayment; } + + /** + * Simple method that returns the next due date for the schedule. + * + * @return reference to QDate containing the next due date. + * + * @note The date returned can represent a value that is past + * a possible end of the schedule. Make sure to consider + * the return value of isFinished() when using the value returned. + */ + const QDate& nextDueDate(void) const; + + /** + * This method adjusts returns the next due date adjusted + * according to the rules specified by the schedule's weekend option. + * + * @return QDate containing the adjusted next due date. If the + * schedule is finished (@sa isFinished()) then the method + * returns an invalid QDate. + * + * @sa weekendOption() + * @sa adjustedDate() + */ + QDate adjustedNextDueDate(void) const; + + /** + * This method adjusts returns the date adjusted according to the + * rules specified by the schedule's weekend option. + * + * @return QDate containing the adjusted date. + */ + QDate adjustedDate(QDate date, weekendOptionE option) const; + + /** + * Get the weekendOption that determines how the schedule check code + * will enter transactions that occur on a weekend. + * + * This not used by MyMoneySchedule but by the support code. + **/ + weekendOptionE weekendOption(void) const { return m_weekendOption; } + + /** + * Simple method that sets the frequency for the schedule. + * + * @param occ The new occurence (frequency). + * @return none + */ + void setOccurence(occurenceE occ); + + /** + * Simple method that sets the schedule period + * + * @param occ The new occurence period (frequency) + * @return none + */ + void setOccurencePeriod(occurenceE occ); + + /** + * Simple method that sets the frequency multiplier for the schedule. + * + * @param occmultiplier The new occurence (frequency) multiplier. + * @return none + */ + void setOccurenceMultiplier(int occmultiplier); + + /** + * Simple method that sets the type for the schedule. + * + * @param type The new type. + * @return none + */ + void setType(typeE type); + + /** + * Simple method that sets the start date for the schedule. + * + * @param date The new start date. + * @return none + */ + void setStartDate(const QDate& date); + + /** + * Simple method that sets the payment type for the schedule. + * + * @param type The new payment type. + * @return none + */ + void setPaymentType(paymentTypeE type); + + /** + * Simple method to set whether the schedule is fixed or not. + * + * @param fixed boolean to indicate whether the instance is fixed. + * @return none + */ + void setFixed(bool fixed); + + /** + * Simple method that sets the transaction for the schedule. + * The transaction must have a valid postDate set, otherwise + * it will not be accepted. + * + * @param transaction The new transaction. + * @return none + */ + void setTransaction(const MyMoneyTransaction& transaction); + + /** + * Simple set method to set the end date for the schedule. + * + * @param date The new end date. + * @return none + */ + void setEndDate(const QDate& date); + + /** + * Simple set method to set whether this transaction should be automatically + * entered into the journal whenever it is due. + * + * @param autoenter boolean to indicate whether we need to automatically + * enter the transaction. + * @return none + */ + void setAutoEnter(bool autoenter); + + /** + * Simple set method to set the schedule's next payment date. + * + * @param date The next payment date. + * @return none + */ + void setNextDueDate(const QDate& date); + + /** + * Simple set method to set the schedule's last payment. If + * this method is called for the first time on the object, + * the @a m_startDate member will be set to @a date as well. + * + * This method should be called whenever a schedule is entered or skipped. + * + * @param date The last payment date. + * @return none + */ + void setLastPayment(const QDate& date); + + /** + * Set the weekendOption that determines how the schedule check code + * will enter transactions that occur on a weekend. The following values + * are valid: + * + * - MoveNothing: don't modify date + * - MoveFriday: modify the date to the previous friday + * - MoveMonday: modify the date to the following monday + * + * If an invalid option is given, the option is set to MoveNothing. + * + * @param option See list in description + * @return none + * + * @note This not used by MyMoneySchedule but by the support code. + **/ + void setWeekendOption(const weekendOptionE option); + + /** + * Validates the schedule instance. + * + * Makes sure the paymentType matches the type and that the required + * fields have been set. + * + * @param id_check if @p true, the method will check for an empty id. + * if @p false, this check is skipped. Default is @p true. + * + * @return If this method returns, all checks are passed. Otherwise, + * it will throw a MyMoneyException object. + * + * @exception MyMoneyException with detailed error information is thrown + * in case of failure of any check. + */ + void validate(bool id_check=true) const; + + /** + * Calculates the date of the next payment adjusted according to the + * rules specified by the schedule's weekend option. + * + * @param refDate The reference date from which the next payment + * date will be calculated (defaults to current date) + * + * @return QDate The adjusted date the next payment is due. This date is + * always past @a refDate. In case of an error or if there + * are no more payments then an empty/invalid QDate() will + * be returned. + */ + QDate adjustedNextPayment(const QDate& refDate = QDate::currentDate()) const; + + /** + * Calculates the date of the next payment. + * + * @param refDate The reference date from which the next payment + * date will be calculated (defaults to current date) + * + * @return QDate The date the next payment is due. This date is + * always past @a refDate. In case of an error or + * if there is no more payments then an empty/invalid QDate() + * will be returned. + */ + QDate nextPayment(const QDate& refDate = QDate::currentDate()) const; + + /** + * Calculates the dates of the payment over a certain period of time. + * + * An empty list is returned for no payments or error. + * + * @param startDate The start date for the range calculations + * @param endDate The end date for the range calculations. + * @return QValueList The dates on which the payments are due. + */ + QValueList paymentDates(const QDate& startDate, const QDate& endDate) const; + + /** + * Returns the instances name + * + * @return The name + */ + const QString& name(void) const { return m_name; } + + /** + * Changes the instance name + * + * @param nm The new name + * @return none + */ + void setName(const QString& nm); + + bool operator ==(const MyMoneySchedule& right) const; + bool operator !=(const MyMoneySchedule& right) const { return ! operator==(right); } + + bool operator <(const MyMoneySchedule& right) const; + + MyMoneyAccount account(int cnt = 1) const; + MyMoneyAccount transferAccount(void) const { return account(2); }; + QDate dateAfter(int transactions) const; + + bool isOverdue() const; + bool isFinished() const; + bool hasRecordedPayment(const QDate&) const; + void recordPayment(const QDate&); + QValueList recordedPayments(void) const { return m_recordedPayments; } + + void writeXML(QDomDocument& document, QDomElement& parent) const; + + /** + * This method checks if a reference to the given object exists. It returns, + * a @p true if the object is referencing the one requested by the + * parameter @p id. If it does not, this method returns @p false. + * + * @param id id of the object to be checked for references + * @retval true This object references object with id @p id. + * @retval false This object does not reference the object with id @p id. + */ + virtual bool hasReferenceTo(const QString& id) const; + + /** + * Returns the human-readable format of Schedule's occurence + * + * @return QString representing the human readable format + */ + QString occurenceToString() const; + + /** + * This method is used to convert the occurence type from it's + * internal representation into a human readable format. + * + * @param type numerical representation of the MyMoneySchedule + * occurence type + * + * @return QString representing the human readable format + */ + static QString occurenceToString(occurenceE type); + + /** + * This method is used to convert a multiplier and base occurence type + * from it's internal representation into a human readable format. + * When multiplier * occurence is equivalent to a simple occurence + * the method returns the same as occurenceToString of the simple occurence + * + * @param mult occurence multiplier + * @param type occurence period + * + * @return QString representing the human readable format + */ + static QString occurenceToString(int mult, occurenceE type); + + /** + * This method is used to convert an occurence period from + * it's internal representation into a human-readable format. + * + * @param type numerical representation of the MyMoneySchedule + * occurence type + * + * @return QString representing the human readable format + */ + static QString occurencePeriodToString(occurenceE type); + + /** + * This method is used to convert the payment type from it's + * internal representation into a human readable format. + * + * @param paymentType numerical representation of the MyMoneySchedule + * payment type + * + * @return QString representing the human readable format + */ + static QString paymentMethodToString(MyMoneySchedule::paymentTypeE paymentType); + + /** + * This method is used to convert the schedule weekend option from it's + * internal representation into a human readable format. + * + * @param weekendOption numerical representation of the MyMoneySchedule + * weekend option + * + * @return QString representing the human readable format + */ + static QString weekendOptionToString(MyMoneySchedule::weekendOptionE weekendOption); + + /** + * This method is used to convert the schedule type from it's + * internal representation into a human readable format. + * + * @param type numerical representation of the MyMoneySchedule + * schedule type + * + * @return QString representing the human readable format + */ + static QString scheduleTypeToString(MyMoneySchedule::typeE type); + + int variation(void) const; + void setVariation(int var); + + /** + * + * Convert an occurence to the maximum number of events possible during a single + * calendar year. + * A fortnight is treated as 15 days. + * + * @param occurence The occurence + * + * @return int Number of days between events + */ + static int eventsPerYear(MyMoneySchedule::occurenceE occurence); + + /** + * + * Convert an occurence to the number of days between events + * Treats a month as 30 days. + * Treats a fortnight as 15 days. + * + * @param occurence The occurence + * + * @return int Number of days between events + */ + static int daysBetweenEvents(MyMoneySchedule::occurenceE occurence); + + /** + * Helper method to convert simple occurence to compound occurence + multiplier + * + * @param multiplier Returned by reference. Adjusted multiplier + * @param occurence Returned by reference. Occurence type + */ + static void simpleToCompoundOccurence(int& multiplier,occurenceE& occurence); + + /** + * Helper method to convert compound occurence + multiplier to simple occurence + * + * @param multiplier Returned by reference. Adjusted multiplier + * @param occurence Returned by reference. Occurence type + */ + static void compoundToSimpleOccurence(int& multiplier,occurenceE& occurence); + + /** + * This method is used to convert the occurence type from the + * human readable form into it's internal representation. + * + * @param text reference to QString representing the human readable format + * @return numerical representation of the occurence + */ + static MyMoneySchedule::occurenceE stringToOccurence(const QString& text); + +private: + /** + * This method forces the day of the passed @p date to + * be the day of the start date of this schedule kept + * in m_startDate. It is internally used when calculating + * the payment dates over several periods. + * + * @param date reference to QDate object to be checked and adjusted + */ + void fixDate(QDate& date) const; + + /** + * Simple method that sets the transaction for the schedule. + * The transaction must have a valid postDate set, otherwise + * it will not be accepted. This test is bypassed, if @a noDateCheck + * is set to true + * + * @param transaction The new transaction. + * @param noDateCheck if @a true, the date check is bypassed + * @return none + */ + void setTransaction(const MyMoneyTransaction& transaction, bool noDateCheck); + + /** + * This method adds a number of Half Months to the given Date. + * This is used for OCCUR_EVERYHALFMONTH occurences. + * The addition uses the following rules to add a half month: + * Day 1-13: add 15 days + * Day 14: add 15 days (except February: the last day of the month) + * Day 15: last day of the month + * Day 16-29 (not last day in February): subtract 15 days and add 1 month + * 30 and last day: 15th of next month + * + * This calculation pairs days 1 to 12 with 16 to 27. + * Day 15 is paired with the last day of every month. + * Repeated addition has issues in the following cases: + * - Days 13 to 14 are paired with 28 to 29 until addition hits the last day of February + * after which the (15,last) pair will be used. + * - Addition from Day 30 leads immediately to the (15th,last) day pair. + * + * @param date The date + * @param mult The number of half months to add. Default is 1. + * + * @return QDate date with mult half months added + */ + QDate addHalfMonths( QDate date, int mult = 1 ) const; + +private: + /// Its occurence + occurenceE m_occurence; + + /// Its occurence multiplier + int m_occurenceMultiplier; + + /// Its type + typeE m_type; + + /// The date the schedule commences + QDate m_startDate; + + /// The payment type + paymentTypeE m_paymentType; + + /// Can the amount vary + bool m_fixed; + + /// The, possibly estimated, amount plus all other relevant details + MyMoneyTransaction m_transaction; + + /// The last transaction date if the schedule does end at a fixed date + QDate m_endDate; + + /// Enter the transaction into the register automatically + bool m_autoEnter; + + /// Internal date used for calculations + QDate m_lastPayment; + + /// The name + QString m_name; + + /// The recorded payments + QValueList m_recordedPayments; + + /// The weekend option + weekendOptionE m_weekendOption; +}; +#endif -- cgit v1.2.3