- adding a version of bob.jar with StringBuilder instead of StringBuffer
[Bookkeeping.git] / TODO
blob630241e15f05426d2971b8f88bb61b8d51f99819
1 TODO 'Bookkeeping'
3 1 > synchronise database access 
4         [OK] Working SingleThreadModel servlet. 
5         [OK] Later make the servlet requests threaded and read/write lock on the DB code. 
6                 Also the SingleThreadModel is deprecated to be discontinued after 2.4. 
7         
8         - test to ensure that simultaneous servlet updates are executed 1 at a time; 
9         which testbench to use that tests mutiple threads and performance? 
10                 
11                 * cactus; http://jakarta.apache.org/cactus
12                 - give initial state; 'bookkeeping.2.system.xml' 
13                 - give 2 data to add / update 
14                         - system should fill in entry and debit/credit ids. 
15                         - client must specify the correct journalid in the entry; an incorrect journalid should give an error 
16                         <journal:entry id="" entrynum="" state="" journalid="" date="">
17                         <account:debit id="" amount="50.00" entryid="" accountid="1" account="office equipment"/>
18                         <account:credit id="" amount="50.00" entryid="" accountid="3" account="bank"/>
19                         </journal:entry>
20                         
21                         <journal:entry id="" entrynum="" state="" journalid="" date="">
22                         <account:debit id="" amount="70.00" entryid="" accountid="1" account="office equipment"/>
23                         <account:credit id="" amount="70.00" entryid="1" accountid="3" account="bank"/>
24                         </journal:entry>
25                 
26                 - ensure BookkeepingSystem MODEL is reloaded
28 4 > ** code for collecting monies 
29         - from donation, paid accounts
30         - via PayPal / Credit Cards (Authorize.net)
31         - design data structure / code that understands the difference between paid and unpaid accounts 
33 5 > What functionalities go with a paid account 
34         - income statements 
35         - balance sheets 
36         
37         - ability to import / export data 
38         - import / export <==> oe.quickbooks.com, mint.com, freshbooks.com
39         
40         - bank reconciliation (bank, etrade, visa, american express)
41         - bill reconciliation 
42         
43         - create / track invoices 
44         - manage payroll 
45 6 >     Attach data that represent  physical records of an entry - images, pdfs , doc, rtf 
46 7 >     Schedule a time for the application to record an expense 
50 >>>>>>>>>>>>>>>>>>>> MARKETING
51 -- selling 
52         - define product; ( easily organise your financial records from anywhere in the world ) 
53         
54         - define market for online bookkeeping ( small businesses, entrepreneurs, accounting & bookkeeping firms ); 
55                 - what bookkeeping problems are these clients having? ( forums: www.proseries.com )
56                 - what would make thier life easier? 
57                 ** find accountants (accounting firm) to use / improve the product 
58                 
59         - define competition ( Quickbooks Online Edition, www.netsuite.com, ... ); 
60                 - where and how they are selling ( boring and tedious web ads ) 
61                 - check out bookkeeping software
62                         http://freshmeat.net/projects/dolphacct/
64                 -> Quickbooks Online Edition
65                 -> netsuite.com 
66                 -> mint.com 
67                 -> freshbooks.com
68                 
69         - pricing; 
70                 - free basic account; 5 accounts and 1 journal 
71                 - $5 / month for unlimited accounts & journals 
72         
73         - promoting
74                 - launch / presskit 
75                 - tools to tell friends 
76                 - consult with a good marketing person 
79 >>>>>>>>>>>>>>>>>>>> LATER 
80         
81 -- XQuery / XPath
82         ** commit semantics are a mess, use XPath / XQuery to find, save XML data 
84 -- put 'notes' into the entry and debit/credit tokens 
85                 var/value 
87 -- XQuery script to create XML:DB collection structure 
89 -- loaded bob can update/augment data structure by calling a load method on itself (will require some redesisgn) 
92 ** in 'bkeeping' ExpressionVisitor put add and remove in commands (now using the visitors) 
93 ** in FindCommand, use the new com.interrupt.bookkeeping.cc.bkell.command.FindVisitor for a list of possible results 
95 -- unit tests for save, load, delete, update 
96 -- refactor 
97         i. BookkeepingServlet 
98         ii. TestPersistence.testBobRetrieve
100         
101 -- 'Bob' support for xpath, xpointer, xquery, xupdate 
103 -- DATA EXCHANGE 
104     -> exporting to excel is the best way; try ( http://jakarta.apache.org/poi/ )
105     -> other major accounting softw.:
106         [OK] QuickBooks, (et. al. accounting softw.); 
107             * import/export excel
108             - uses a bloated, proprietary file format
109         [OK] MYOB; 
110             * import/export excel
111         [x] Peachtree Bookkeeping
112             - doesn't import data
113         [OK] Simply Accounting; 
114             * export excel
116 -- WORKFLOW; write a simple workflow system
117     ? based on PNML (Petri Net Markup Language)
118     [x] 'bossa' does not enough documentation
119     - needed for when objects should be: 
120     1) persisted when a transaction is CLOSED
121     2) interact with UI
123     [OK] write up a simple petri net diagram for
124         i) processing transaction (after adding many journal entries)
126     [x] rakiura-jfern-3.0.0
127         - designed to accomodate already built petri-net engines
128     
129     Bossa can read the PNML files created by the Petri Net Kernel editor. 
130         bossa-pnk-0.1.tar.gz
132 -- have a 'fitnesse' wiki to track
133         - functionality
134         - project velocity
136 >>>>>>>>>>>>>>>>>>>> SELLING
137         
138 Double-Entry Bookkeeping, meaning debit and credit Journal entries. This means that the software can track debit / credit accounts. So the user can use 'Bookkeeping' to maintain income, expense, asset, liability and capital accounts. 
139         
140         
141     - Platform Independent; Windows, Linux, OS X 
142     
143         - Adding Journal Entries 
144     - Reversing Journal entries
145     - Deleting Journal entries
146     - Easier Finding / Viewing / Ordering of Journal entries
147         
148         - Preparing Taxes ( Canada, US, UK ) 
149         
150         
151     - Exchange data with 
152         QuickBooks, ( .QIF file format )
153         Quicken ( .IIF file format )
154         MYOB
155         Peachtree Bookkeeping
156         Simply Accounting
157         [NEW; all linux packages] SQL Ledger(http://www.sql-ledger.org/), GNUCash(), KMyMoney2() 
158         
159         
160     - generating general ledgers for configured time periods ( Fiscal year )
161     - generating income and balance statements
162     - generating tax statements at the end of the tax year.
163     
164     - Bank Reconciliation
165     - Trial Balances
166     - Year End
167         
168     ? invoice printer
169     ? cheque printer
170     
172 >>>>>>>>>>>>>>>>>>>> ISSUES
173         
174         - when closing an entry through a <transaction/>, there is currently not a way to guarantee that
175           each entry balances, before the transaction adds those entries to the corresponding <journal/>
176         
177           
178     - how to exchange data with QuickBooks, (et. al. accounting softw.)
179         -> All transactions are easily exportable to other programs as standard tab-delimited text files
180         
181     - how to do Bank Reconciliation
182     
183     - can Flash be the desktop UI? (can laszlo UI generate desktop windows)
184     
185     - generating general ledgers for configured time periods
186     - generating income and balance statements
187     - generating tax statements at the end of the tax year.
188     
189     - sort journal entries by... date, alphabet, etc
190     - reversing entries
191         - or deleting entries
192     
193     * see also 'bookkeeping.xml' and 'system.xml' for notes 
194     system architecture
195     * initially, there is 1 general journal
197         ** had to build a custom version of sablecc-anttask to get it to generate my classes
198         
199     
200     
201 >>>>>>>>>>>>>>>>>>>> TECHNOLOGY lookups
202 [OK] persistence
203 [x] JDO vs. Hibernate vs. XML Database
204 Neither JDO, nor Hibernate provide full native XML persistence. However, hibernate has a feature that aims to map xml documents to DB data. 
206         [x] Hibernate (for Obj/DB persistence)
207         [x] JDO
208         [OK] XML Database
209             http://www.rpbourret.com/xml/XMLAndDatabases.htm
210             http://www.rpbourret.com/xml/XMLDatabaseProds.htm#native
211             http://www.cse.iitk.ac.in/report-repository/2004/Y1043.pdf
212             XML:DB; native xml database ()
213             [OK] eXist 
214                 - http://exist.sourceforge.net/api/index.html
215             XQuery (http://www.w3.org/XML/Query)
216             XPath ()
217     [OK] workflow (to handle states of objects throughout different types of a process)
218         Bossa
220     [x] searching
221         [x] Lucene (for text search)
222         
223     [OK]commons-cli
224     [OK]velocity
225     [OK]javafind
228 >>>>>>>>>>>>>>>>>>>> COMPLETED 
229 [DONE] idgenerator 
230     - try (java.rmi.dgc.VMID)
231 [DONE] debits and credits for all accounts
232 [DONE] list of accounts are always maintained by the system and persisted
233 [DONE] generate 'objectid'; for example, 'entrynum' for each entry
234 [DONE] each object in the system should have an id
235     
236     [DONE] double entry bookkeeping
237         [DONE] debits equal credits for 1 transaction
238         [DONE] each debit/credit goes to an account
239             ** 'CloseAction' puts into correct account. make this
240             [DONE] make transaction/entry close() process separate from class (visitor)
241             [DONE] create 'Accounts' object/subsystem
243         [DONE] all transactions balance 
244         [DONE] all accounts balance after transaction
245             [NOTE] a 'CLOSE' state
246             ** create 'Balance' objects
248     [DONE] ACCOUNT types
249         [DONE] income, expense, asset, liability and capital accounts
250         [later] a banking institution's books
251 [OK] find MAILING LIST to introduce bookkeeping; xml-dev (http://lists.xml.org/archives/xml-dev/)
253 [x] debits / credits should be in 1 place. 
254     [OK] Leave them in <journal:entry/> and <account:account/> looks through all journals
255         [x] after time jounal entry list will get big
256     [OK] Keep <journal:entry/> <account:account/> division
257         [x] must constantly resolve debits / credits in <account:account/> with <journal:entry/>
258     
260 [OK] a UI
261     -> Laszlo (www.laszlosystems.org); can deploy laszlo Java servlet engine
262     -> XUL (http://www.mozilla.org/projects/xul/)
263     - view journal entries
264     - sort journal entries
265     
266     [OK] make debit/credit input component
267     [OK] make + / - buttons
268     [OK] make cancel / save buttons
269     [OK] open / close operations & Window workflow; incl. dbl-click & window popup
270     - add / remove operations (addNode,deleteNode)
271         - on Accounts, Journals & Entries
272         
273         ... howto
274         -> generate IDs
275         -> maintain 'namespace'
276         -> generate 'entrynums'
277         -> match date format w/ Java date format
278         
279     - grid vertical & horizontal bounding
280     - preselect 'account' drop down (Account, Entry)
281     - put Application into 'Jetty'
282     - cleanup hardcoded values
283     
285 [OK] native XML DATABASE 
286     [x] Hibernate
287         - xml / relational mapping too messy
288     [x] JDO
289         - default implementation does not map to xml datastore
290     [x] Hibernate [native xml]
291     [x] JDO [native xml]
292     
293     [x] Prevaler; object Prevalence for Java
294     [OK] eXist DB
295         - xmldb:exist://localhost:8080/exist/xmlrpc
296         
297         [OK] need examples of <journal:entry />
298         [OK] make a java program to connects to database
299         [OK] adding / retrieving xml from DB
300         
301         [OK] adding journal entries
302         [OK] retrieving journal entries
303         [OK] updating entries ( affected by any reversals )
304 4) reversing entries
305 5) deleting entries
306 6) updating account data ( affected by <journal:entry /> )
308         [OK] ?? How to maintain the relationships between xml nodes
309         [OK] don't maintain relationships; let application do that.
310             -> just store <xml/>
311         
312         [OK] ?? Should journal entries be 
313         [OK] separate documents
314             ii) all in 1 document
315         
316         [OK] ?? is an XML:DB collection also a document
317             - no
319 [DONE] ANT
320     [DONE] only 'run-gen' if there is no created files
321     [DONE] fix classpath referencing
323 [DONE] figure out a way to have an implicit way to set 'counterWeight' ( bookkeeping.system.xml )
325 [DONE] split -def / -sys (Bob)
326 [DONE] need a cleaner way to access handler input values ( Bob; bob.system.xml )
328 [DONE] create Users, Authentication & Authorization
331 [DONE] -- FEATURES
332     [OK] close an entry
333     [OK] close a set of entries ( transaction )
334     
335     [OK] remove an entry
336     [OK] reverse an entry
337     
338     [OK] find entry
339         [OK] by id 
340                 [OK] by a date  // MM/dd/yyyy HH:mm:ss z
341                 
342         [OK] list entry 
343                 [OK] before and after date 
344         
345         - add / find / remove <Journals/> 
346         - add / find / remove <Accounts/> 
349 [DONE] do not make 'Accounts' a singleton; 
350         [DONE] make <Accounts/> and <Journals/> 1 entity per <bookkeeping/> (root) node. 
351         [DONE] refactor 
352                 TestActions, TestGeneral, TestTransaction / Entry, Transaction 
355 [DONE]  XML:DB
356         [OK] scheme for naming xml docs inside eXist
357         [OK] specify toXML depth in Bob
358         [OK] prefix namespace in Bob.toXML()
359         
360         [OK] loading 'Bookkeeping' from XML data store 
361         [OK] saving 'Bookkeeping' to XML data store 
362         [OK] updating 
363         [OK] deleting 
364         
365         [OK] Strategy for dividing <bookkeeping/> XML into separate pieces
366                 I think Accounts, Journals, and Transactions should be in 
367                 separate documents, per user -> this has been achieved in the XML
368         
369         [OK] Strategy for CRUDing XML w/ native XML database 'eXist'
370                 - for now, the UI and 'Bob' model will talk to each other. 
371                 - There will be a commit method for changed nodes after a command has been run.
374 [DONE] finish 'reverse' command 
375         [OK] this involves i) changing the ReverseCommand to set the receiver token's parent <entries/>
376         [OK] 'entries' is a new token in the system 
379 [DONE] variables; (this feature of course ties b'keeping to 'bkell'; loading/saving to 'XML:DB'; and XML to 'Bob' )
380         - variables [are NOT loosely typed] a variable can be XML
381         - automatic variable is the result of the last command run
382         - @variableName can be assigned to i) the last run command or ii) as the result of an expression 
383         [OK] define variable syntax 
384         [OK] Expression visitor gets/sets variables in command shell (bkell)
387 [DONE]  put 'account' attribute in debit/credit 
388         - now adding entrie tries to use the 'accountid', then the 'account' attributes of the <debit/> and <credit/> tags 
391 [DONE] Bookkeeping 'Shell' & 'Command Set' for executing functionality 
392         [OK] go through all usage scenarios for using 'Bookkeeping' 
393         [OK] design little grammar for 'Bookkeeping' 
394         -- implement grammar 
397 [DONE] 'print' command ( for variables ) 
399 [DONE] finish commit command 
400         -- variable names with same name should overwrite previous 
401         -- reading the previous command variable - '@@'
402         -- use XML:DB transactions where if something fails, I can roll back 
405 [DONE]  ** --> 'Action' interfaces for:
406 [todo] a set of executed commands should be recorded in a shell (bean shell, rhino, -- none, custom shell). 
407                   an implicit transaction
408                 [ok] CREATE
409                 [ok] ADD / REMOVE / REVERSE 
410                 [ok] UPDATE - figure out the syntax for this 
411                 ** LOAD - implicit at system loading 
412                 [ok] FIND
413                 [ok] LIST
414                 ** LOGIN - implement later 
415                 ** LOGOUT - implement later 
416                 [ok] EXIT - implemented in the Bkell itself.
417                 
418                 
419                 ** COMMIT save in memory XML to the database 
420                 modes: 
421                 autocommit (true/false); creating or updating an xml will only affect in memory XML unless this is set to true
423 [OK] tag PreAlpha bookkeeping
424         [Projec-Version-Date]
425         bookkeeping-PreAlpha-06082007
427 [OK] create 'bookkeeping' user 
428 [OK] System should start with a default system, users, bookkeeping/accounts/journals/transactions 
430 [OK] clean up DB access code to use configured credentials 
431         - no explicit file referencing 
432 [OK] create a clean system initialisation procedure: Authentication, Bookkeeping System, Bkell 
433         BookkeepingSystem -> Spittoon 
434         Aauthorise 
435 [OK] introduce many currencies; a currency can only balance against itself
436 [OK] refactor Account / Journal debit and credit to be pointers to a separate node 
437 [DONE] > Authentication & Authorisation code
438         [x] separate servlet to handle authentication, adding and removing of users 
439         [~] SAML / Federated 
440         - make it thread-enabled 
441         
442 [OK] REFACTOR XMLs to use new 'bookkeeping.system.xml' model - bookkeeping books will be kept in groups!!! 
444         (make interfaces)
445 [DONE] refactor actions to all use Action interface; and all Actions use Authetication and Authorisation 
446         code. Authentication and Authorisation code should use a Mediator pattern where an Action adapter or 
447         client (webkell, servlets; bkell, shell/SableCC) call Actions though the Mediator. The Mediator 
448         would authenticate and authorise the calling code. 
449         
450         [x] remove the idea of a commit when adding / updating. Just add debit / credit to an entry. 
451         - a separate servlet will control the authentication, adding and removing of users; 
452         authentication / authorisation information is transfered to client 
453         
454         - with authentication / authorisation information in the servlet client, the client can handle 
455         session, and authorisation rules. Those rules should be discarded at the end of the servlet's lifecycle.
456         
457         -- test for DB update / retrieval for a given user 
458         
459         - new commands must be created in bkeeping/bkell to 
460                 1. run the shell as a particular user or 
461                 2. login / logout as a particular user 
463 [DONE]  have SableCC code call updated Action interface 
464         ** Put Aauthentication into these places 
466 [OK]    Free Java Hosting service 
467                 - myservlet.com
468                 - 4java.ca 
469 [OK]    SableCC
470                 -- unit tests for DSL code
471                 [x] upgrade to SabelCC 4
472                         - Sablecc end of expression parsing; getting rid of EOF (SSableCC 4)
473                         - having shell take input (for history, etc), forward it to lexer
474                                 - map the newline to EOF
475                                 - make newline an expresion terminal 
476                                 [x] wait for SableCC4
477 [OK]- bkell functional tests
478                 - webkell functional tests 
480 [X] auto-commit on/off 
481         auto commit on commands: 
482                 add, create, remove, reverse 
483         set auto-complete variable in the bkell environment; everytime a command is run, 
484                 [OK] it puts the result as a variable in the shell 
485                 - it is auto-committed if applicable 
486         ** we don't necessarily want the entire bookkeeping system in memory, so load and save only chunks of XML 
488 [OK] PERSISTENCE LAYER; 'Something' that figures out the persistent lifecycle of my objects
489         ** hardcoding it for now. 
490     i) connection pooling
491     ii) object mapping
492     iii) transaction management
494 [OK]    Store data online / offline ( locally ) 
496 [OK] web UI for bookkeeping
497         - linkedIn, blog, email signatures, facebook, skype, ycombinator 
498         * links: donation, tell a friend 
499         
500         ** what 'look' do I want; 
501                 - very simple gmail-like vertical tabs ( www.gmail.com ) 
502                 - simple information organisation & colour scheme ( del.icio.us ) 
503                 - implicit, clean layout ( www.alistapart.com, openrico.org, www.informationarchitects.jp )
504         
505         ** error handling on bad input / balance
506                 use log4j
508 [x] XML encryption & password shadowing ; using SSL 
512 >>>>>>>>>>>>>>>>>>>> GOALS 
514 [x] Making a package for small businesses
515 [OK] make 'bookeeping' usable to the point of
516         i) demonstration; proof of concept
517         ii) giving potentials a toy to play with
518         
519         -> UI for 'entry'; add / find / update / reverse / delete
520         -> installer that puts (eXist, laszlo, java, & bookkeeping) onto system
521 [OK] EXAMPLE journal entries for a year
525 >>>>>>>>>>>>>>>>>>>> SCRATCH...
527 *) javac -classpath /Applications/eXist/exist.jar:/Applications/eXist/exist-optional.jar:/System/Library/Frameworks/JavaVM.framework/Home/lib/dt.jar:/Applications/eXist/lib/core/xmldb.jar CreateResource.java 
528 *) java -classpath .:/Applications/eXist/exist.jar:/Applications/eXist/exist-optional.jar:/Applications/eXist/lib/core/xmlrpc-1.2-patched.jar:/System/Library/Frameworks/JavaVM.framework/Home/lib/dt.jar:/Applications/eXist/lib/core/xmldb.jar CreateResource /db/bookkeeping/ data/buyequipment.xml 
529 *) for (Iterator it = allMovies.iterator(); it.hasNext();) {