File: projects.html

package info (click to toggle)
gnucash 2.0.5-1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 58,168 kB
  • ctags: 31,733
  • sloc: ansic: 300,644; lisp: 36,002; sh: 18,499; makefile: 6,158; xml: 1,391; perl: 829; sql: 558
file content (2845 lines) | stat: -rw-r--r-- 104,018 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
  <head>
    <title>GnuCash Project Goals</title>
    <meta name="description" content= "The Linux GnuCash project 
                aims at creating a world-class personal finance package. 
                Goals include ease-of use, double entry, OFX support, 
                charts, and reports, and multi-user support.">
    <meta name="keywords" content= "linux, OFX, accounting, finance, 
                financial, ledger, double entry, GPL, gnu">
  </head>

  <body bgcolor="#d6dacb" fgcolor="#000000">

    <div align=center><a href="http://www.gnucash.org/" target="_top">
    <img border=0 width=470 height=62 alt="GnuCash Personal Finance Manager"
     src="GnuCash_Long.jpg"></a><br>
    </div>

    <h1>GnuCash Project Goals</h1>

    <p>
    The people behind <a href="http://www.gnucash.org">GnuCash</a>
    aim to create a world-class GPL'ed Open Source Personal
    Financial Application for GNU/Linux and other Unix's. This page
    reviews some of the technical issues and development status
    surrounding this project. It is a kind of an <b>FAQ</b> for
    developers and contributors, providing status, and suggesting
    directions and technologies for deploying new features. If you
    simply want to get a better idea of what <a href=
    "http://www.gnucash.org">GnuCash</a> is and what it does, visit its
    <a href="http://www.gnucash.org">home page</a>. The home page
    contains screen shots, news items, and mailing list
    archives.
    </p>

    <p>
    There are currently several different versions of GnuCash.
    We've adopted the kernel numbering scheme: even minor release
    numbers (1.4.x, 1.6.x) are considered to mark stable releases,
    while odd numbers (1.5.x, 1.7.x) mark development releases.
    </p>

    <ul>
      <li>The current stable, production release is gnucash-1.6.0 and
          is based on the <a href= "http://www.gnome.org">Gnome</a> / 
          <a href= "http://www.gtk.org">GTK</a> libraries.
      </li>

      <li>The 1.7.x releases focus on adding new features and
          improving existing functionality.
      </li>
    </ul>

    <p>
    The latest version is available only via CVS.  Occasionally,
    some of the more stable CVS versions are given a version number,
    and packaged as a precompiled deb or RPM install package. Naive or
    beginning users should probably stick to version gnucash-1.6.0.
    More adventurous users can try one of the 1.7.x releases, However,
    keep in mind that they are in a state of constant change and will
    often be unstable.
    </p>

    <p>This document is divided into several sections.</p>

    <ol>
      <li><a href="#arch">Architectural Goals</a></li>

      <li><a href="#reqs">Requirements</a></li>

      <li><a href="#size">Sizings</a></li>

      <li><a href="#feats">Features</a></li>
    </ol>
    <hr>
    <!--===================================================-->
    <a name="arch">
    <h1>Architectural Goals</h1>
    </a> 
    There are some over-reaching design principles and philosophies
    that we intend to maintain. Some of these concepts and terms
    are introduced in this section. 

    <h2>Separation of GUI and Data</h2>
    First, we must maintain a clean separation between the data
    structures and the GUI that manipulates them, along the lines
    of the <b>Model-View-Controller</b> paradigm. 

    <ul>
      <li>Lists of accounts and the transactions in them can be
          thought of as a representation of financial data, a 
          <b>Model</b>.
	  </li>

      <li>The GUI that adds, modifies and deletes these should be
          thought of as a manipulator of the data, a <b>Controller</b>.
          Thus, the Motif or Gnome GUI's are merely two possible
          manipulators of the data; others, based on <i>e.g.</i>
          web/cgi-bin, Qt/KDE, emacs, Java applets or Java servlets
          ought to be possible.</li>

      <li>The <b>View</b> of the data is a subset or slice of the
          data described by the Model. The View may consist of only the
          transactions for the month of May, or only the account totals
          for certain accounts. The View is used in part to generate
          the reports and graphs, but it is also that which the
          Controller interacts with. Views are generated by queries to
          the data store.</li>
    </ul>

    <p>
    GnuCash also needs to deal with multiple distributed data
    sources: stock quotations from the net or transaction
    confirmations from online banks and brokerage houses, or from
    more mundane sources, such as file imports, or merger of data
    from several users. Amongst these terms, the concept of a
    global Model-View is dated, and somewhat inappropriate. Rather,
    we need to be concerned about how data is represented in the
    local address space of the GUI, how the GUI manipulates it, how
    data is brought in and merged from external sources, and how
    that data is again output, whether to a file or a local or
    remote database.</p>

    <p>
    Thus, the <b>View</b> essentially represents a local data
    cache of the data that is immediately present and being
    displayed, reported, and manipulated. The <b>Model</b> is the
    abstraction of that data that the GUI (the controller) can act
    on.</p>

    <h2>The Financial Engine</h2>
    In GnuCash, the Model is implemented via the <b>Engine</b> API,
    and the View is the data that is currently in the <b>
    Engine</b>. Thus, the Engine is a set of programming API's that
    the GUI (or a script, or even a clever command-line-addict) can
    use to manipulate the data. 

    <p>
    Currently, the Engine provides basic accounting structures
    These include: </p>

    <ul>
      <li><b>Transactions</b>, which consist of a set of 'splits'
      or journal entries (JE's) whose values sum to zero.
      The transaction includes several date fields, a description,
      and a common-currency field, and a universal unique id 
      (uuid/guid).  It also provides hooks to store arbitrary data 
      associated with the transaction (using a URL-based key-value tree).
      </li>

      <li><b>Journal Entries</b> (internally referred to as
      'splits') which an amount and the account on which it is drawn.
      Splits also store reconcile status, dates, a memo field, 
      and also a key-value based hook for arbitrary data.
      </li>

      <li><b>Accounts</b>, which include a nme, a type, a description
      field, and the type of commodity they store.  Principlally,
      the account consists of a list of journal entries.</li>

      <li><b>Chart of Accounts</b>, which is a hierarchical tree of
      accounts.</li>
    </ul>

    The Engine has a basic two-phase commit model, and a 
    query mechanism for finding the data needed for reports and 
    views. The goal of the two-phase commit and query model is 
    allow the creation of multi-user server based backends, such
    as an SQL backend, and RPC client-server backend, or an 
    XML-based HTTP/web backend.  This design seems to work 
    for the above-named backends.
    
    <p>The Engine currently handles only a basic set of data
    sources:</p>

    <ul>
      <li>It can import and merge in QIF's (actually, this function
          has been moved into the GUI, and is no longer part of the 
	  engine);
	  </li>

      <li>It can read and write its own XML byte stream;
          This ability has been used to provide a multi-user
	  client-server demo (which is currently broken).
          </li>

      <li>It can use a Postgres SQL database as a datastore, thereby
          enabling multi-user and auditing functions.
	  </li>

      <li>It can talk, via RPC, to a gnucash server.  (This code is 
          'alpha' and incomplete/broken).
	  </li>
	  
      <li>It can get stock quotes from the net (actually, this 
          function is provided by a separate module, the Finance::Quote
	  perl module.)
	  </li>
    </ul>

    <p>
    However, since the Engine is meant to be the interface
    between the GUI and the financial data, it is really intended
    to be able to do much more.
    In particular, it should be possible to create a peer-to-peer
    network model, where gnucash peers can synchronize data between
    themselves.  The engine should also be expandable to handle other 
    sources of data, such as OFX/IFX, the Open Trading Protocol, or 
    the OMG CORBA General Ledger submission.  In particular, it
    should be possible to use GnuCash not only to view data from
    these sources, but also to manipulate it and send it back.
    </p>

    <h2>Modularity, Extensibility and Customization</h2>

    <p>The above structure should lead us to view GnuCash not so
    much as a tightly integrated application, but rather as a loose
    confederation of component objects, libraries and interfaces.
    This has a number of advantages for both the deeloper and the 
    user.  For the developer, it allows parts to evolve semi-independently
    of one-another, and to be used in other, non-gnucash projects.
    For the user, a good extensibility allows the use of
    <a href="#arrangements">arrangements</a>: a way of broadly
    customizing the appearence and behaviour of gnucash, and then 
    allowing users to very easily share these customizations with 
    one another.  Such arrangements might be collections of canned 
    reports, e.g. for business or home user.  Or they might be
    the menu contents: one menu arrangement is for gbeginners, another 
    for 'power users', a third for business owners.  Th goal is that
    broad areas should be not only customizable, but it should be
    possible, even easy, to trade these customizations between users.
    </p>
    <p>
    In order to facilitate the gluing together of these parts, as
    well as simplify the questions of customizability, change and
    rapid development, GnuCash makes use of the 
    <a href= "http://www.swiss.ai.mit.edu/projects/scheme/index.html">
    Scheme</a> extension language (as implemented in the FSF 
    <a href="http://www.gnu.org/software/guile/guile.html">Guile</a>
    interpreter), to glue the pieces together. (Note that the
    engine interface is also available with 
    <a href="http://www.perl.org">Perl</a> interfaces, thanks to a 
    <a href="http://starship.skyport.net/crew/beazley/swig.html">SWIG</a>
    wrapper.
    </p>

    <h2>A Web Browser for Financial Data</h2>

    <p>More and more finacial data is moving onto the web.  
    People shop on-line. They pay bills on-line.  There are
    even some promising e-wallet systems (such as 
    <a href="http://www.webfunds.org">WebFunds</a>).  For GnuCash
    to be relevent in this on-line world, it must be able to interact
    with these systems.  There are several steps that can be taken
    along this path.  First, it must be possible to simply and
    transparently import financial data off the web.   Click on a QIF
    file, mime-type "application/x-qif"? Gnucash sucks it in without 
    burping.  But, in a more distant future, can GnuCash originate
    transactions? It should be able to!  
    </p>
    <p>
    GnuCash can be and should be "The Sophisticated Financial Web Browser".
    All GnuCash reports and the help system are HTML-based.  In fact,
    GnuCash has a built-in web browser that can view ordinary web sites.
    Interactive gnucash components such as the bar and pie charts, or
    the graphs and reports, can all be served up by a remote web server,
    as well as locally through the GnuCash application.  This allows
    GnuCash to blur the line between web browser and financial application,
    and offer the best of both worlds.
    </p>
    <p>
    Why is this a good thing?  One can always have a pure web-based
    accounting solution (such as SQL-Ledger) that uses ordinary web
    browsers to view the financial data. But there are problems:
    dynamically-generated html and cgi-bins aren't as pretty or easy 
    to use, or as fast, responsive or sophisticated, as what you can 
    do with a custom client.   That is, GnuCash can be more interactive,
    easier to user, slicker and more professional looking in style 
    and presentation than a plain-old dynamic website.  Financial
    ASP's simply cannot currently offer the kind of utility, flexibility,
    responsiveness and integration that GnuCash can offer.
    </p>
    <p>
    In theory, the 'Java revolution' was supposed to provide this 
    function, with downloadable Java applets providing the 'fancier-
    than-plain-html' interface.  But a Java applet that is this 
    sophisticated would also be large and slow to download:
    it offers no inherent advantages over native code.  Another 
    problem with Java is the inherent propreitary fragmentation: 
    no two Java applets are alike: every site has thier own; there
    is no standardization. 
    </p>
    <p>
    In order to solve the 'no gui standardization between websites'
    problem, there are a number of businesses that have arisen to 
    provide "financial aggregation".  You sign up with these sites,
    and let them get all of your credit-card, bank and investment info,
    and they can provide a unified interface for your bank statements,
    with graphs and reports (all for a monthly fee).  The existance of
    these services highlights a problem: the inability to aggregate
    the same data on the users desktop, in a simple, coherent fashion.
    Let us posit that GnuCash, with the right on-line interfaces, 
    would be a natural for this.  For the paranoid,
    this has the added advantage that no one business has access to
    all of your financial records.
    </p>

    <p>
    To put it another way, GnuCash can provide a centralized, trusted 
    store for financial data that no other application can provide.  
    The convenience 
    factor:  if you have trading accounts at e*trade and charles schwab,
    then GnuCash can be the central place where you can oversee 
    <b>all</b> of your investments.  The trust factor:  
    maybe you can trust your web bank. Maybe you can trust your web 
    stock account.  But can you trust a single web entity with *all*
    of your financial data?  Someone who won't treat you as 'just 
    another consumer' and sell your 'consumer profile' to anyone who
    cares to stalk (ahem, target) your financial activity (ahem,
    purchasing) patterns?  Didn't think so.   Of course, you
    *could* use some proprietary financial software.  Assuming, of course,
    that you trust it not to have any built-in covert channels:
    nothing that might send back the make and model of your CPU and 
    the last ten transactions 'home to mommy' for 'diagnostic purposes'.
    Because open source software, such as GnuCash, can be audited
    it can be trusted in ways that no proprietary software can be.
    In an increasingly net-connected world, the ability to build 
    trust through audits will be increasingly important.
    </p>

    <h2>Looking Into the Future</h2>
    Things like support for OFX, and small-business features are
    hopefully in the near term future of gnucash.  Lets take a look
    at some more far-out possibilities.
    </p>
    <dl>
    <dt><b>E-Wallet</b></dt>
    <dd>An e-wallet, just like a real wallet, stores cash.  You
        can use that cash to pay freinds or businesses.  Just
	like a real wallet, an e-wallet should not charge you 
	monthly fees.  It should provide you with some measure
	of anonymity and privacy.  An e-wallet should also do 
	something no ordinary wallet can do: show you a monthly
	report of expenditures.  GnuCash should get e-wallet 
	features. </dd>

   <dt><b>Authentication, Authorization and Access Control</b></dt>
   <dd>How does an on-line merchant know that you are who you say
       you are?  How can you use GnuCash to authorize a bill payment?
       Sooner or later, smart-cards will provide the sort of 
       authentication and access control that is only groped for 
       with PGP/GPG, keyrings, x.509 certificates, and Microsoft 
       Passport/Hailstorm.   Of all the electronic things in the
       electronic world where access control and authentication
       are important, real money is the most so.  
       </dd>

    <dt><b>Bill Presentment, Bill Pay</b></dt>
    <dd>These magic keywords just mean that a merchant wants to 
        send you a bill, and wants you to go to thier website to
	pay that bill (they want your eyeballs).  Of course, for
	the user, it would be more convenient to have the bill
	show up on the desktop, inside of gnucash, and get authenticated
	and paid out from the desktop (by gnucash), as you would
	do with all of your other bills.
    </dl>

    <hr>
    <!--===================================================-->

    <a name="reqs">
    <h1>Requirements</h1>
    </a>
    Lets take a look at who the current and potential future users
    of GnuCash are, and how they might use it.   The classes:

    <ul>
      <li>Basic Household Accounting/Budgeting</li>
      <li>Personal Stock Portfolio Management</li>
      <li>Personal On-line Trading (Day-Trading)</li>
      <li>On-line shopping and bill-pay</li>
      <li>Small Business Users</li>
    </ul>
    These different applications may use some of the same 
    financial terminology, and hopefully might share a fair 
    bit of code, but have quite different goals and requirements. 

    <h3>Basic Household Accounting and Budgeting</h3>

    <p>Important properties of a personal finance system
    include:</p>

    <ul>
      <li>Approachable and usable by occasional users
          who are not knowledgeable about accounting.</li>

      <li>Ease of use and simplicity is critical.</li>

      <li>A reasonable selection of reports, graphs, charts, and
          tools for personal finance, such as mortgage
          calculations.</li>

      <li>Budgeting support needs to be targeted at <em>naive</em>
          users.</li>

      <li>Interfaces to on-line banking, shopping, stock
          systems.  Bank and credit-card statements should
          arrive 'automatically' and always be up-to-date.</li>
    </ul>
    
    <h3>Personal Portfolio Management</h3>

    <ul>
      <li>Support for management of stock portfolios that may
          involve considerable sophistication, since individuals
          commonly have retirement plans that hold mutual funds,
          stocks, options, bonds, and the like.</li>
      <li>Reporting infrastructure needs to simplify handling of
          tax issues (long-term vs. short-term capital gains/losses,
	  cost-basis FIFO accounting, simplfied cost-basis 
	  spinoff/merger handling).  Need on-line updates of
	  prices, simple portfolio overview, ability to link
	  to websites for additional research.
      <li>Integration with on-line trading systems.  This could 
          save time typing.
      <li>Basic Audit features.  There's a problem with blindly
          allowing on-line data (prices, transactions) to enter
	  GnuCash.  It may not be clear where it came from,
	  and even if the source is beleived to be 'reputable',
	  there still may be factual errors in the data.  Thus,
	  there must be a way of audting newly-arrived (or even old)
	  on-line data, and mark it as 'reconciled', i.e. 
	  manually reviewed and checked for accuracy.  That is,
	  incoming on-line data must be auditable, and audit
	  trails should mark the history of on-line data import.
    </ul>

    <h3>Small Business Needs</h3>

    <ul>
      <li>With a business system, it is likely that there will be
          users who use it eight hours a day, which puts the emphasis 
	  on <em>efficiency</em> of user interface rather than on its
          approachability to naive users.</li>

      <li>Business systems require network support, and the ability
          to support multiple simultaneous users.</li>

      <li>Some business users may want access to the system from an
          MS Windows 95/98/NT box. For these folks, a web-based
          interface could be just handy. Web interfaces are also nice
          a for ASP type deployment.</li>

      <li>
        Small businesses do not often have sophisticated investment
        portfolios; they instead need support for additional
        sophistication in such areas as: 

        <ul>
	  <li>Customer and Vendor Lists; Invoicing</li>
	  
          <li>Payroll (Batch processed and individual)</li>

          <li>Inventory Control &amp; Asset Management</li>
          <li>Amortization Schedules, Depreciation</li>

          <li>Shipping and Receiving</li>

          <li>Accounts Receivable, Accounts Payable (A/R, A/P)</li>
          <li>Credit Card Processing</li>

        </ul>
      </li>

      <li>Support for calculations associated with accrual
          accounting.</li>

      <li>Ambitions for the future might include interfaces to
          online shopping carts, credit card clearing interfaces, and
          ERP systems.</li>
    </ul>

    <h3>Reconciling Those Needs</h3>

    <p>A seemingly contradictory factor is that the kinds of
    sophistication that are required vary considerably.
    Consider:</p>

    <ul>
      <li>A home user does not generally require most of the
      sophistication of accrual accounting that is
      required by business enterprises. Thus, home users don't need
      <em>much</em> of the sophistication of an Accounts Receivable
      or Payable system, or the <em>bizarre</em> depreciation
      policies that crop up in Asset Management systems.<br>
      <br>
      </li>

      <li>
        On the other hand, home users are in increasing need of
        surprisingly sophisticated financial tools for managing
        stock portfolios, including: 

        <ul>
          <li>Mutual funds</li>

          <li>Retirement savings plans, with such identifiers as
          401(k), IRA, Roth IRA, RRSP, or Insurance Annuities</li>

          <li>Corporate stock purchase plans</li>

          <li>Corporate option plans</li>
        </ul>
      </li>
    </ul>
    Another set of contradictory requirements has to do with the
    back-end, and interfacing to other systems: 

    <ul>
      <li>Home users need a simple-to-install, simple-to-maintain
      system. This essentially rules out the use of SQL for the
      storage medium/back-end for home users. (That is, the current
      state of the art for SQL on Linux does not offer any simple,
      fool-proof management for data).</li>

      <li>By contrast, non-SQL systems for business use are almost
      unimaginable. SQL provides a high degree of data integrity
      and storage robustness, and also simplifies tremendously the
      import and export of data. Powerful SQL tools exist that can
      work magic in the hands of a good DB admin.</li>
    </ul>

    <p>It may be that these will require <em>completely</em>
    different systems, and that GnuCash cannot be "all things to
    all people." This remains to be seen.</p>
    <hr>
    <!--===================================================-->

    <a name="size">
    <h1>Sizings</h1>
    </a>
    This section attempts to guess how hard it would be to
    implement certain features. 

    <h2>Personal Financial Application</h2>
    Below are listed the technical work items needed to implement
    the features that home users might hope to have. They are
    listed in approximate order of priority. 

    <p>The right hand column shows a sizing guesstimate. pm ==
    person-months. These sizings are meant to show 'effort needed
    to complete', rather than 'total effort required'. Thus,
    half-finished items have smaller sizings.</p>

    <ul>
      <li><b>Done</b> The work item is essentially completed</li>
      <li><b>Small</b> 0 to 4 pm</li>

      <li><b>Medium</b> 3 to 12 pm</li>

      <li><b>Large</b> More than 12 pm</li>
    </ul>

    <table border="1" summary= "Personal Finance Functionality Requirements">
      <tr>
        <th>Feature</th>
        <th>Sizing</th>
        <th>Responsible</th>
      </tr>

      <tr>
        <td></td>
      </tr>

      <tr>
        <td><a href="#i18n">Internationalization</a></td>

        <td>Done</td>
        <td>-</td>
      </tr>

      <tr>
        <td><a href="#reports">Reports</a></td>

        <td>Medium</td>
        <td>Stimming/Gribble</td>
      </tr>

      <tr>
        <td><a href="#graphs">Graphs</a></td>

        <td>Medium</td>
        <td>Guppi/Gribble</td>
      </tr>

      <tr>
        <td><a href="#query">Transaction Query</a></td>

        <td>Small</td>
        <td>Linas/LewisMoss</td>
      </tr>

      <tr>
        <td><a href="#ledger">Simplified Ledger</a></td>

        <td>Done</td>
        <td>-</td>
      </tr>

      <tr>
        <td><a href="#glitz">Themes, Icons, Glitz</a></td>

        <td>Small</td>
        <td>Various</td>
      </tr>

      <tr>
        <td><a href="#misc">Miscellaneous Small Tasks</a></td>

        <td>Done</td>
        <td>Various</td>
      </tr>

      <tr>
        <td><a href="#alerts">Alerts, Recurring & Scheduled Transactions</a></td>

        <td>Medium</td>
        <td>?</td>
      </tr>

      <tr>
        <td><a href="#budget">Budgeting</a></td>

        <td>Medium</td>
        <td>Dave</td>
      </tr>

      <tr>
        <td><a href="#classes">Classes/'Action' Field</a></td>

        <td>Small</td>
        <td>?</td>
      </tr>

      <tr>
        <td><a href="#book">Books, Accounting Periods</a></td>

        <td>Small</td>
        <td>Linas</td>
      </tr>

      <tr>
        <td><a href="#check">Check Printing</a></td>

        <td>Small</td>
        <td>Grib</td>
      </tr>

      <tr>
        <td><a href="#wizards">Wizards</a></td>

        <td>Small</td>
        <td>Dave, Bill-qif</td>
      </tr>

      <tr>
        <td><a href="#arrangements">Arrangements</a></td>

        <td>Small</td>
        <td>?</td>
      </tr>

      <tr>
        <td><a href="#userpref">User Preferences/Session Mgmt.</a></td>

        <td>Done</td>
        <td>?</td>
      </tr>

      <tr>
        <td><a href="#quickim">Quicken(TM) QIF Import</a></td>

        <td>Small</td>
        <td>Gribble</td>
      </tr>

      <tr>
        <td><a href="#iifim">IIF Import</a></td>

        <td>Small</td>
        <td>?</td>
      </tr>

      <tr>
        <td><a href="#quickex">IIF Export</a></td>

        <td>Small</td>
        <td>Grib</td>
      </tr>

      <tr>
        <td><a href="#currency">Multiple Currencies</a></td>

        <td>Medium</td>
        <td>Rethink Requirements-Linas</td>
      </tr>

      <tr>
        <td><a href="#architecture">Architecture Review</a></td>

        <td>Small</td>
        <td>RLB, Dave</td>
      </tr>

      <tr>
        <td><a href="#testing">Automated Test Suite</a></td>

        <td>Medium</td>
        <td>?</td>
      </tr>

      <tr>
        <td><a href="#quote">Stock Quotes, Price Quotes</a></td>

        <td>Small</td>
        <td>?</td>
      </tr>

      <tr>
        <td><a href="#install">Install</a></td>

        <td>Small ?</td>
        <td>?</td>
      </tr>

      <tr>
        <td><a href="#double">Forced Double Entry</a></td>

        <td>Small</td>
        <td>?</td>
      </tr>

      <tr>
        <td><a href="#401K">401K etc.</a></td>

        <td>Small</td>
        <td>?</td>
      </tr>

      <tr>
        <td><a href="#searchdocs">Searchable Documentation</a></td>

        <td>Done</td>
        <td>grib</td>
      </tr>

      <tr>
        <td><a href="#reconcile">Reconcile Auditing</a></td>

        <td>Small</td>
        <td>?</td>
      </tr>

      <tr>
        <td><a href="#note">Annotate with Investment News</a></td>

        <td>Small</td>
        <td>?</td>
      </tr>

      <tr>
        <td><a href="#loan">Loan and Mortgage Calculators</a></td>

        <td>Small</td>
        <td>Dave</td>
      </tr>

      <tr>
        <td><a href="#overdraft">Overdraft Alerts</a></td>

        <td>Small</td>
        <td>?</td>
      </tr>

      <tr>
        <td><a href="#tech">Technical Stock Analysis</a></td>

        <td>Medium</td>
        <td>?</td>
      </tr>

      <tr>
        <td><a href="#sink">Depreciation, Sinking Funds</a></td>

        <td>Medium</td>
        <td>?</td>
      </tr>

      <tr>
        <td><a href="#ofx">OFX, Online Banking, Trading,
        Bill-pay</a></td>

        <td>Large</td>
        <td>Dave</td>
      </tr>

      <tr>
        <td><a href="#tab">Tab-delimited ASCII export</a></td>

        <td>Small</td>
        <td>?</td>
      </tr>

      <tr>
        <td><a href="#tax">Tax Preparation</a></td>

        <td>Large</td>
        <td>?</td>
      </tr>

      <tr>
        <td><a href="#palm">Sync with Palm Pilot
        organizers</a></td>

        <td>Medium</td>
        <td>?</td>
      </tr>

      <tr>
        <td><a href="#emerg">Emergency Records Organizer</a></td>

        <td>Small</td>
        <td>?</td>
      </tr>
    </table>

    <h2>Small Business Features</h2>
    Features that small/medium businesses expect. 

    <table border="1" summary=
    "Business Functionality Requirements">
      <tr>
        <th>Feature</th>

        <th>Sizing</th>
        <th>Responsible</th>
      </tr>

      <tr>
        <td>
        </td>
      </tr>

      <tr>
        <td><a href="#engine">Enriched Engine, Financial
        Objects</a></td>

        <td>Large</td>
        <td>?</td>
      </tr>

      <tr>
        <td><a href="#sql">SQL I/O</a></td>

        <td>Done</td>
        <td>Linas</td>
      </tr>

      <tr>
        <td><a href="#multiuser">Multi-User Support</a></td>

        <td>Small</td>
        <td>Linas</td>
      </tr>

      <tr>
        <td><a href="#addressbook">Address Book</a></td>

        <td>Small</td>
        <td>?</td>
      </tr>

      <tr>
        <td><a href="#arap">A/R, A/P Accounts Payable,
        Receivable</a></td>

        <td>Medium</td>
        <td>?</td>
      </tr>

      <tr>
        <td><a href="#payroll">Payroll</a></td>

        <td>Medium</td>
        <td>?</td>
      </tr>

      <tr>
        <td><a href="#invoice">Invoicing</a></td>

        <td>Medium</td>
        <td>?</td>
      </tr>

      <tr>
        <td><a href="#estimate">Job Costing</a></td>

        <td>Medium</td>
        <td>?</td>
      </tr>

      <tr>
        <td><a href="#expense">Expense Accounts</a></td>

        <td>Large</td>
        <td>?</td>
      </tr>
    </table>
    <hr>
    <!--===================================================-->

    <a name="feats">
    <h1>Features and Functions</h1>
    </a>
    This section reviews the current status of various features.
    Some of these are 'in process', some are 'almost done', some
    are 'completely done'. This section thus provides status on
    both where we've been, and where we're going. 

    <dl>

      <dt><a name="i18n"><b>Internationalization</b></a></dt>

      <dd>
        All menus, markup and help-text should be
        internationalized, so that GnuCash may be usable in any
        country. This would include the printing of currency values
        in the local country conventions. 

        <p><b>Current status:</b>
        Essentially Done (?)
        <ul>
          <li>All GUI messages currently use GNU <tt>gettext()</tt>
          for the message catalogs. Translations exist for English,
          British, French, Swedish, German, Japanese.</li>

          <li>Help pages available only in English and French.</li>

          <li>Monetary and string handling done through glibc. The
          latest glibc (2.2.3) is needed to get the correct
          functions.</li>

          <li>Yannick Le Ny &lt;y-le-ny@ifrance.com&gt; traduction
          en francais</li>

          <li>Most GUI input elements use the gtk text widget, and
          thus use the XIM input method in Asian locales. This
          allows <i>e.g.</i> Kanji, Katakana support. However, the
          register does <em>not</em> use XIM, and thus doesn't
          currently support the Asian languages. This needs
          fixing. (This may be done already??)</li>
        </ul>
        </p>
      </dd>

      <dt><a name="reports"><b>Reports</b></a></dt>

      <dd>
        A variety of reports, including Net Worth, Balance Sheets,
        and Profit and Loss statements. These should be printable:
        that is, exportable as HTML as well as print-ready
        postscript. These should be easy to customize. Ideally,
        even novice users should be able to create custom reports. 

        <p>The Report Generator should be a separate but "dockable"
        subsystem of the whole. That is, it should be possible to
        run the report generator in a stand-alone, read-only
        fashion without having to start up the main application. It
        should be possible to run reports nightly from a
        command-line and/or cron job.
	The GUI should remember what reports were run last time, and
	these should be re-run/redisplayed whenever the report generator
	is used.
	</p>

        <p>One difficult aspect of reporting is designing a
        configurable interface, so that people can build custom
        reports. The <a href="xacc-reports.html#NEWREP">New
        Reporting Infrastructure</a> is seeking to build this up
        using Guile.   Note there are several flavours of customization:
        <ul>
        <li>Allow user to specify a custom logo (e.g. company 
	    logo/address) on every page
            (generically, having a header and footer for every page).
        <li>Allowing user to modify report title/subtitle on the fly
            (and possibly add notes at the top or bottom of the report,
            e.g. to explain line items).
        <li>Allow user to use the <a href="#query">transaction query</a>
            interface to pick the set of transactions that will make up
            the report.
        <li>Memorize the report that was asked for, give that report
            a name, and in the future, allow that same exact report 
            to be re-run.  Allow user to edit this report properties
            at a later date.  Note that the basic idea is similar to 
            that of <a href="#query">memorized queries, discussed below.</a>
        </ul>
        Note that the customization info should be stored in a 
        <a href="#arrangements">Arrangements File (see below)</a>.
        </p>

        <p>Generated reports should be exportable to other gnome
        systems (probably using bonobo). 
        Reports should also be exportable to
        the Gnumeric spreadsheet (probably by writing out gnumeric
        file format).  Export of CSV (comma separated values) and
	tab-delimited formats (for other spreadsheet import) would
	be good.  Tables & etc. should be exportable to AbiWord,
        StarOffice, other word processors. (formats: docbook sgml?
        would then make convert to richtext, TeX easy.)
	Export should be as wysiwyg as possible.
        </p>

        <p>Must be possible to e-mail reports (for example,
	invoices) to users.  Suggest an evolution addressbok
	/mailer bonobo plugin.
        </p>

        <p>
        Relationship to budgeting not clear ... 
        </p>

        <p>Stock portfolio tools should include a Cost Averaging
        report, Market Index report, Stock Option values,
        Estimation of capital gains tax liabilities.</p>

        <p>Reports should be printable to printer (postscript/
	Adobe Acrobat). 

        <p>
        <b>Status:</b>

        <ul>
          <li>A general reporting infrastructure was implemented in
              Perl, in the form of html-embedded perl (ePerl). However,
              this reporting mechanism was abandoned in part because
              ongoing build and install problems related to ePerl and
              swig. Also, since ePerl didn't participate in the
              interpreter even loop, the report generator had to run
              as a separate process, reading data via pipes. This was
              uglier than some folks liked.</li>

          <li>A general reporting infrastructure has been <a href=
              "xacc-reports.html#NEWREP">implemented in Scheme</a>.
              Currently, there are a variety of reports for Profit/Loss,
              Balance Sheet, and portfolio valuation; none are 
	      particularly sophisticated.</li>

          <li>Done: Reports are displayed with the gtk-html widget.
	      This widget provides postscript printing and Acrobat 
	      output.
              </li>

          <li>There is currently no way (no longer any way??) to
              generate reports from the command line ...</li>

          <li>While many reports have been implemented, there is
	      no master list of what we should have.  We should have ....
          </li>

          <li>The following technologies were rejected/unused mostly
              because they were too complex, didn't hang together technologies:
              <a href= "http://www.oasis-open.org/cover/">SGML</a> and <a href=
              "http://www.oasis-open.org/cover/xml.html">Extensible
              Markup Language - XML.</a> In the long run, these are
              preferable to HTML, since <a href=
              "http://www.jclark.com/dsssl/">DSSSL</a> tools such as <a
              href="http://www.jclark.com/jade/">Jade (James DSSSL
              Engine)</a> can be used to convert to RTF, Postscript, etc.
              Add to this the consideration that XML is the basis for the
              <a href="http://www.w3.org/DOM/">Document Object Model</a>,
              which is being integrated into many web-based applications,
              and we can see that XML is an increasingly significant
              format as we look to the future.
        </li>

        </ul>
        </p>
      </dd>

      <dt><a name="graphs"><b>Graphs</b></a></dt>

      <dd>
        <p>Provide support for graphs, charts, etc., such as:
           Asset allocation pie chart, portfolio value vs. cost,
           ROI.  Graphs should be printable to printer.
           Graph generation should be fully integrated with reporting,
           both for data collection via queries, and for displayed
           output.
        </p>
        <p>
        <b>Status:</b>
        <ul>
          <li>Different graphing packages were evaluated, 
              <a href="http://www.gnome.org/guppi/">GUPPI</a>.
              Guppi was chosen.  Considered & rejected were
              plotutils, gnumeric graphing code (Miguel says 
              they'll replace gnumeric code with guppi.)
              Miguel's/Gnumeric requirements were:
              interactive plot editing -- each segment attributes 
              totally settable/controllable -- drag/move callbacks 
              when segments are click-dragged.
          </li>
	  <li>Basic pie charts and bar charts are used in GnuCash
	      reports.  There are problems: dates along the bottom
	      of a bar-chart are not well-spaced/autoscaled. 
	      The over look is a bit klunky.
        </ul>
        </p>
      </dd>

      <dt><a name="query"><b>Transaction Query</b></a></dt>

      <dd>
        Allow user to build (complex) queries to locate a 
        set of transactions that match some criteria: e.g.
        a date range, or a matching payee, description, amount,
        etc.  Once a user has created a complex query, it
        must be possible to memorize it (i.e. give it a name,
        and store it for future reuse).

        <p>
        <b>Status:</b></p>
        <ul>
          <li>The query engine has been implemented (as of 1.4.0,
              grib)
          </li>
          <li>The GUI for creating queries has been implemented
              (as of 1.4.0, grib)
          </li>
          <li>The queries are handled by the Postgres SQL backend.
	      (as of 1.6.0, linas)
          </li>
	  <li>Queries can be turned into XML and back, for file 
	      storage or network transmission.  This used to work
	      for XML version 1 but was broken in version 2.
          </li>
          <li>The ability to memorize queries has <b>not</b>
              been implemented and awaits further action (needed
	      for reports, above).
          </li>
        </ul>
      </dd>

      <dt><a name="ledger"><b>Simplified Ledger</b></a></dt>

      <dd>
        Ledger should look clean, work easily.

        <p>
        <b>Status:</b></p>
	Essentially done.
        <ul>
	   <li>Multi-line ledger confusion fixed by using correct 
	       left-right journal display style.
	       Fixed in 1.6.0, Peticolas, Champaigne.
	   </li>
	   <li>
               Stocks and Mutual funds are handled by placing them each in
               their own account. Each account can be viewed individually.
               If all of the stock accounts are children of a master
               trading account, then the trading account can be viewed and
               modified in a General Ledger window. 
	       Layout problems fixed in 1.6.0.
	   </li>
	   <li>
              How to most simply allow the user to enter loads and fees?
              Through multi-line transactions. Seems to work well in
	      1.6.0.
	   </li>
        </ul>
      </dd>

      <dt><a name="glitz"><b>Themes, Icons, Glitz</b></a></dt>

      <dd>
        A variety of finer touches need work: 

        <ul>
          <li>
            <p><b>Hint-of-the-Day</b>. A collection of a some
            50-100 hints-of-the-day: short (2-4 sentence)
            hints/tips on how to use gnucash. Every time the user
            starts gnucash, an new hint shows up ...
            <b>Status:</b> Hint infrastructure complete (RGMerkel, 
	    version 1.4.0).  Need to add
            hints  (only a dozen are currently available).
            </p>
          </li>

          <li>
            <p><b>Themes</b>. Some theme testing required. The
            effect of themes on the register window needs to be
            reviewed.  Some themes look flaky in the main account
            window, might be a gtk bug ???</p>
          </li>


          <li>
            <p><b>Household Assets/House Inventory</b> 
            Add wizard to walk user through a set of questions
            about household inventory & help user value them.
            (do you own a house? appraised value? mortgage?
            do you own jewelry? appraised value? etc.)
            In particular, show how appreciation
            and depreciation should be treated.
            See the section <a href="#arrangments">Arrangements</a> for
            a discussion of the customization issues.
            </p>
          </li>

          <li>
            <p><b>More account types</b> Introduce more
            'fundamental' account types: (amortized) Loan,
            Mortgage, ESOP, House, Line of Credit.</p>
          </li>

          <li>
            <p><b>Register View</b> Allow user to view only
            non-reconciled transactions ...</p>
          </li>

          <li>
            <p><b>Configurable main-window Status Bar</b> Bottom of
            main window currently shows total asset, and total
            income-expense (profits). Make this configurable, so
            that user can show arbitrary sums of arbitrary
            accounts.
	    This is mostly solved by having the MDI interface 
	    have reports, and the use of multi-paning.  But the
	    default display for gnucash should be changed to 
	    show a very small (1-4 line) networth and P&L report,
	    and maybe a cash-flow report.
            See the section <a href="#arrangements">Arrangements</a> for
            a discussion of the customization issues.
            </p>
          </li>

          <li>
            <p><b>Dockable Registers/ aka "Browser Mode"</b>.
            Currently, when each new register opens, it opens in a
            new window. An alternate style would be to 'dock' the
            register window in a bigger frame, and just have
            'backward/forward' buttons to navigate through
            different registers (the way that a browser navigates
            web pages.) This of course would be a user
            preference.  Possiblity for doing this exists with MDI.
	    Maybe we shouldn't bother doing this ?? </p>
          </li>

          <li>
            <p><b>Context sensitive help</b>. When users
            create new accounts, need to suggest stuff if the user
            typed something unexpected ... (<em>e.g.</em>
            non-alphanumeric input) ...</p>
          </li>

          <li>
            <p><b>Folder Tabs</b> Currently, Income/Expense
            accounts can be shown or hidden by selecting from a
            menu. It would be nice to be able to examine different
            account types (Asset, Liability, Income, Expense,
            Payables, Receivables, Inventory) by selecting a tab
            folder. This is maybe a bs. request that shoudn't 
	    be implemented.</p>
          </li>

        </ul>

      The following have been completed, but possibly not fully
      documented:
        <ul>
          <li>
            <p><b>Pop-up Calendar</b> All date fields should pop up
            a calendar widget; selected date should get entered in
            field. (peticolas, version 1.4 ??)</p>
          </li>

          <li>
            <p><b>Pop-up Calculator</b> All price/amount fields
            should pop up a calculator widget; output of calculator
            gets entered in field. Instead of a popup calculator,
	    this was implemented by allowing all fields to take 
	    algebraic expressions (plus, minus, times, divide).
	    (rlb ?? version 1.6.0)
	    </p>
          </li>

          <li>
            <p><b>Button Bar</b> A user-configurable button-bar.
	    Solved in version 1.6.0 with tabs, not buttons, via
	    gnome MDI (gribble, version 1.6.0)
            See also the section <a href="#arrangements">Arrangements</a> 
	    for a discussion of the customization issues.
            </p>
          </li>
          <li>
            <p><b>Currency Exchange Table</b> 
            Keep a currency exchange-rate table.  This is now 
	    automatically handled via the 'price database'
	    (rlbrowning, version 1.6.0)
            (the finance::quote perl module handles currency 
	    exchange rate fetches)
            </p>
          </li>

          <li>
            <p><b>Currency Selection Pop-up</b> Currency field
            should get replaced by menu of long-hand currency
            names, three-letter ISO 4217 abbreviations, and symbols.
            User should be able to hand-enter non-IS4217 currencies.
            <b>Status:</b>
            Done in 1.4.0
            </p>
            </p>
          </li>

          <li>
            <p><b>Cut-n-paste</b> Cut-n-paste of whole transactions
            in the register window... <b>Status:</b> Done. (by Dave 
            Peticolas, in 1.4.0)</p>
          </li>

          <li>
            <p><b>Auto-completion</b> Quick-fill should also
            auto-complete amount, memo fields. 
            <b>Status:</b>
            Done in 1.4.0, Dave Peticolas
            </p>
          </li>

          <li>
            <p><b>Autoincrement</b> Check numbers should
            auto-increment.  Hit + key in check number field
            (same keystroke as in quicken).
	    <b>Status:</b>
	    Done in 1.4.0, Dave Peticolas
	    </p>
          </li>

          <li>
            <p><b>Navigation</b> Menu navigation using the keyboard
            should be possible. Hit the Alt-F to get file menu, 
            hit Alt-FS to save.

            Similarly, tab-key navigation in the register 
            should be possible.
            <b>Status:</b>
            Done (in 1.3.x ?, Dave & all, partly inherited via gtk
            widget set.).
            </p>
          </li>

          <li>
            <p><b>Fly-Over Help</b> When the user pauses the mouse
            over a button, "fly-over" pop-up help windows should
            appear.
            <b>Status:</b>
            Done (in 1.3.x, inherited via gnome/gtk widget set).
            </p>
          </li>

          <li>
            <p><b>Grayed-out Form Help</b> Create grayed out
            entries in the ledger, titled "Memo", "Description",
            etc, helping users understand what should be typed into
            each field. <b>Status:</b> Done (by Dave?), as of version
            1.3.2(?)</p>
          </li>

          <li>
            <p><b>Key Bindings for Editing Text Fields</b>.  The input fields
            use the gtk text widget, which provides key bindings that
            are similar to the Netscape/emacs key bindings.
            This allows <em>e.g.</em> emacs-style ctrl-a,
            ctrl-k to do the right thing. 
            <b>Status:</b>
            Done (in 1.3.x, inherited via
            gnome/gtk text widget).</p>
          </li>
        </ul>
      </dd>

      <dt><a name="misc"><b>Miscellaneous Small Projects</b></a></dt>

      <dd>
        A variety of small internal projects. All have been 
        completed as of 1.6.0

        <ul>
          <li>
            <p><b>File Format</b>. Rework to use text file format. Will be 
                XML-based.
               <b>Status:</b> RLB, LewisMoss. Version 1.6.0 Done.
            </p>
          </li>
          <li>
            <p><b>Reconcile Window</b>.  
               Auto-pay credit card when reconciling credit card 
               accounts (Done, Dave).  
               Auto-add bank fee when reconciling bank accounts.
               (Not done?, Dave).
            </p>
          </li>
          <li>
            <p><b>Print Register Window</b>. Output register window to
               printer.
               <b>Status:</b> Done: there is a register report which
	       is printable, there is botton on register. Done in 1.6.0
            </p>
          </li>
          <li>
            <p><b># of decimal places in prices (penny stock)</b>. 
               Part of the big numeric overhaul. Done, Gribble, others, 
	       version 1.6.0
            </p>
          </li>
          <li>
            <p><b>gtkhtml</b>. Move to gtkhtml from gtk-xmhtml. 
               Done in 1.5, Grib.
            </p>
          </li>
          <li>
            <p><b>print</b>. Print reports, etc. Done in 1.5, Grib.
               This came 'for free' with gtkhtml.
            </p>
          </li>
          <li>
            <p><b>key-val pairs</b>. Add generic key-slot mechanism
               into accounts, transactions, journal-entries. Done in
               1.5.0, Grib.
            </p>
          </li>
          <li>
            <p><b>guid in fileio</b>. No longer relevant with new file
               format. Dave.
            </p>
          </li>
        </ul>
      </dd>


      <dt><a name="book"><b>Books, Accounting Periods</b></a></dt>

      <dd>
        Ability to close the book at end of the fiscal year. This
        consists of several steps: 

        <ul>
          <li>Permanently lock some transactions as non-editable.
              This should be straight-forward by using the <tt>
              reconciled</tt> field to indicate a <tt>locked</tt>
              value, and not allowing the GUI to edit locked
              records.
          </li>
          <li>Transfer the Income minus Expense for the book period
              to an equity account, so that each new period starts with
              zero income/expense balances.
          </li>
          <li>A mechanism to purge really old transactions from the
              database.
          </li>
          <li>Extensions to querying and reporting infrastructure ...
              The query changes might be painful ...
          </li>
          <li>
              A user should be allowed to 'delete' an account <em>
              only</em> if it has no transactions in the currently
              open book. 
              Of course, it's not deleted from the old books.
              From this last, we conclude that every chart of
              accounts should have a beginning and ending date (that
              match the book period), and the file format needs to
              support multiple charts ...
          </li>
          <li>Memorized Transactions ... Currently, transaction
              auto-completion works by auto-completing with the last 
              'similar' transaction.  This ability will get trashed 
              when books for the old year get closed, because there 
              won't be 'similar' transactions.
          </li>
        </ul>

        <p><b>Status:</b>
        <ul>
          <li>A mini-design Doc exists in <tt>src/engine/extensions.txt</tt>
	      A far more extensive, four-part proposal is ??? somewhere
	      in the mailing list archives (by Linas Vepstas, circa Feb-May 
	      2001)
	      </li>
        </ul>
        </p>
      </dd>

      <dt><a name="check"><b>Check Printing</b></a></dt>

      <dd>
        Create a check-printing ability. Include MICR (Magnetic Ink,
        Computer Readable) check printing abilities.
        <a href="http://dir.yahoo.com/business_and_economy/shopping_and_services/financial_services/banking/checks/">
        Yahoo Check Printing</a> provides a list of vendors & printers.
	<p>
	Print vendor/client/payee address on the check (so that check
	can be mailed with window envelopes.) This requires gnucash
	to integrate with addressbook.

        <p><b>Status:</b>
        <ul>
	  <li>More check formats need to be supported.
          <li>Done, except for address part, in version 1.4.0.
	      (gribble)
              </li>
          <li>Need a sample check/sample transaction to print out
              so that user can test printer.
          <li>MICR Fonts are available & brought to mailing list.
        </ul>
        </p>

      </dd>

      <dt><a name="wizards"><b>Wizards</b></a></dt>

      <dd>
        Create a set of wizards to walk through some of the more 
        complex tasks, such as new user setup, account creation, 
        QIF import, budget prep, obscure functional corners.
	<p>
	Wizards are great, but lets not thow away the denser GUI's.
	For 8-hour-a-day users, the wizards can be irritating. 
	A single, dense screen can be more efficient and nicer.
	So when adding wizards, don't dump GUI's !! (instead,
	make them 'advanced' features).

	<p>
	<b>Status:</b>
	The following not done:
        <ul>
          <li><b>Account Creation</b>
	    The account creation panel is somewhat busy. Maybe 
	    could use a wizard?
          </li>
          <li><b>Budget Setup</b>
            Setting up a budget.
          </li>
          <li><b>Obscure Corners</b>
            Various obscure corners of the application may be
            non-intuitive, and need wizard help.  e.g. stock splits?
            e.g. using foreign currency on a business trip?  
          </li>
	</ul>
	<b>Completed:</b>
        <ul>
          <li>
            <b>New User Setup</b> Provide
            a default Chart of Accounts, which will mostly consist
            of a default set of 'Categories' (Income/Expense
            Accounts). These are categories such as "Automobile
            Expense", "Bank Interest Income", and "Employment
            Income". The user should be able to select a default
            set of accounts, and have those created
            automatically.  Profiles: home-owner vs. renter
            non-for-profit (some non-profits are very very simple, 
            just a club).   Done in version 1.6.0, C. Champagne,
	    J LewisMoss
          </li>
          <li><b>QIF Import</b>
            QIF Import is just complicated enough that it needs 
            a wizard walk-through of the steps.  Grib,
	    version 1.6.0, Done.
          </li>
        </ul>
        <p></p>


      <dt><a name="arrangements"><b>Arrangments</b></a></dt>

      <dd>
        An "application arrangement" is the defining look-n-feel of an application.
        The idea is similar to, but not the same as 'skins'/'themes'.  Its similar
        to, but not the same as allowing a user to set 'preferences'.  Its similar 
        to, but not the same as, allowing a user to generate customized financial 
        reports.  In the context of GnuCash, a 'arrangement' should be a file
        (that can be traded by users, uploaded and shared) that controls important
        aspects of how the application is configured.
        <p>
        In particular, the GnuCash Arrangement should include the following:
        <ul>
        <li>A list of sample/initial accounts.  These might be tailored for a 
            home user (groceries, gas, electric), an apartment dweller 
            (rent, laundry), or different kinds of business users.
            Because these sample accounts appear in the Arrangement file, 
            it becomes easy to create & distribute customized arrangements.
        <li>A list of pre-defined reports and graphs.  The kind that you'd find
            for a home user might be different than for a person managing a stock
            portfolio, which is in turn different from what a business might need.
            The Arrangement File should include install-specific customizations, such 
            as the report headers, footers, etc.
        <li>Hint of the day.  The types of 'hint of the day' would be different 
            for new users, than it would be for advanced users.  Thus, different
            arrangements would have different catalogues of 'hint of the day'.
        <li>Menu Contents & Navigation.  New users might be presented with a simple set
            of menu contents.  'Power Users' might be presented with deep, nested
            sets of menus, with oodles of features.
        <li>Register Layout.  The layout of the register might be customized for
            different countries: e.g. in Germany, a different type of electronic
            banking seems to require the display of account numbers in separate
            columns in the register.
        </ul>
        A good arrangement infrastructure will not only allow gnucash to be configured
        for different application domains, but also will allow users to fine-tune
        thier own prefered arrangement.   It can also simplify the code base: 
        instead of having two products, a home-user application, and a small-business 
        application, each with a different code base and #defines and what not, instead,
        we have one code base, and different arrangments for each.
        However, most importantly, the arrangments should be easy to share between users.
        They should be such that users are encouraged to trade and use arrangments,
        and to create new ones that suit thier needs.
        </p>
        <p>
        The idea for arrangements was inspired by 
        Adam Curry's commentary on
        <a href="http://adamcurry.editthispage.com/stories/storyReader$161">
        radio formats and Napster</a>.
        </p>
	<p>
	<b>Status:</b>
	Not started. Individually, all these cusomizable things exist
	here and there in gnucash, but they cannot be shared between
	users: a gnucash user cannot mail her favorite 'arrangement'
	to her freind.
	</p>


      <dt><a name="userpref"><b>User Preferences, Session Management</b></a></dt>

      <dd>
        A dialog system and file format for manipulating user
        preferences. Preferences include things like default
        currency, register layout and colors, etc. 

        <p>What are some of the competitive preference-handling
        technologies? Lets get some URL's here ... Following the
        Unix tradition, there is no global preferences registry.
        Note that session management and preferences are related
        things ... sort-of. Right now, we don't treat them as such
        ...</p>

        <p><b>Status:</b></p>
	Done, more or less, version 1.6.0.

        <ul>
          <li>Works real good; lots of preferences in the GUI.
              Implemented in home-grown scheme. (version 1.4.0,
	      rlb)</li>

          <li>These are saved in the '.gnucash/config.auto' file.
              The current file format is raw scheme code, rather
              delicate to tweak by hand ...</li>
	  
          <li>Session management mostly works, but doesn't use the 
	      sawmill/gnome/X ICCCM system.  GnuCash remembers MDI
	      based reports, restart reopens in same state. Sizes
	      and shapes and positions are remembered.
	      Done in version 1.6.0
              </li>

          <li>Independently of session management, the register
              windows should remember how big they were last time they
              were popped up, and they should pop up the same size, again.
              The app should remember these sizes from invocation to
              invocation. Done in version 1.6.0, but seems a bit buggy.
	      </li>

        </ul>
        <br>
        <br>
      </dd>

      <dt><a name="architecture"><b>Architecture Review</b></a></dt>
      <dd>
        The application is wired together partly with C, partly
        with Scheme. The architecture of the wiring and how scheme
        is fit in needs to be reviewed, with a general overview
        created so that additional extensions may be added in a
        straightforward manner. 

        <p>The overall architecture is envisioned thus:
        All code, including the transaction engine, the file I/O
        routines, the menus, and the ledger, will be abstracted
        into compact modules that can function independently of
        each other. At the highest level, there will be a
        infrastructure with extension language interfaces that will
        "wire together" the various modules.</p>

        <p>Such "wiring together" will consist of a dispatch
        infrastructure that will allow arbitrary menu entries to be
        hooked to arbitrary modules. The configuration for menu
        entries, and their associated callbacks, will be specified
        in an extension-language configuration file. At the final
        stages, it is <em>highly</em> desirable to be able to, in
        some manner, import new modules <em>without</em> requiring
        that the application itself be recompiled and relinked.</p>

        <p><b>Status:</b></p>

        <ul>
          <li>
            Scheme/Guile is the central extension language.  Guile
            interfaces auto-generated using g-wrap.
          </li>
          <li>
            Optional interfaces to the data engine (for, e.g.
            perl) can be generated using 
            <a href= "http://starship.skyport.net/crew/beazley/swig.html">
            SWIG</a>.
          </li>
          <li>
            Dave to collate & edit architecture documents. 
            RLB to provide diagrams.
          </li>
        </ul>
        <br>
        <br>
      </dd>

      <dt><a name="alerts"><b>Recurring Transactions, Calendar Alerts,
          Scheduled Transactions</b></a></dt>

      <dd>
        (1)Add support for automatic, recurring transactions, <em>
        e.g.</em> mortgage payments, fixed-interest bonds, regular
        salary checks, regular gas/phone/electric bills, <em>
        etc.</em> 

        <p>(2) Recurring bills, salary income, etc. are simpler to
        handle, since they don't have interest rates, balloons,
        etc. They do/will have multiple splits (<em>e.g.</em>
        payroll gross, fica, futa, income taxes, payroll net).</p>

        <p>(3)Provide list of upcoming &amp; recently paid
        bills/scheduled payments/scheduled deposits for the next
        1,2,3,6,12 months. Historical view shows payments crossed
        out (!?)</p>

        <p>(4)Loans &amp; mortgages are one of the more complicated
        recurring transactions.  Typically, there might be a years
        worth of smaller payments, then a long string of larger
        payments, followed by a balloon.
        </p>
         
        <p>(5)Provide a calendar-display of upcoming &amp; past
        scheduled payments. Clicking on a calendar day should raise
        up editable list of transactions. Calendaring should
        include generic red-lettering of important dates: taxes
        due, insurance renewal dates, domain registration renewal
        dates, ISP contract expiration date :-). These may or may
        not be associated with transactions. Memo's should be
        possible. Pop-ups should happen when dates get close.
        Technology: best bet is the Ximian Evolution Calander
	component.</p>

        <p><b>Design Notes:</b> Most alerts &amp; data storage
        should be driven out of the engine. This will enable
        multi-user, distributed use. <b>Note:</b> alerts should be
        piggy-backed on a general alert infrastructure within the
        engine, viz, registered callbacks when balances change, so
        that windows can be redrawn. Not clear on if/how calendar
        events might be server-ified. (On the other hand, a good
        calendar should be server-ified, and thus viewable by
        secretaries, co-workers, etc.)</p>

        <p>More complex financial instruments may need a
        guile-based extension mechanism to compute values ....
        simple interest/mortgage calculators should be done in C in
        the engine ... (<em>e.g.</em> depreciation schedules ...
        under us tax law, a variety of different schedules are
        allowed ... )</p>

        <p>May need interfaces to email for emailed alerts.</p>

        <p>Plot forecast graphs based on scheduled income &amp;
        payments ... is this tied into budgeting ????</p>

        <p><b>Status:</b></p>

        <ul>
          <li>Need to create design doc, need to implement engine
          pieces, need to hunt down gnome-calendaring bonobo.</li>
          <li>Preliminary work started.
        </ul>
        <br>
        <br>
      </dd>

      <dt><a name="budget"><b>Budgeting</b></a></dt>

      <dd>
        Ability to create a budget (<em>i.e.</em> - estimates of
        future expenditures). Reconcile actual expenditures against
        future expenditures. Create simple, step-by-step 'financial
        plan' budgeting GUI's: 

        <ul>
          <li>Home purchase planner</li>

          <li>Retirement planner</li>

          <li>College tuition planner</li>

          <li>Debt reduction planner</li>

          <li>Scrimp-n-Save planner</li>

          <li>Special purchase planner (big ticket items)</li>
        </ul>
        Create a summary budget/track-record budget report that a
        professional financial planner/advisor could use. 

        <p>Note that the above 'step-by-step' budgeters will have a
        very very different GUI than what the budgeting system
        required for a small-business might look like.</p>

        <p>Note that the utility of budgets is greatly enhanced by using
        them with '<a href="#classes">classes</a>'. 

        <p><b>Status:</b></p>

        <ul>
          <li>A design doc has been submitted by Bob Drzyzgula.
          Take a look at <tt>./src/budget.txt</tt> in the source
          directory.</li>

          <li>Bryan Larsen has begun work .. it's scheme based ...
          Dave Peticolas has some GUI roughed out ...</li>

        </ul>
        <br>
        <br>
      </dd>

      <dt><a name="classes"><b>Classes</b></a></dt>

      <dd>
        Ability to mark certain journal entries as belonging to 
        a 'class', so that expenses (or income) can be categorized
        in more than one way.  For example, the expense of a trip
        might include food, travel and lodging, and thus be spread over
        three different expense accounts.  None-the-less, we want all
        of these entries to be marked as being in the same class.
        (Alternate names: 'job costing' is the report that's generated,
        'cost center', 'cost pool', 'pooling')
        Note that classes can be particularly useful when used with
        budgets: viz. I set aside $10K in the budget for some activity,
        then deduct the actual costs.  Note that it should be possible
        to roll the remainder over to somehere else (!) 
	<p>
	Confusion: isn't this what the 'action' field is supposed to do?
	The 'action' field is under-utilized.

        <p>
        This requires the following:
        <ul>
        <li>Ability to report by class/action
        <li>Ability to query by class/action.
        </ul>
        </p>

        <br>
        <br>
      </dd>

      <dt><a name="testing"><b>Automated Test Suite</b></a></dt>

      <dd>
         Build automated test suite, including:
         <ul>
           <li>File IO consistency check. Done, 1.6.0, LewisMoss
           <li>Currency math correctness. Done ?? Grib.
         </ul>
        <br>
        <br>
      </dd>

      <dt><a name="quickim"><b>Quicken(TM) Import</b></a></dt>

      <dd>
        Ability to import Quicken QIF files. Both MSMoney and
        Quicken use QIF files to export data.  Need both wholsesale
	data import, and incremental (staged) merge.

        <p><b>Status:</b></p>

        <ul>
          <li>
            Quicken import is implemented and mostly works. 
            (Bill Gribble, Done, in version 1.4.0)
          </li>
          <li>
            Need a QIF Import wizard (there are several non-intuitive
            steps that need to be performed during import.  
            A dialogue wizard seems like the best idea to carry 
            through this process. (grib, done in 1.6.0)
          </li>
          <li>
            Work needs to be done for recurring transactions, etc.
          </li>
          <li>
            QIF processing, as used for on-line banking, is <em>
            in prototype form</em> (for 1.6.1 ??)
            Note that since banks use QIF, the <em>correct</em>
            way to updated 'cleared' reconcile state is through
            QIF on-line import.
            On one side, we have existing recorded transactions;
            on the other, the latest bank statement, in QIF
            format.
            </p>
          </li>
        </ul>
        <br>
        <br>
      </dd>

      <dt><a name="iifim"><b>IIF Import</b></a></dt>

      <dd>
        Ability to import IIF (Intuiut Interchange Format, used by Quickbooks)
	files, quickbooks, some upsacle accounting packages use this format.

        <p><b>Status:</b></p>

        <ul>
          <li>
	    Sample files checked into sample directory.
	    No formal documentation known.
          </li>
        </ul>
        <br>
        <br>
      </dd>

      <dt><a name="quickex"><b>IIF Export</b></a></dt>

      <dd>
        Ability to export Intuit IIF files. 
	The IIF format is more rational than the QIF format,
	and other 'real' accounting apps support IIF.
        Several design alternatives are apparent:

        <ul>
          <li>
            A special 'report' that writes out qif could be
            created. 
            This would use the 'reports' infrastructure to
            generate QIF's.
          </li>

          <li>It is fairly easy to traverse the data in the engine
              to write out qif files. This is not hard. Just do it.
	      </li>
        </ul>
        <br>
        <br>

        <p><b>Status:</b> not started</p>
      </dd>

      <dt><a name="quote"><b>Stock Quotes, Price Quotes</b></a></dt>

      <dd>
        Add ability to obtain stock, mutual fund, and currency trading
        data from news agencies, web pages.  
        Add ability to download historical prices as well.
        (<em>e.g.</em> get 5-year history of mutual fund
        performance vs. DJIA).

        <p>Right now, stock prices are stored in a separate, simple pricedb.
        </p>

        <ul>
          <li>Prices need to have several different status states.
	      One state is 'critical/audited', i.e. reviewed by a human,
	      and important for understanding a historical transaction.
	      Less mportant may simply be 'audited': i.e. reviewed by a 
	      human, but not a critical price.  Lowest level: 'live data'
	      something that was gotten off the net, may be wrong, may 
	      be right, who knows, who cares.
          </li>
	  
          <li>Add to this the idea that we should probably store other
              'technical' stock data, such as share volume, high/low/close,
              daily volatility, etc.
          </li>

	  <li>Need access to historical quotes, for graphing charting 
	      of historic portfolio perfformance.
          </li>
        </ul>

        <p><b>Status:</b></p>

        <ul>
          <li>
          <a href="http://sourceforge.net/project/?group_id=4232">
          Finance::Quote.pm</a> is now a separate development project at
          SourceForge.  Its a perl module.
          It can obtain stock quotes from Yahoo 
	  (NYSE), Yahoo-Europe, Fidelity Investments, T.Rowe Price, 
	  TIAA-CREF, others. Also handles currency exchange rates.
	  </li>
	  
	  <li>A scheme wrapper allows prices to be
	  fetched from GUI. Done, version 1.6.0, rlbrowning.</li>
	  
          <li>
          Commandline-flag replaces script file <tt>gnc-prices</tt> 
	  perl script). Suitable for use with cron jobs.
	  (version 1.6.0)
          </li>

          <li>A separate, historical-quote module can be found at the
          <a href="http://sourceforge.net/project/?group_id=2403">QuoteHist</a>
          sourceforge site.  It might be a good idea to fold this
          together with the Quote.pm  module !?
          </li>
        </ul>
        <br>
        <br>
      </dd>

      <dt><a name="install"><b>Install</b></a></dt>

      <dd>
          Install on Redhat, Caldera, Corel, SuSE, FreeBSD, TurboLinux,
          etc.  Possibly use a 'configure'-like way of dealing with
          install inconsistencies.
        <p></p>
      </dd>

      <dt><a name="currency"><b>Multiple Currencies</b></a></dt>

      <dd>
           Need to support multiple currencies. 
           Work is needed in the GUI. The engine currently supports
           multiple currencies by treating them as securities, thus
           allowing currency trading. The currency-trading register
           needs a complete overhaul as it is obtuse and
           unintuitive. Weird stuff is in weird columns.
        </p>
        <p>
           A simplified way of dealing with one-shot currency
           exchanges needs to be implemented, essentially just a
           simple calculator pop-up.  This might be handy for the 
           occasional business traveler or tourist with some minor 
           currency trades.
        </p>
        <p>
           Implement the 'correct' way of handling this when user
           is working in multiple currencies on a regular basis.
        </p>
        <p>
           <a href="http://www.cloanto.com/specs/seriff.html">SERIFF</a>
           Simple Exchange Rate Information File Format.  Completely
           *.ini-centric in layout and design, but otherwise seemingly
           quite complete. 
        </p>

        <p>
        <b>Status:</b> 
           <ul>
           <li>Need to rethink whether the one-shot exchanges
               should in fact be recorded full-fledged in the engine.
               Also: Euro support is currently hacked in: the EURO is treated as
               a 'special' currency. Virtually all the Euro code can be fully
               generalized (and should be).
           <li>New split architecture should store quantity and value, and 
               never the price.  This will simplify currency movements 
               between accounts, without requiring/forcing the use of a 
               currency trading account.  (this also solves problems with 
               rounding that occur when a price is explicitly specified.)
               Grib & dave are working this for next release.
           </ul>
        </p>
     
      </dd>

      <dt><a name="double"><b>Forced Double-Entry</b></a></dt>

      <dd>
        The system supports double-entry: every transaction
        indicates a pair of accounts: one is debited, and one is
        credited. 

        <p>Double-entry is a powerful way of ensuring the integrity
        of of the financial data. Currently, while double-entry is
        supported, its use is not enforced: the user <em>can</em>
        create dangling transactions, where only one account is
        indicated.</p>

        <p>Although this is acceptable for home use (arguably
        desirable, since it allows the casual user the simplicity
        they desire), it is not acceptable for business use. (The
        counterargument is that casual users that aren't
        accountants need all the help at getting things right that
        they can get.)</p>

        <p>It must be possible to enforce double entry, so that a
        transaction cannot be completed until two accounts have
        been specified.</p>

        <p><b>Restricted Double</b> Note that sometimes, the words
        'single-entry' have a an alternate meaning: they can mean
        'a double entry account which can only be credited, or
        debited, but not both'. We need to implement this.</p>

        <p><b>Current status:</b>

        <ul>
          <li>April 1998 -- The engine has a couple of flags in it
          that control double-entry behavior: it can be made lax or
          strict, however, they are compiled in, and there is no
          way to change them from the GUI.</li>

          <li>Dec 1998 -- Scrubber functions implemented to crawl
          through data, and find all unbalanced or orphaned
          transactions.</li>

          <li>May 2000 -- Default will be changed to double-entry
          always. It will not be possible to disable this and move
          to single-entry.</li>
        </ul>
        </p>
      </dd>

      <dt><a name="401K"><b>401(k), Retirement Savings Plans</b></a></dt>

      <dd>
        401K, 403, IRA, Roth IRA, SEP, Keogh ... 
        Retirement Savings Plans often do not put a high
        priority on tracking costs, as the tax implication is that
        amounts are taxable upon withdrawal, meaning that there is
        little necessity to track capital gains. (huh??)
        <p>
        </p>
      </dd>

      <dt><a name="note"><b>Annotate with News Stories</b></a></dt>

      <dd>
        Download, save, annotate investment news and research. 
        Provide a way of storing news stories with accounts, and
        possibly annotating individual transactions in the same
        way.
        <p></p>
      </dd>

      <dt><a name="searchdocs"><b>Searchable Documentation</b></a></dt>

      <dd>Need to add a 'meta keyword' tag to the documentation
        pages, this will help the search engine (<em>e.g.</em> 
        <a href="http://www.htdig.org/">htdig</a>) better categorize the
        help. <a href="http://www.senga.org/mifluz/html/">Mifluz</a>
        might be more embeddable ... I am told that htdig-API is in
        good solid condition for this, but undocumented.
        <p>

	<b>Status:</b>
	Done, using a simple keyword search, homegrown.  The only 
	problem is it doesn't support compound expressions.
	</p>
      </dd>

      <dt><a name="reconcile"><b>Reconcile Auditing</b></a></dt>

      <dd>When a collection of transactions get processed through the
        reconcile dialogue, user needs to be able to add a note to this,
        i.e. this set of JE's will be treated as a group.  The note
        (and date) can be later called up as a part of an audit
        procedure.  The act of reconciliation is treated as a
        historical event that needs to be logged.
        <p></p>
      </dd>

      <dt><a name="loan"><b>Loan and Mortgage Calculators</b></a></dt>

      <dd>
        Provide a variety of simple GUI utilities to allow user to
        calculate the future value of loans, mortgage payments,
        interest payments, etc. 

        <p> Consider the following dialogue layout:</p>
<pre>
loan amount $_____________ currency _________ (pull-down menu)
Remaining balance $___________
Payment amount $___________
balloon  payment $_____________
other payment $________  (e.g. escrow, tax)
Payment frequency (weekly/monthly/bimonthly/quarterly/yearly)
loan start date mm/dd/yy   length -----(weeks/months/years/payments)
loan time left (number of days/weeks/months, rounded)
number of payments left
interest rate  %__________________
payee ____________
pay-from account __________________
next due date mm/dd/yy
</pre>
        Note that in the above, not all fields are independent:
        some can be calculated from others. The <tt>other
        payment</tt> should bring up a mini-register, allowing user
        to add any number of splits.<br>
        <br>
         
        <p><b>Status:</b></p>

        <ul>
          <li>There is an implementation of the calculation routines by
              Terry Boldt in the development branch. There is an initial
              GUI implementation of the calculator by Dave.
          </li>
        </ul>
        <br>
        <br>
      </dd>

      <dt><a name="overdraft"><b>Overdraft Alerts</b></a></dt>

      <dd>
        Overdraft alerts are pop-ups that pop up whenever the user
        enters a transaction that would move an account below some
        minimum balance, or above some max balance (for a bank
        account) or an expense/spending limit is reached (on an
        expense account). A similar but different alert can be
        implemented for price highs &amp; lows. Note that these
        alerts do <em>not</em> require any sort of calendaring or
        recurring transaction support. 

        <p>Design requirements: implement multiple (not just two)
        alerts for any account type. Alert should consist of</p>

        <ul>
          <li>value point or price point</li>

          <li>movement direction</li>

          <li>'is active' boolean flag (<em>i.e.</em> Should be
          possible to 'turn off alert' without deleting it)</li>

          <li>memo text</li>
        </ul>

        <p><b>Status:</b>
        <ul>
          <li>Not Started.</li>
        </ul>
        </p>
      </dd>

      <dt><a name="tech"><b>Technical Stock Analysis</b></a></dt>

      <dd>Provide technical stock analysis graphs, <em>e.g.</em>
          volume, 90 moving avg, beta, etc. See gstalker for example of
          how to do it ...
          <p></p>
      </dd>

      <dt><a name="sink"><b>Asset Depreciation, Sinking Funds, 
           Amortization Schedules</b></a></dt>

      <dd>Need to
          support different depreciation schedules (see IRS books for
          that).  Asset depreciation is complex; there are many
          different depreciation schedules, and these vary from 
          country to country, and change when new tax laws are
          implemented. It might be hard for free software to provide
          a no-cost subscription to updated depreciation modules.
          <p></p>
      </dd>

      <dt><a name="ofx"><b>OFX support</b></a></dt>

      <dd>
        Provide the SGML DTD parsers to handle the OFX reports that
        many banking institutions are providing, or will soon be
        providing, to retail customers. See below for OFX
        references. 

        <p>OFX is an open spec from Microsoft, Intuit, and
        Checkfree, and which will be supported by Integrion. The
        OFX DTD's are included in the 1.1 distributions. See <a
        href="http://www.ofx.net">OFX Home Page</a> for
        details.</p>

        <p>There are two ways to build an OFX parser. One way is to
        build a compile-time DTD parser that treats the DTD as if
        it were an IDL, and generates C language stubs for a
        parser. This approach was attempted and abandoned because
        it leads to fragile C code and a very large binary.</p>

        <ul>
          <li>The parser is fragile because minor DTD
          non-compliances are hard to parse, handle and recover
          from.</li>

          <li>The parser is huge because the DTD results in
          hundreds of (C++) objects being generated.</li>
        </ul>
        The other method would be to perform run-time DTD parsing.
        This is attractive particularly because it is a more
        commonly-used approach; there are a variety of XML tools
        available that provide this function. 

        <p>Run-time parsing may be slower, but on the OFX client
        side, this should not be a bottleneck.</p>

        <p><b>Status:</b></p>

        <ul>
          <li>A compile-time parser was developed and
          abandoned.</li>
        </ul>

        <p>Note that the organizations developing OFX are looking
        to use XML as their "formats of the future;" this may
        encourage the use of one of the many XML parsers available
        for UNIX.</p>
      </dd>

      <dt><b>Other on-line support</b></dt>

      <dd>
<pre>
&gt;&gt; the German T-Online
&gt;&gt; homebanking system BTX.
&gt;&gt;
&gt;&gt; I Germany we have a very popular online homebanking system,
&gt;&gt; based on the T-Online BTX (Datex-J) system. All of the
&gt;&gt; commercial homebanking software packages like MS-Money or
&gt;&gt; Quicken work with that online system. With that system,
&gt;&gt; you can retrieve  account data from your bank, and also
&gt;&gt; send your transfers.
&gt;&gt;
&gt;&gt; I am using since more than 2 years a GPL software written
&gt;&gt; by a former colleague of mine, Niek Busscher, to work with
&gt;&gt; the T-Online homebanking system. That software package with
&gt;&gt; the name ZKA4BTX is very unknown, since Niek published it only
&gt;&gt; by email.
&gt;&gt;
&gt;&gt; Some words to the features of ZKA4BTX :
&gt;&gt;
&gt;&gt;  - Completely written in Tcl
&gt;&gt;  - Uses Xcept as a BTX browser
&gt;&gt;  - Retrieve account data from multiple banks
&gt;&gt;  - Send transfers, using TAN
&gt;&gt;  - Export retrieved account data to CBB, Xfinans and QIF files      
&gt;&gt;  - Export retrieved account data to CBB, Xfinans and QIF files
&gt;&gt;
&gt;&gt; With a simple click to an icon on my desktop, ZKA4BTX logs into
&gt;&gt; T-Online, gets all my account datas from several banks, and writes
&gt;&gt; (adds) it to my CBB, Xfinans or GnuCash (QIF) files.
&gt;&gt;
&gt;&gt; Another very important thing is that I can do all my transfers
&gt;&gt; offline, editing a transfer sheet, and ZKA4BTX sends these
&gt;&gt; transfers in one step to my bank.
&gt;
&gt;One thing we could do in the short-medium term is have gnucash
&gt;launch ZKA4BTX to get the data, export it to QIF, and then load
&gt;it in, all through one command.
</pre>
      </dd>

      <dt><a name="tab"><b>Tab-delimited ASCII file format</b></a></dt>

      <dd>
        People <em>like</em> to be able to read file contents in
        ASCII; there are many Unix tools for manipulating ASCII. An
        ASCII equivalent of the current file format should be easy
        to develop ... just substitute the writes with <tt>
        printf()</tt>s. 

        <p>The tab-delimited format should be compatible with that
        of <tt>/rdb</tt>, aka <a href=
        "ftp://ftp.rand.org/pub/RDB-hobbs/">RAND/Hobbs /rdb</a> or
        <a href=
        "ftp://ftp.linux.it/pub/database/RDB/nosql-0.8.tar.gz">
        NoSQL.</a> (NoSQL is available as part of the <a href=
        "http://www.debian.org">Debian GNU/Linux</a> distribution,
        for instance.)</p>

        <p>The <tt>/rdb</tt> format is thus:</p>
<pre>
field-name  tab  fieldname  tab fieldname   \n
------------------------------------------  \n
value       tab   value     tab value       \n
value       tab   value     tab value       \n
etc ...
</pre>

        <p>It is a very simple, very basic flat table format. The
        use of <tt>/rdb</tt> with GnuCash should try to match with
        SQL schemas as much as possible in order to minimize I/O
        complexity and incompatibility.</p>
      </dd>

      <dt><a name="tax"><b>Tax Preparation</b></a></dt>

      <dd>
        Gotta prepare those taxes. 
        W-2, W-3, 941, 940 Processing.

        <ul>
          <li>
            TurboTax --
            categorize items according to different tax
            schedules
          </li>

          <li>VAT -- Value Added Tax. Varies from country to country.
          </li>

          <li>Estimate income taxes.
              Estimate itemized deductions, find potential
              deductions, categorize them</li>
        </ul>
        <p></p>
      </dd>

      <dt><a name="palm"><b>Sync with Palm Pilot organizers</b></a></dt>

      <dd>There are Quicken-workalikes that run on the
          PalmComputing platform; it would be good to inter-operate
          with this. See
          <a href="ftp://ryeham.ee.ryerson.ca/pub/PalmOS/">PalmLink</a> 
          and <a href="http://www.orbits.com/Palm/">Palm & Linux</a>.
          <p></p>
      </dd>

      <dt><a name="emerg"><b>Emergency Records Organizer</b></a></dt>

      <dd>Put together a single-page report showing critical info
          about accounts, etc.
          <p></p>
      </dd>

      <dt><a name="logging"><b>Logging, Crash Recovery</b></a></dt>

      <dd>
        Logging serves two purposes: (1) return the system to the state
        it was in on some earlier date.  (2) recover from a crash.
        Probably need two distinct mechanisms to support this.  The
        mechanisms are (A) backup copies. These can be compactly handled
        via RCS (actually, deltax) for storage.  (B) Logging.  Write
        out to disk each & every change made.
        </p>
        <p><b>Status:</b>
        <ul>
          <li>Crude transaction logging/auditing in place; should
          be suitable for error/crash recovery but has not been
          "tried by fire."</li>

          <li>Backup files automatically created and
          time-stamped.</li>
        </ul>
        </p>

        
      </dd>

      <dt><a name="engine"><b>Enriched Engine, Financial Objects</b></a></dt>

      <dd>
        The current system makes a distinction between the data
        (account, transaction) and they GUI that displays it. The
        data is embedded within and controlled by the "Engine",
        which is a set of routines to access accounts,
        transactions, etc. The engine serves as a kind of a dynamic
        cache between the permanent data repository (file, sql db)
        and the GUI. 

        <p>The current engine is rather simple: it provides support
        for accounts, account hierarchies and transactions
        consisting of multiple entries.</p>

        <p>Many of the features described elsewhere will require
        that the engine have a far richer, more sophisticated data
        model, including such things as:</p>

        <ul>
          <li>Linking to "Address Info" ( <em>e.g.</em> names,
          addresses)</li>

          <li>Transaction identifiers</li>

          <li>Part numbers, SKU IDs</li>

          <li>Interest rates</li>

          <li>Budget policy</li>
        </ul>

        <p>Note: it makes no sense at this point to make the engine
        API much richer than what the GUI can currently
        support.</p>

        <ul>
          <li><b>Locks</b> When splits are implemented, and the
          parent transaction has been marked as cleared/reconciled, 
          the record
          should be locked, so that further modifications to the
          amount can't be performed (or at least, a warning is
          generated to prevent accidental garbaging up of old
          transactions).</li>
        </ul>

        <p><b>Current Status:</b></p>

        <ul>
          <li>
            <tt>BeginEdit()/RollbackEdit()/CommitEdit()</tt>
            routines mostly in place, 
            these "Transaction processing constructs" should
            simplify creation of an SQL back end, or some other
            more sophisticated transactional server.
          </li>

          <li>Multiple currency support is present but still pretty
              "raw."</li>

          <li>Query engine has been broadly extended (Bill Gribble).
              Documentation for Query Engine??</li>

        </ul>
        <p></p>
      </dd>

      <dt><a name="sql"><b>SQL I/O</b></a></dt>

      <dd>
        A module is necessary to allow data to be fetched from an
        SQL database, and for that database to be updated. 
        There has been <em>much</em> discussion about this on
        mailing lists both for GnuCash and 
        <a href="http://www.menet.umn.edu/~curt/cbb/">CBB.</a> 
        Major points have included:

        <br>
        <br>
        <ul>
          <li>The use of a database allows only that data which
              is actually <em>in use</em> to be loaded into
              memory.  This permits managing larger sets of
              transactions more efficiently.
          </li>
          <br><br>

          <li>It also allows data to be pushed out to the DBMS
              <em>immediately after entry,</em> rather than waiting
              for the user to "save the books."
          </li>
          <br><br>

          <li>Using a client/server SQL database might make it easier
              to turn GnuCash into a multi-user system.
          </li>
          <br><br>

          <li>By using a well-known DBMS, outside programs are
              provided a well-defined way of getting at, and
              perhaps even modifying, GnuCash data. 
              (Actually, this is not true: GnuCash already provides
              a uniform, well-documented, preferred data access API.  
              As long as this
              API is used, there is some guarantee that data is stored
              in a self-consistent fashion.  Not using the GnuCash 
              programming interfaces risks corrupting the data.
              Direct access to the data is dangerous and discouraged.
              Furthermore, The API is guaranteed to be backwards
              compatible with a variety of data storage formats.
              Due to enhancements, the actual form of the data stored in
              a flat file, or in the SQL database, may change without 
              warning.)
          </li>
          <br><br>
          <li>
            Those SQL databases available on Linux tend to involve
            considerable <em>administrative</em> overhead in terms
            of getting them set up. 
            This may be a minor cost to a business enterprise
            that routinely hires Database Administrators.
            It is <em>not</em> acceptable to require this of
            naive users that may find "simple" things like
