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