BBCash design
Smithcourt Drive,
Little Stoke,
BS34 8NA.
andy@arcsoft.org.uk
ArcSoft
BBCash Design
An open source personal finance manager.
This page unintentionally blank
Table of Contents
1 Introduction 3
2 Design 5
2.1 Actors: 5
2.2 Use Cases: 5
2.2.i Use cases for A Person: 5
2.2.ii Formal Use Case Descriptions: 5
3 The Domain Model 7
3.1 Systems Analysis 7
3.2 Application Analysis 7
3.3 Domain Analysis 7
4 Class Design 8
4.1 Classes in this system are listed below in alphabetical order: 8
4.1.i AccountInfo 8
4.1.ii AcctCategoryInfo 9
4.1.iii Address 10
4.1.iv CurrencyConvRate 11
4.1.v CurrencyInfo 12
4.1.vi DataEngine 13
4.1.vii EMailAddr 14
4.1.viii FinancialInstitution 15
4.1.ix PhoneNum 16
4.1.x RecurringTransactionInfo 17
4.1.xi Report 18
4.1.xii TransactionInfo 19
4.1.xiii TransCategoryInfo 20
4.1.xiv WebSiteAddr 21
5 UML Class Diagram 22
6 User interface Design 23
6.1 List of screens in the system: 23
6.2 Screenshots: 23
6.2.i Main Account List: 23
6.2.ii Account transaction list: 24
6.2.iii Acctount Category list: 24
6.2.iv Add/Edit Account: 25
6.2.v Add/Edit Transaction: 25
6.2.vi Add/Edit Account Category: 25
7 Steps the program will go through 26
8 Testing the system 27
9 References 28
10 Miscellaneous info 29
11 Thanks 30
12 ToDo List 31
13 Wish List 32
This page unintentionally blank
This document describes the design of the JMoney personal finance system.
This page unintentionally blank
First of all we need to identify who will use the system (we call these objects Actors). The two actors that I have identified so far are:
A Person.
Next, we need to specify how these actors will use the system. To do this we make a list of 'use cases'.
Open an account
Close an account
Make a transaction
Reconcile statement
Display reports
Download transactions from online bank
Now that we have a list of use cases, we should formalise what happens when each one is executed.
Name:
open an account
Description:
Allows a person to open a new account and set up it inital balance and a credit limit.
Preconditions:
None
Postconditions:
The account will exist in the system
Scenario1:
The person opens a new account and adds it to the system.
Name:
close an account
Description:
Allows a person to close an account that is no longer used.
Preconditions:
The account must exist in the system.
Postconditions:
The account is deleted along with all transactions from that account.
Scenario1:
The person moves bank and needs to close an account.
Name:
make a transaction
Description:
records a transaction made by the person..
Preconditions:
The account that the transaction is performed against must exist in the system.
Postconditions:
The account has the new transaction in it's list of transactions.
Scenario1:
The person goes to an automated teller machine and draws out some money.
Scenario2:
The person transfers some money to from one account to another (e.g. checking to savings).
Name:
reconcile statement
Description:
Allows a person to check that they have entered all of the transactions into the system that the bank has a record of. It also allows a person to check that no erronous transactions have appeared on their statement.
Preconditions:
the account to be reconciled must exist in the system.
Postconditions:
Scenario1:
A statement arrives for the account.
Name:
report on financial status
Description:
Allows a person to review their past/current and/or future financial status.
Preconditions:
None.
Postconditions:
Scenario1:
The coach accepts a new athlete to train. He need to enter their details into the system so that the athlete can record their workouts.
Name:
download transactions from online bank
Description:
Allows a person to use an online bank to download a list of transactions and read them into the system.
Preconditions:
None.
Postconditions:
Scenario1:
The person downloads a list of transactions from thier bank and imports them into the system. During the import process the system will check for duplicate transactions.
(page 62)
This stage of the analysis is used to define any hardware that might be required, and the environment that the system will be used in.
(page 64)
This is where the end user sets down any specific needs about the system.
The system is expected to be used by a non-technical audience.
Must be portable. The system should be easily ported to new platforms.
Must be extensible. This is to allow functionality to be added later that I have not thought about here.
All amounts will be stored in pence, and displayed in pounds and pence. This makes any calculations easier.
Milestones in the project lifetime:
1. This document
2. Design Use cases
3. Design UI look and feel
4. Design Plugin architecture
5. Design Engine classes
6. Design UI classes
7. Design Filesystem classes
(page 69)
Here we should make a list of all the 'objects' in the domain that the system will be used in. We would describe their attributes and capabilities.
Some objects in the domain are:
Online Bank – download statements
This page unintentionally blank
Basic account information
Private Data Members:
int m_id
String m_accountNumber
long m_balance
int m_categoryId
long m_creditLimit
Date m_date
String m_description
FinancialInstitution m_institueDetails
String m_name
int m_parentId – used for account hierachies
List m_transactions
Public Data Members:
Private Member Functions:
Public Member Functions:
int getId() -
void setAccountNum(String)
String getAccountNum()
void setBalance(long)
long getBalance()
void setCategoryId(int)
int getCategoryId()
void setCreditLimit(long)
long getCreditLimit()
void setDate(Date)
Date getDate()
void setDescription(String)
String getDescription()
void setInstitute(FinancialInstitution)
FinancialInstitution getInstitute()
void setName(String)
String getName()
void setParentId(int)
int getParentId()
TransactionInfo createTransaction()
TransactionInfo getTransactionAt(int)
TransactionInfo getTransactionWithId(long)
int getNumTransactions()
This object stores information for categorising financial accounts.
Private Data Members:
int m_id
String m_name
String m_note
int m_parentId
String m_type
Public Data Members:
Private Member Functions:
Public Member Functions:
int getId()
void setName(String)
String getName()
void setNote(String)
String getNote()
void setParentId(int)
int getParentId()
void setType(String)
String getType()
This object stores an address
Private Data Members:
Vector m_addressLines
Public Data Members:
Private Member Functions:
Public Member Functions:
String createAddressLine()
String getAddressLineAt(int)
int getNumAddressLines()
This object stores an address
Private Data Members:
int m_fromCurrencyId
int m_toCurrencyId
long m_convRate
Date m_dateCreated
Public Data Members:
Private Member Functions:
Public Member Functions:
void setFromId(int)
int getFromId()
void setToId(int)
int getToId()
void setConvRate(long)
long getConvRate()
void setDate(Date)
Date getName()
This object stores an address
Private Data Members:
int m_id
String m_name
String m_symbol
Public Data Members:
Private Member Functions:
Public Member Functions:
int getId()
void setName(String)
String getName()
void setSymbol(String)
String getSymbol()
Stores all of the information in the system.
This class is responsible for making sure that all data is written out to storage before the system shuts down.
We also want to maintain data integrity.
Uses the following classes.
AccountInfo
CategoryInfo
RecurringTransactionInfo
CurrencyInfo
Private Data Members:
List of Accounts
List of AcctCategories
List of TransCategories
List of Recurring transactions
Public Data Members:
Private Member Functions:
Public Member Functions:
createAccount() – create a new account.
AccountInfo createAccount()
AccountInfo getAccountAt(int)
AccountInfo getAccountWithId(long)
int getNumAccounts()
void deleteAccount(int) – delete an account from the system. All of the account's transactions will be deleted as well.
AcctCategoryInfo createAcctCategory()
AcctCategoryInfo getAcctCategoryAt(int)
AcctCategoryInfo getAcctCategoryWithId(long)
int getNumAcctCategories()
void deleteAcctCategory(int)
TransCategoryInfo createTransCategory()
TransCategoryInfo getTransCategoryAt(int)
TransCategoryInfo getTransCategoryWithId(long)
int getNumTransCategories()
void deleteTransCategory(int)
RecurringTransactionInfo createTransaction()
RecurringTransactionInfo getTransactionAt(int)
RecurringTransactionInfo getTransactionWithId(long)
int getNumTransactions()
void deleteRecurringTransaction(int)
void saveFile()
void readFile()
void saveFileText()
void readFileText()
void saveFileQIF()
void readFileQIF()
void saveFileCSV()
void readFileCSV()
void saveFilePdb()
void readFilePdb()
void saveFileGnuCash()
void readFileGnuCash()
Stores an email address.
Used by class:
FinancialInstitution
Private Data Members:
String m_userName
String m_hostName
String m_domainName
Public Data Members:
Private Member Functions:
Public Member Functions:
void setUserName(String aUserName)
String getUserName()
void setHostName(String aHostName)
String getHostName()
void setDomainName(String aDomainName)
String getDomainName()
This object facilitates the loading and saving of data into a "Comma Separated Value" format file
Private Data Members:
String m_filename
boolean m_moreData
String m_fieldSeperator
int m_currColNum
int m_currLineNum
Public Data Members:
Private Member Functions:
Public Member Functions:
FileCSV(filename, seperator)
boolean initialise()
String readCol()
String readLine()
Info about a bank, building society etc....
Private Data Members:
String m_sortCode – this is unique for each institution
String m_name
Address m_address
WebSiteAddr m_website
EMailAddr m_emailContact
PhoneNum m_phoneNumber
Public Data Members:
Private Member Functions:
Public Member Functions:
String getSortCode()
void setName(String)
String getName()
void setAddress(Address)
Address getAddress()
void setWebSiteAddr(WebSiteAddr)
WebSiteAddr getWebSiteAddr()
void setEMailAddr(EMailAddr)
EMailAddr getEMailAddr()
void setPhoneNum(PhoneNum)
PhoneNum getPhoneNum()
Stores a phone number.
Used by class:
FinancialInstitution
Private Data Members:
int countryCode
int areaCode
int phoneNumber
Public Data Members:
Private Member Functions:
Public Member Functions:
void setCountryCode(int aCountryCode)
int getCountryCode()
void setAreaCode(int anAreaCode)
int getAreaCode()
void setPhoneNumber(int aPhoneNumber)
int getPhoneNumber()
The extra information about each recurring transaction.
Private Data Members:
Date m_startDate
Date m_stopDate
Date m_nextDate
int m_period - This is the period between payments (1=daily, 2=weekly, 3=monthly, 4=annually)
int m_dayOfWeek
int m_dayOfMonth
Date m_dayOfYear
Public Data Members:
Private Member Functions:
Public Member Functions:
void setStartDate(Date)
Date getStartDate()
void setStopDate(Date)
Date getStopDate()
void setNextDate(Date)
Date getNextDate()
void setPeriod(int)
int getPeriod()
void setDayOfWeek(int)
int getDayOfWeek()
void setDayOfMonth(int)
int getDayOfMonth()
void setDayOfYear(Date)
Date getDayOfYear()
Formats information from the DataEngine for reporting. May output HTML/XML for viewing/printing in a browser window.
Private Data Members:
Date dateReportGenerated
Public Data Members:
Private Member Functions:
Public Member Functions:
Date getDateGenerated()
The basic information about each transaction.
Private Data Members:
int m_id
int m_parentId
Date m_date
String m_payee
long m_amount
int m_categoryId
int m_sourceAccountId
int m_destAccountId
String m_note
String m_chequeNum
int m_currencyId
long m_currencyAmount
Public Data Members:
Private Member Functions:
Public Member Functions:
int getId() -
void setParentId(int)
int getParentId()
void setDate(Date)
Date getDate()
void setPayee(String)
String getPayee()
void setAmount(long)
long getAmount()
void setCategoryId(int)
int getCategoryId()
void setSourceAccountId(int)
int getSourceAccountId()
void setDestAccountId(int)
int getDestAccountId()
void setNote(String)
String getNote()
void setChequeNum(String)
String getChequeNum()
void setCurrencyId(int)
int getCurrencyId()
void setCurrencyAmount(long)
long getCurrencyAmount()
The extra information about transaction categories.
Private Data Members:
int m_id
String m_name
String m_note
int m_parentId
String m_type
Public Data Members:
Private Member Functions:
Public Member Functions:
int getId()
void setName(String)
String getName()
void setNote(String)
String getNote()
void setParentId(int)
int getParentId()
void setType(String)
String getType()
Stores a web site address.
Used by class:
Address
Private Data Members:
String m_topLevelDomain - The .uk, .com, .org etc.. part of the address
String m_secondLevelDomain - The .co in .co.uk
String m_hostName - the www.arcsoft from www.arcsoft.org.uk
Public Data Members:
Private Member Functions:
Public Member Functions:
void setHostName(String aString)
String getHostName()
void setTLDomainName(String aString)
String getTLDomainName()
void setSLDomainName(String aString)
String getSLDomainName()
This page unintentionally blank
This will be drawn in dia or thorn or argouml.
This page unintentionally blank
The UI will be an "MDI" type which means that there will be a main window inside of which will appear other windows.
I will create a flow diagram of the screen order in dia.
Main account list - main screen displayed at startup; lists the accounts in the system
Account transaction list - from Main account list
AcctCategory list - from Main account list
TransCategory list - from Main account list
Add/Edit Account - from Main account list
Add/Edit Transaction - from Account transaction list
Add/Edit category - from Main account list and Category list
1) User start system up (double clicks on icon etc…)
2) System display's an introduction message while it initialises itself in the background
3) The system will
check wether it has been executed before.
If this is the first
execution then the system will create empty databases.
If the
system has been run before then it will read in any data from the
current database.
6) The main screen will be displayed, this shows a list of accounts.
Design Add/Edit transaction dialog
Design Add/Edit account category dialog
Design Add/Edit transaction category dialog
Add in “in cell” editing into tables
Page
-