<pre>
% su -
Password:
# cd /tmp
# rpm -i gnucash-4.1.3.i386.rpm
# exit
</pre>
            to be challenging.
          </li>
          <br><br>

          <li>
            It might be useful to use an embedded database engine
            like unto <a href="http://www.sleepycat.com/">Sleepycat
            DB</a>, 
            <a href="ftp://koobera.math/uic.edu/www.cdb.html">cdb</a>,
            or something like 
            <a href="http://www.opengroup.org/public/prods/dmm4.htm">
            ISAM</a> (Note CQL++ supports ISAM access methods), or
            even an embedded SQL engine such as 
            <a href="http://www.ispras.ru/~knizhnik/gigabase.html">
            GigaBASE</a>. 
            The reasons to do so include ... ???
          </li>

          <br><br>
          <li>
            GnuCash presently uses a document-oriented model, where
            the <em>entire</em> set of books are loaded in, and
            dumped out, all at one fell swoop. 
            GnuCash needs to be modified to access the database
            in a transactional manner. This is at least partly
            implemented with the <tt>Begin()/End()</tt> constructs
            in the engine.

            <p>
            Some transactional thoughts: entire SQL
            tables/databases do not need to be locked while the
            user is editing a transaction via the GUI.
            Instead, an optimistic approach, similar to that
            employed by CVS (concurrent version system, a mechanism
            for storing versions of source code) could be used: if
            the edits conflict with changes made by others, edits
            are be rejected en-masse, allowing the user to merge
            and correct their changes.
            Important note: updating SQL does <em>not</em>
            require locks to be held for extended periods of
            time!
            </p>
          </li>

          <li>
            The SQL engine chosen should be fully transactional,
            passing the 'ACID' test (Atomicity, Consistency,
            Isolation, Durability). 
            Note that 
            <a href="http://openacs.org/why-not-mysql.html">MySQL 
            does not satisfy the 'ACID' criteria</a>.
          </li>
        </ul>
        <p>
	<b>Status:</b>
	Done, more or less, gnucash version 1.6.0, Linas Vepstas.
	Theres still a laundry list of things that need to be 
	cleaned up, see the README file in src/engine/sql/README.
	
	</p>
      </dd>

      <dt><a name="multiuser"><b>Multi-user Support</b></a></dt>

      <dd>
        Multi-user support should be added with either an SQL
        backend to the engine, and/or through CORBA interfaces to
        the engine. 
        Another possibility is to create a web application
        server, and have users do much/most of I/O via a web
        interface, possibly using the register object as a browser
        plugin.
        The following industrial-strength features are
        needed:
        <br><br>

        <ul>
          <li>transaction-oriented queuing of updates</li>

          <li>event subscription channel for updates</li>

          <li>user authentication</li>

          <li>user authorization</li>

          <li>non-repudiability (needed only for peer-to-peer??)</li>

          <li>encryption of network connections</li>
        </ul>
        <p>
	<b>Status:</b> Partly done.  (gnucash 1.6.0, Linas)
	The postgres backend fully
	supports multiple simltaneous users. This includes 
	events for automatic updates of all GUI displays.
	However, the GUI support is rough, no GUI dialog 
	for user/password.  
	</p>
      </dd>

      <dt><a name="addressbook"><b>Address Book</b></a></dt>
      
      <dd>
        Provide support for client/vendor/customer address books,
	including street addres, eamil, phone.  Also: to-do lists,
	a mini-contact manager (when is last time this person 
	was paid? what did they say on phone the last time we 
	sent them a check? Is there a dispute?)
	<p>
	Propose: use Ximian Evolution contact manager/to-do lists.
	</p>
      </dd>
      
      <dt><a name="arap"><b>Accounts Payable, Receivable</b></a></dt>

      <dd>Add features to track sales receipts and other pending
          sources of income, as well as owed sums.  
          <ul>
          <li>Need new account type 'ar' and 'ap'.  When this account type is
              selected, the register display, etc. is slightly different, as below:
          <li>Add field to register called 'date due'.  The date could be
              entered as 'date of transaction +30days'. etc.  The account
              could have a default: entries always default to +30 or +45 days
              or whatever.  
          <li>Create a report to match 'date due' to current date, and report
              overdue balances ...
          <li>Create Account aging report: show (average) age of 
              amount-due/amount-owed.   
          <li>Create a projected cash flow report: showing projected
              future payments based on date due.
          <li>Somehow, automatically match invoices to payments.
              When an invoice has been paid off, then there should be a 
              view mode where the invoice and its payment is no longer shown 
              (i.e. so that only outstanding, unpaid entires are shown ...)
          <li>create report showing everything but the a/p:
              Here's an example.  I buy a chair for a friend, and three
              days later he pays me back.  What I've been doing is ...
<pre>
>   1/12/01  Credit    -$100
>            A/R       +$100
>   1/15/01  Cash      +$100
>            A/R       -$100
</pre>
             To make it less painful to read and understand, the 
             report should look like:

<pre>
>   1/12/01 Credit -$100
>   1/15/01 Cash   +$100
</pre>
             i.e. there would be a new kind of 'transaction report' that 
             would pair up transactions in this way, showing things 
             'as if' the A/R didn't exist, and 'as if' a transaction
             was spread over a bunch of days.

          </ul>
          <p></p>
      </dd>

      <dt><a name="payroll"><b>Payroll</b></a></dt>

      <dd>
        Payroll introduces a <em>sizable</em> amount of complexity
        in terms of the need to comply with constantly-changing
        government regulations in whatever country one is in. 
        While the GnuCash "engine" might remain free,
        maintenance of payroll functionality would require
        "subscribing" to an update scheme; it might be troublesome
        to try to provide such a "subscription" free of charge.
        <p></p>
      </dd>

      <dt><a name="invoice"><b>Invoicing</b></a></dt>

      <dd>Invoicing.  Note that invoicing and order entry are 
          closely related.
          Several components:
        <ul>
        <li>Record an invoice. Assign it a serial number.  Be able
            to reprint/report based on invoice serial number.
        <li>Invoice associates customer name to set of transactions.
            Need to deal with PIM issue.  I.e. need to integrate
            with high-function PIM or CRM interface.
        <li>Allow historical browsing of invoices customer by customer.
        <li>To visually design an invoice, need to have a
            mini-word-processor/simple drawing plug-in. Is
            Abisource/Abiword a candidate? Probably needs bonobo...
        </ul>
      </dd>

      <dt><a name="order"><b>Order Entry</b></a></dt>

      <dd>
        Mini-GUI allowing users to type in orders.
        <ul>
        <li>Should interface to parts/inventory database to confirm 
            item availability, (maybe recommend additional production)?
            inventory should be updated after order placement.
        <li>Automatically update accounts receivable.
        <li>Allow order revision/update (esp. as partial orders are shipped).
        <li>Orders can be invoiced when entered (simple invoicing), or
            placed on account (double invoicing).
        <li>Allow back-orders to be printed customer-by-customer, or by 
            product/item.
        <li>Allow printing of packing slip.
        </ul>
        <p></p>
      </dd>

      <dt><a name="estimate"><b>Job Costing</b></a></dt>

      <dd>Ability to prepare and track estimates.
          <ul>
          <li>Allow estimate/bid to be converted to a firm order & get invoiced.
          </ul>
          <p></p>
      </dd>

      <dt><a name="expense"><b>Expense Accounts</b></a></dt>

      <dd>Expense Account Automation, including air, car, hotel,
          dining. Receipts, reservations, cancellations.
          <p></p>
      </dd>
    </dl>

    <h1>References</h1>
    All software and technical standard references have been moved to
    <a href="http://www.gnucash.org/links.php3">
    http://www.gnucash.org/links.php3</a>

    <hr>
    Draft version 0.51 -- June 2001 
    Linas Vepstas 
    <a href="mailto:linas@linas.org">linas@linas.org</a>
    <br>
  </body>
</html>