diff --git a/debian/.cvsignore b/debian/.cvsignore index 282522db03..78869e52db 100644 --- a/debian/.cvsignore +++ b/debian/.cvsignore @@ -1,2 +1,6 @@ Makefile Makefile.in +tmp +*.debhelper +files +substvars diff --git a/debian/changelog b/debian/changelog index 11d7bd6437..616609e045 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,8 +1,8 @@ -gnucash (1.5.2.cvs20001210-0.1) unstable; urgency=low +gnucash (1.5.2.cvs20001218-0.1) unstable; urgency=low * local compile - -- James LewisMoss Thu, 30 Nov 2000 13:29:17 -0500 + -- James LewisMoss Mon, 18 Dec 2000 19:33:43 -0500 gnucash (1.5.2.cvs20001105-0.1) unstable; urgency=low diff --git a/debian/control b/debian/control index 69c37dbbab..42c4066793 100644 --- a/debian/control +++ b/debian/control @@ -6,7 +6,7 @@ Standards-Version: 3.1.0.0 Package: gnucash Architecture: any -Depends: ${shlibs:Depends}, libwww-perl, slib, scm, guile1.3, libguile6-slib, perl-5.005, eperl +Depends: ${shlibs:Depends}, libwww-perl, guile1.4-slib Suggests: gnuplot Description: A personal finance tracking program. Gnucash can track finances in multiple accounts, keeping running diff --git a/debian/postinst b/debian/postinst new file mode 100644 index 0000000000..6d78d03634 --- /dev/null +++ b/debian/postinst @@ -0,0 +1,5 @@ +#!/bin/sh + +ldconfig + +#DEBHELPER# diff --git a/debian/rules b/debian/rules index 1c057d06d3..91422033c3 100644 --- a/debian/rules +++ b/debian/rules @@ -69,8 +69,8 @@ binary-arch: build install dh_installmanpages # dh_undocumented gnc-prices.1 gnucash.1x gnucash.motif.1x dh_installchangelogs ChangeLog - dh_strip - cp src/.libs/gnucash $(id)/usr/bin/gnucash.debug +# dh_strip +# cp src/.libs/gnucash $(id)/usr/bin/gnucash.debug dh_compress dh_fixperms dh_suidregister diff --git a/gnucash.lsm b/gnucash.lsm index 1b967925da..c6e73725c1 100644 --- a/gnucash.lsm +++ b/gnucash.lsm @@ -1,6 +1,6 @@ Begin3 Title: gnucash -- simple single-user accounting program -Version: 1.5.0 +Version: 1.4.9 Entered-date: 18JUN99 Description: GnuCash is a personal finance manager. A check-book like register GUI allows you to enter and track bank accounts, @@ -60,13 +60,9 @@ Description: GnuCash is a personal finance manager. A check-book like Keywords: X11 Accounting Finance double entry Author: rclark@cs.hmc.edu (Robin Clark) Maintained-by: linas@linas.org (Linas Vepstas) -Primary-site: http://gnucash.org/ -Alternate-site: http://linas.org/linux/xacc - 885KB gnucash-1.1.22.tar.gz -Alternate-site: sunsite.unc.edu /pub/Linux/apps/financial/accounting/ - 885KB gnucash-1.1.22.tar.gz -Alternate-site: ftp.x.org /contrib/applications -Platforms: Linux/Unix/X Windows/Lesstif/Motif/Mootif/Sparc/Intel/PowerPC +Primary-site: ftp://ftp.gnucash.org/pub/gnucash/sources/stable/ + 3463kB gnucash-1.4.9.tar.gz +Platforms: Linux/Unix/X Windows/Gnome/Gtk/Sparc/Intel/PowerPC Copying-policy: GPL End diff --git a/make-gnucash-patch.in b/make-gnucash-patch.in index 0922eb856d..08e3d31d77 100644 --- a/make-gnucash-patch.in +++ b/make-gnucash-patch.in @@ -1,4 +1,5 @@ #!@-PERL-@ -w +# -*- perl -*- # # This perl script is used to make a patch for your GnuCash # development work. All patches should be submitted to the @@ -12,18 +13,18 @@ use strict; +use File::Basename; + ########################################################### # This section must be configured for your own setup. # ########################################################### # The directory with the original gnucash sources -my $old = 'gnucash.pristine'; +my $old = undef; -# The directory where you do your development -my $new = 'gnucash'; +chomp(my $cwd = `pwd`); -# The directory where the above two directories reside -my $gnc_home = '/usr/src/misc/gnc'; +my ($new, $gnc_home) = fileparse($cwd); ########################################################### # This section should not need to be modified. # @@ -43,40 +44,90 @@ if($ENV{'GNC_MAKEPATCH_HOME_DIR'}) { $gnc_home = $ENV{'GNC_MAKEPATCH_HOME_DIR'}; } + # Switch to the home directory +print "Changing directory to $gnc_home\n"; +chdir $gnc_home or die "Can't cd!\n"; + +if (not defined($old)) { + if (not -f "$new/CVS/Root") { + print "Source not checked out of CVS and no \$old set. Quitting...\n"; + exit(1); + } + if (not -d "tmp") { + mkdir "tmp"; + } + chdir "tmp"; + system("cvs -d `cat ../$new/CVS/Root` co gnucash"); + chdir ".."; + $old = "tmp/gnucash"; +} + +chdir $gnc_home . "/" . $new or die "Can't cd!\n"; +# Start out with our basic makepatch arguments +my @args = ('-verbose', '-diff', 'diff -u', '-exclude-vc'); + +# Add in the exclude patterns from the __DATA__ section +push_exclusions(\@args); + +sub push_exclusions { + my $args = shift; + foreach my $pat () { + chomp($pat); + push(@{$args}, '-exclude', $pat) if $pat; + } + my @cvsignores = `find . -name '.cvsignore'`; + foreach my $one_ignore (@cvsignores) { + my ($name, $path) = fileparse($one_ignore); + open (IG, $one_ignore); + foreach my $fl () { + chomp $fl; + $path =~ s/^\.\///; + push(@{$args}, '-exclude', $path . $fl) if $fl; + } + close (IG); + } +} +# Add the from and to directories for makepatch +push(@args, $old, $new); +print "Arguments are: " . join("; ", @args) . "\n"; + chdir $gnc_home or die "Can't cd!\n"; # Erase the old files -unlink('gnc.diff', 'gnucash.diff.gz', 'gnucash.diff.gz.uue'); +#unlink('gnc.diff', 'gnucash.diff.gz', 'gnucash.diff.gz.uue'); -# Start out with our basic makepatch arguments -my @args = ('-diff', 'diff -u', '-exclude-vc'); - -# Add in the exclude patterns from the __DATA__ section -foreach my $pat () { - chomp($pat); - push(@args, '-exclude', $pat) if $pat; +if (not -d "diffs") { + mkdir "diffs"; } -# Add the from and to directories for makepatch -push(@args, $old, $new); +my $date = `date '+%s'`; +chomp($date); +my $who = `whoami`; +chomp($who); + +my $outfilename = "gnucash-$date-$who.diff"; # Invoke makepatch with standard out redirected to 'gnucash.diff' open(OLDOUT, ">&STDOUT"); -open(STDOUT, "> gnucash.diff") || die "Can't redirect stdout"; +open(STDOUT, "> diffs/$outfilename") || die "Can't redirect stdout"; system('makepatch', @args); close(STDOUT); open(STDOUT, ">&OLDOUT"); - -# Make a copy of the ascii diff in 'gnc.diff' -system('cp gnucash.diff gnc.diff'); +print "makepatch done\n"; # Compress the patch -system('gzip -9vf gnucash.diff'); +if (-f "diffs/$outfilename") { + system("gzip", "-9vf", "diffs/$outfilename"); +} # UU encode the compressed patch # 'gnucash.diff.gz.uue' is the file you send. -system('uuencode gnucash.diff.gz gnucash.diff.gz > gnucash.diff.gz.uue'); +if (-f "diffs/$outfilename.gz") { + system("uuencode diffs/$outfilename.gz $outfilename.gz > diffs/$outfilename.gz.uue"); +} + +print "diffs/$outfilename.gz.uue\n"; exit(0); @@ -100,72 +151,5 @@ __DATA__ *.tar.gz *.wrap *.xac.*.xac +*~ .#* -.deps -.libs -ABOUT-NLS -INSTALL -COPYING -Makefile -Makefile.in -Makefile.init -POTFILES -TAGS -aclocal.m4 -cat-id-tbl.c -conf.h -config.cache -config.guess -config.h -config.h.in -config.log -config.status -config.sub -configure -doc/sgml/C/gnucash/* -doc/sgml/C/gnucash.junk -doc/sgml/C/gnucash.tex -errs* -g-wrap-guile -g-wrap.info -gnc-autogen.h -gnucash-design.html -gnucash-engine-perl5_wrap.c -gnucash-engine-perl5_wrap_int.c -gnucash.engine.i -gnucash.pm -install-sh -intl -lib/finance-quote/blib -lib/finance-quote/pm_to_blib -libgncengine.la -libgwrapguile.la -libgwraprs.la -libtool -ltconfig -ltmain.sh -make-gnucash-patch -po/gnucash.pot -po/Makefile.in.in -stamp-h.in -rpm/gnucash.spec -src/doc/design/texinfo.tex -src/doc/design/gnucash-design.info* -src/doc/design/stamp-vti -src/doc/design/version.texi -src/gnome/glade-cb-gnc-dialogs.c -src/gnome/glade-support-gnc-dialogs.c -src/gnucash -src/gnome/gnucash.keys -src/guile/gnc.c -src/guile/gnc.h -src/guile/gnc.html -src/guile/gnucash.c -src/guile/i18n.h -src/optional/swig/gnucash.engine_wrap.doc -src/optional/swig/libgncswig.la -src/quotes/gnc-prices -src/scm/bootstrap.scm -doc/sgml/C/gnucash -stamp-cat-id -stamp-h diff --git a/src/doc/design/.cvsignore b/src/doc/design/.cvsignore index 71faf993e3..476cc6fa0c 100644 --- a/src/doc/design/.cvsignore +++ b/src/doc/design/.cvsignore @@ -2,7 +2,6 @@ Makefile Makefile.in version.texi stamp-vti - gnucash-design.tps gnucash-design.fns gnucash-design.cps @@ -13,7 +12,7 @@ gnucash-design.tp gnucash-design.vr gnucash-design.fn gnucash-design.cp - *.info *.info-* *.html +texinfo.tex diff --git a/src/engine/Transaction.c b/src/engine/Transaction.c index 6e722ad6cc..0ecb36f567 100644 --- a/src/engine/Transaction.c +++ b/src/engine/Transaction.c @@ -1828,19 +1828,26 @@ xaccTransOrder (Transaction *ta, Transaction *tb) /********************************************************************\ \********************************************************************/ -void -xaccTransSetDateSecs (Transaction *trans, time_t secs) +enum { TDATE_POSTED, TDATE_ENTERED }; + +static void +xaccTransSetDateInternal(Transaction *trans, int which, time_t secs, + long int nsecs) { - if (!trans) return; - check_open (trans); - PINFO ("addr=%p set date to %lu %s \n", - trans, secs, ctime (&secs)); + Timespec *dadate = 0; + if(!trans) return; + check_open(trans); - trans->date_posted.tv_sec = secs; - trans->date_posted.tv_nsec = 0; - - mark_trans (trans); + PINFO ("addr=%p set %d date to %lu %li %s \n", + trans, which, secs, nsecs, ctime (&secs)); + + dadate = ((which == TDATE_POSTED) + ? &trans->date_posted + : &trans->date_entered); + dadate->tv_sec = secs; + dadate->tv_nsec = nsecs; + mark_trans(trans); /* Because the date has changed, we need to make sure that each of the * splits is properly ordered in each of their accounts. We could do that * here, simply by reinserting each split into its account. However, in @@ -1850,70 +1857,45 @@ xaccTransSetDateSecs (Transaction *trans, time_t secs) */ } +void +xaccTransSetDateSecs (Transaction *trans, time_t secs) +{ + xaccTransSetDateInternal(trans, TDATE_POSTED, secs, 0); +} + void xaccTransSetDateEnteredSecs (Transaction *trans, time_t secs) { - if (!trans) return; - check_open (trans); - - trans->date_entered.tv_sec = secs; - trans->date_entered.tv_nsec = 0; - - mark_trans (trans); + xaccTransSetDateInternal(trans, TDATE_ENTERED, secs, 0); } void xaccTransSetDateTS (Transaction *trans, const Timespec *ts) { - if (!trans || !ts) return; - check_open (trans); - DEBUGCMD ({ - time_t sicko = ts->tv_sec; - PINFO ("addr=%p set date to %Lu %s \n", - trans, ts->tv_sec, ctime (&sicko)); - }) - - trans->date_posted.tv_sec = ts->tv_sec; - trans->date_posted.tv_nsec = ts->tv_nsec; - - mark_trans (trans); + if (!ts) return; + xaccTransSetDateInternal(trans, TDATE_POSTED, ts->tv_sec, ts->tv_nsec); } void xaccTransSetDateEnteredTS (Transaction *trans, const Timespec *ts) { - if (!trans || !ts) return; - check_open (trans); - - trans->date_entered.tv_sec = ts->tv_sec; - trans->date_entered.tv_nsec = ts->tv_nsec; - - mark_trans (trans); + if (!ts) return; + xaccTransSetDateInternal(trans, TDATE_ENTERED, ts->tv_sec, ts->tv_nsec); } void xaccTransSetDate (Transaction *trans, int day, int mon, int year) { Timespec ts = gnc_dmy2timespec(day, mon, year); - xaccTransSetDateTS (trans, &ts); + xaccTransSetDateInternal(trans, TDATE_POSTED, ts.tv_sec, ts.tv_nsec); } void xaccTransSetDateToday (Transaction *trans) { struct timeval tv; - - if (!trans) return; - check_open (trans); - gettimeofday (&tv, NULL); - trans->date_posted.tv_sec = tv.tv_sec; - trans->date_posted.tv_nsec = 1000 * tv.tv_usec; - - mark_trans (trans); - - PINFO ("addr=%p set date to %lu %s \n", - trans, tv.tv_sec, ctime ((time_t *)&tv.tv_sec)); + xaccTransSetDateInternal(trans, TDATE_POSTED, tv.tv_sec, tv.tv_usec); } diff --git a/src/engine/io-gncbin-r.c b/src/engine/io-gncbin-r.c index d7b60c60ca..f707a966d2 100644 --- a/src/engine/io-gncbin-r.c +++ b/src/engine/io-gncbin-r.c @@ -157,12 +157,6 @@ static AccountGroup *maingrp; /* temporary holder for file static GHashTable *ids_to_finished_accounts; static GHashTable *ids_to_unfinished_accounts; -#if 0 -/* used while writing */ -static GHashTable *accounts_to_ids; -static gint32 next_write_account_id; -#endif - /** PROTOTYPES ******************************************************/ static Account *locateAccount (int acc_id); @@ -175,16 +169,6 @@ static char *readString( int fd, int token ); static time_t readDMYDate( int fd, int token ); static int readTSDate( int fd, Timespec *, int token ); -#if 0 -static int writeGroup( int fd, AccountGroup *grp ); -static int writeAccount( int fd, Account *account ); -static int writeAccInfo(int fd, Account *account); -static int writeTransaction( int fd, Transaction *trans ); -static int writeSplit( int fd, Split *split); -static int writeString( int fd, const char *str ); -static int writeTSDate( int fd, Timespec *); -#endif - /*******************************************************/ /* backwards compatibility definitions for numeric value * of account type. These numbers are used (are to be @@ -236,17 +220,6 @@ xaccFlipInt (int val) return (int) flip; } -#if 0 -static short -xaccFlipShort (short val) -{ - unsigned short flip; - flip = (val & 0xff00) >> 8; - flip |= (val & 0xff) << 8; - return (short) flip; -} -#endif - static double xaccFlipDouble (double val) { diff --git a/src/engine/io-gncxml-r.c b/src/engine/io-gncxml-r.c index fe70367b2f..8a2f9277f4 100644 --- a/src/engine/io-gncxml-r.c +++ b/src/engine/io-gncxml-r.c @@ -73,47 +73,6 @@ */ -#if 0 -static xmlDocPtr -xml_sax_parse_file_r(xmlSAXHandlerPtr sax, - const char *filename, - int recovery, - void *user_data) { - xmlDocPtr ret; - xmlParserCtxtPtr ctxt; - char *directory = NULL; - - ctxt = xmlCreateFileParserCtxt(filename); - - if (ctxt == NULL) return(NULL); - - if (sax != NULL) { - if (ctxt->sax != NULL) xmlFree(ctxt->sax); - ctxt->sax = sax; - ctxt->userData = user_data; - } - - if ((ctxt->directory == NULL) && (directory == NULL)) - directory = xmlParserGetDirectory(filename); - if ((ctxt->directory == NULL) && (directory != NULL)) - ctxt->directory = (char *) xmlStrdup((xmlChar *) directory); /* !!!!!!! */ - - xmlParseDocument(ctxt); - - if ((ctxt->wellFormed) || recovery) ret = ctxt->myDoc; - else { - ret = NULL; - xmlFreeDoc(ctxt->myDoc); - ctxt->myDoc = NULL; - } - if (sax != NULL) - ctxt->sax = NULL; - xmlFreeParserCtxt(ctxt); - - return(ret); -} - -#endif /* result for a characters handler is shared across all character handlers for a given node. result for start/end pair is shared as @@ -335,20 +294,6 @@ sixtp_print_frame_stack(GSList *stack, FILE *f) { indent += 2; } -#if 0 - for(lp = printcopy; lp; lp = lp->next) { - if(lp != printcopy) fprintf(f, " -> "); - - if(lp == printcopy) { - /* top level node */ - fprintf(f, "[top-level]"); - } else { - sixtp_stack_frame *frame = (sixtp_stack_frame *) lp->data; - fprintf(f, "<%s>", (gchar *) frame->tag); - } - } - fprintf(f, ")\n"); -#endif } static xmlEntityPtr @@ -370,10 +315,6 @@ sixtp_sax_start_handler(void *user_data, if(!pdata->parsing_ok) return; -#if 0 - fprintf(stderr, "Hit start tag <%s>\n", name); -#endif - current_frame = (sixtp_stack_frame *) pdata->stack->data; current_parser = current_frame->parser; @@ -492,10 +433,6 @@ sixtp_sax_end_handler(void *user_data, const xmlChar *name) { if(!pdata->parsing_ok) return; -#if 0 - fprintf(stderr, "Hit end tag \n", name); -#endif - current_frame = (sixtp_stack_frame *) pdata->stack->data; parent_frame = (sixtp_stack_frame *) pdata->stack->next->data; @@ -534,10 +471,6 @@ sixtp_sax_end_handler(void *user_data, const xmlChar *name) { g_slist_prepend(parent_frame->data_from_children, child_result_data); } -#if 0 - printf("POPPING FRAME for <%s> parser.\n", current_frame->tag); -#endif - /* grab it before it goes away - we shouldn't need to g_strdup because this string is held by the parent parser's hash table. */ end_tag = current_frame->tag; @@ -548,11 +481,6 @@ sixtp_sax_end_handler(void *user_data, const xmlChar *name) { pdata->stack = sixtp_pop_and_destroy_frame(pdata->stack); -#if 0 - printf("REMAINING STACK:\n"); - sixtp_print_frame_stack(pdata->stack, stderr); -#endif - /* reset pointer after stack pop */ current_frame = (sixtp_stack_frame *) pdata->stack->data; /* reset the parent, checking to see if we're at the top level node */ @@ -647,67 +575,6 @@ sixtp_destroy(sixtp *sp) { g_hash_table_destroy(corpses); } -#if 0 - -/* Not tested yet - not needed... */ - -static sixtp *sixtp_copy(sixtp *s); - -typedef struct { - gboolean ok; - GHashTable *hash; -} sixtp_copy_data; - -static void -sixtp_copy_children_helper(gpointer key, gpointer value, gpointer user_data) { - sixtp_copy_data *cd = (sixtp_copy_data *) user_data; - const gchar *newkey = g_strdup(key); - sixtp *newparser; - - if(!newkey) { - cd->ok = FALSE; - return; - } - newparser = sixtp_copy((sixtp *) value); - if(!newparser) { - cd->ok = FALSE; - g_free(newkey); - return; - } - g_hash_table_insert(cd->hash, newkey, newparser); -} - -static sixtp * -sixtp_copy(sixtp *s) { - sixtp_copy_data copy_data; - sixtp *copy = gnew0(sixtp, 1); - - if(!copy) return(NULL); - - *copy = *s; - - /* now the bits that shouldn't be shared */ - copy_data.ok = TRUE; - copy_data.hash = g_hash_table_new(g_str_hash, g_str_equal); - - if(!copy_data.hash) { - g_free(copy); - return(NULL); - } - - copy->children = copy_data.hash; - g_hash_table_foreach(s->children, sixtp_copy_children_helper, copy->children); - - if(!copy_data.ok) { - sixtp_destroy(copy); - return(NULL); - } - - return(copy); -} -#endif - - static void sixtp_set_start(sixtp *parser, sixtp_start_handler start_handler) { parser->start_handler = start_handler; @@ -960,18 +827,6 @@ allow_and_ignore_only_whitespace(GSList *sibling_data, return(is_space); } -#if 0 -static gboolean -generic_pass_data_to_children_start_handler(GSList* sibling_data, - gpointer parent_data, - gpointer global_data, - gpointer *result, - const gchar *tag) { - data_for_children = parent_data; - return(TRUE); -} -#endif - static gboolean generic_accumulate_chars(GSList *sibling_data, gpointer parent_data, @@ -4664,67 +4519,3 @@ is_gncxml_file(const gchar *filename) { if(f) fclose(f); return(result); } - -/****************************************************************************/ - -#if 0 -void -real_main(int argc, char *argv[]) { - - gboolean parse_ok; - gpointer parse_result; - sixtp *top_level_pr; - sixtp *gnc_pr; - sixtp *gnc_version_pr; - GNCParseStatus global_parse_status; - - /* top-level: This is just a dummy node. It doesn't do anything. - For now, the result is communicated through the global_data - parser. */ - top_level_pr = sixtp_new(); - if(!top_level_pr) return; - sixtp_set_chars(top_level_pr, allow_and_ignore_only_whitespace); - - /* */ - gnc_pr = gnc_parser_new(); - if(!gnc_pr) { - sixtp_destroy(top_level_pr); - return; - } - sixtp_add_sub_parser(top_level_pr, "gnc", gnc_pr); - - /* */ - gnc_version_pr = gnc_version_parser_new(); - if(!gnc_version_pr) { - sixtp_destroy(top_level_pr); - return; - } - sixtp_add_sub_parser(gnc_pr, "version", gnc_version_pr); - - global_parse_status.seen_version = FALSE; - global_parse_status.gnc_parser = gnc_pr; - global_parse_status.account_group = NULL; - global_parse_status.error = GNC_PARSE_ERR_NONE; - parse_result = NULL; - - parse_ok = sixtp_parse_file(top_level_pr, - "test-data.xml", - NULL, - &global_parse_status, - &parse_result); - - sixtp_destroy(top_level_pr); - - printf("Result:\n"); - printf(" seen_version: %d\n", global_parse_status.seen_version); - printf(" version: %lld\n", global_parse_status.version); - printf(" AccountGroup: %p\n", global_parse_status.account_group); - printf(" error: %d\n", global_parse_status.error); -} - -int -main(int argc, char *argv[]) { - gh_enter(argc, argv, real_main); - return(0); -} -#endif diff --git a/src/engine/io-gncxml-w.c b/src/engine/io-gncxml-w.c index aa2ff45dbf..9605a21425 100644 --- a/src/engine/io-gncxml-w.c +++ b/src/engine/io-gncxml-w.c @@ -6,6 +6,7 @@ #include #include +#include #include #include @@ -38,6 +39,10 @@ #define xmlRootNode root #endif +static const gchar *gncxml_emacs_trailer = +"\n" +"\n" +"\n"; static gboolean xml_add_str(xmlNodePtr p, const char *tag, const char *str, @@ -583,32 +588,6 @@ xml_add_transaction_split(xmlNodePtr p, Split* s) { } } -#if 0 - { - gchar data[] = "DEADBEEF"; - GList *lst = NULL; - kvp_frame *f = kvp_frame_new(); - - kvp_value *val1 = kvp_value_new_binary(data, sizeof(data) - 1); - kvp_value *val2 = kvp_value_new_gint64(666); - kvp_value *val3 = kvp_value_new_string("foo"); - - kvp_frame_set_slot(f, "slot-1", val1); - kvp_frame_set_slot(f, "slot-2", val2); - kvp_frame_set_slot(f, "slot-3", val3); - - lst = g_list_append(lst, val1); - lst = g_list_append(lst, val2); - lst = g_list_append(lst, val3); - - xaccSplitSetSlot(s, "one", val1); - xaccSplitSetSlot(s, "two", val2); - xaccSplitSetSlot(s, "three", val3); - xaccSplitSetSlot(s, "listness", kvp_value_new_glist(lst)); - xaccSplitSetSlot(s, "subbyslot", kvp_value_new_frame(f)); - } -#endif - if(s->kvp_data) { if(!xml_add_kvp_frame(split_xml, "slots", s->kvp_data, FALSE)) return(FALSE); @@ -766,6 +745,24 @@ xml_add_account_restorers(xmlNodePtr p, AccountGroup *g) { return(TRUE); } +static gboolean +gncxml_append_emacs_trailer(const gchar *filename) +{ + FILE *toappend; + + toappend = fopen(filename, "a+"); + if(!toappend) + { + fprintf(stderr, "Unable to append emacs trailer: %s\n", + strerror(errno)); + return 0; + } + + fprintf(toappend, gncxml_emacs_trailer); + + return fclose(toappend); +} + gboolean gncxml_write(AccountGroup *group, const gchar *filename) { /* fixme: this should be broken up into sub-functions later. */ @@ -810,6 +807,8 @@ gncxml_write(AccountGroup *group, const gchar *filename) { status = xmlSaveFile(filename, doc); xmlFreeDoc(doc); + gncxml_append_emacs_trailer(filename); + /* FIXME: This gives me a non-zero result, even when everything's fine ??? status = xmlDocDump(outfile, doc); diff --git a/src/gnome/top-level.c b/src/gnome/top-level.c index a1d919e4e0..6d7078a98f 100644 --- a/src/gnome/top-level.c +++ b/src/gnome/top-level.c @@ -195,7 +195,6 @@ gnucash_ui_init(void) restargv2 = (char**)poptGetArgs(returnedPoptContext); gnc_set_remaining_argv(argv_length(restargv2), (const char**)restargv2); - gh_eval_str("(gnc:load-account-file)"); /* this must come after using the poptGetArgs return value */ poptFreeContext (returnedPoptContext); @@ -274,7 +273,7 @@ gnucash_ui_init(void) xaccRecnCellSetStringGetter(gnc_get_reconcile_str); - mainWindow(); + /* gnc_default_ui_start */ gnucash_style_init(); gnucash_color_init(); @@ -285,6 +284,16 @@ gnucash_ui_init(void) return 0; } +static int hasstarted = 0; +void gnc_default_ui_start(void) +{ + if(!hasstarted) + { + mainWindow(); + hasstarted = 1; + } +} + /* ============================================================== */ void @@ -348,7 +357,8 @@ gnc_ui_main(void) { /* Initialize gnome */ gnucash_ui_init(); - + gnc_default_ui_start(); + gnc_refresh_main_window(); gtk_widget_show(app); diff --git a/src/gnome/window-main.h b/src/gnome/window-main.h index 044fd31213..05e3362dfb 100644 --- a/src/gnome/window-main.h +++ b/src/gnome/window-main.h @@ -32,5 +32,7 @@ void mainWindow(void); GNCMainWinAccountTree * gnc_get_current_account_tree(void); void gnc_ui_mainWindow_save_size(void); +void gnc_default_ui_start(void); +int gnucash_ui_init(void); #endif diff --git a/src/scm/main.scm b/src/scm/main.scm index 619e8c6dce..510c3bc0c6 100644 --- a/src/scm/main.scm +++ b/src/scm/main.scm @@ -146,6 +146,9 @@ (begin ;; (gnc:load-account-file) (gnc:hook-add-dangler gnc:*ui-shutdown-hook* gnc:ui-finish) + (gnc:ui-init) + (gnc:load-account-file) + (gnc:default-ui-start) (gnc:ui-main) (gnc:hook-remove-dangler gnc:*ui-shutdown-hook* gnc:ui-finish)) diff --git a/src/scm/report/budget-report.scm b/src/scm/report/budget-report.scm index 0e2de83269..f4560ea94b 100644 --- a/src/scm/report/budget-report.scm +++ b/src/scm/report/budget-report.scm @@ -25,6 +25,8 @@ (gnc:depend "date-utilities.scm") +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Budget Entry (define budget-entry-structure (make-record-type "budget-entry-structure" @@ -73,6 +75,44 @@ (define make-nominal-mechanism (record-constructor budget-nominal-mechanism-structure)) + +(define budget-entry-get-description + (record-accessor budget-entry-structure 'description)) + +(define budget-subentry-get-description + (record-accessor budget-subentry-structure 'description)) + +(define budget-entry-get-accounts + (record-accessor budget-entry-structure 'accounts)) + +(define budget-entry-get-subentries + (record-accessor budget-entry-structure 'subentries)) + +(define budget-entry-get-action + (record-accessor budget-entry-structure 'action)) + +(define budget-entry-get-filter-pred + (record-accessor budget-entry-structure 'filter-pred)) + +(define budget-subentry-get-amount + (record-accessor budget-subentry-structure 'amount)) + +(define budget-subentry-get-period + (record-accessor budget-subentry-structure 'period)) + +(define budget-subentry-get-period-type + (record-accessor budget-subentry-structure 'period-type)) + +(define budget-bill-get-window-start-day + (record-accessor budget-bill-mechanism-structure 'window-start-day)) + +(define budget-bill-get-window-end-day + (record-accessor budget-bill-mechanism-structure 'window-end-day)) + +(define budget-subentry-get-mechanism + (record-accessor budget-subentry-structure 'mechanism)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; useful filter-pred's for a budget entry (define (budget-filter-pred-debit split budget-line) @@ -130,58 +170,69 @@ "gross" '("Income:Gross Employment Income") #f (list (make-budget-subentry #f -99999.99 1 'gnc:budget-month - (make-bill-mechanism -1 2))) #t) + (make-bill-mechanism -1 2))) + #t) (make-budget-entry "bank interest" '("Expense:Bank Charges:Interest") #f (list (make-budget-subentry #f 40 1 'gnc:budget-month - (make-bill-mechanism -4 0))) #t) + (make-bill-mechanism -4 0))) + #t) (make-budget-entry "bank feed" '("Expense:Bank Charges:Fees") #f (list (make-budget-subentry #f 50 1 'gnc:budget-year - (make-bill-mechanism 27 27))) #t) + (make-bill-mechanism 27 27))) + #t) (make-budget-entry "cell phone" '("Expense:Bills:Cell phone") #f (list (make-budget-subentry #f 60 1 'gnc:budget-month - (make-bill-mechanism -4 -1))) #t) + (make-bill-mechanism -4 -1))) + #t) (make-budget-entry "hydro" '("Expense:Bills:Hydro") #f (list (make-budget-subentry #f 20 1 'gnc:budget-month - (make-bill-mechanism 15 19))) #t) + (make-bill-mechanism 15 19))) + #t) (make-budget-entry "life insurance" '("Expense:Bills:Life Insurance") #f (list (make-budget-subentry #f 15 1 'gnc:budget-month - (make-bill-mechanism 1 3))) #t) + (make-bill-mechanism 1 3))) + #t) (make-budget-entry "diesel" '("Expense:Car:Diesel") #f (list (make-budget-subentry #f 30 4 'gnc:budget-week - (make-recurring-mechanism))) #t) + (make-recurring-mechanism))) + #t) (make-budget-entry "licenses" '("Expense:Car:Licenses") #f (list (make-budget-subentry #f 1000 1 'gnc:budget-year - (make-bill-mechanism -122 -108))) #t) + (make-bill-mechanism -122 -108))) + #t) (make-budget-entry "car maintenance" '("Expense:Car:Maintenance") #f (list (make-budget-subentry #f 100 6 'gnc:budget-month - (make-recurring-mechanism))) #t) + (make-recurring-mechanism))) + #t) (make-budget-entry "car misc" '("Expense:Car:Miscellaneous") #f (list (make-budget-subentry #f 5 1 'gnc:budget-week - (make-recurring-mechanism))) #t) + (make-recurring-mechanism))) + #t) (make-budget-entry "charitable" '("Expense:Charitable:Non-taxable" "Expense:Charitable:Taxable") #f (list (make-budget-subentry #f 200 1 'gnc:budget-year - (make-recurring-mechanism))) #t) + (make-recurring-mechanism))) + #t) (make-budget-entry "entertainment" '("Expense:Entertainment:Beer (out)" "Expense:Entertainment:Cover" @@ -192,61 +243,72 @@ "Expense:Entertainment:Liquor (home)") #f (list (make-budget-subentry #f 50 1 'gnc:budget-week - (make-recurring-mechanism))) #t) + (make-recurring-mechanism))) + #t) (make-budget-entry "groceries" '("Expense:Food:Groceries") #f (list (make-budget-subentry #f 125 1 'gnc:budget-month - (make-recurring-mechanism))) #t) + (make-recurring-mechanism))) + #t) (make-budget-entry "junk food" '("Expense:Food:Junk") #f (list (make-budget-subentry #f 0.5 1 'gnc:budget-day - (make-recurring-mechanism))) #t) + (make-recurring-mechanism))) + #t) (make-budget-entry "lunch" '("Expense:Food:Lunch") #f (list (make-budget-subentry #f 8 1 'gnc:budget-day - (make-recurring-mechanism))) #t) + (make-recurring-mechanism))) + #t) (make-budget-entry "gifts" '("Expense:Gifts") #f (list (make-budget-subentry #f 400 1 'gnc:budget-year (make-recurring-mechanism)) (make-budget-subentry "xmas" 400 1 'gnc:budget-year - (make-bill-mechanism -30 -5))) #t) + (make-bill-mechanism -30 -5))) + #t) (make-budget-entry "rent" '("Expense:Household:Rent") #f (list (make-budget-subentry #f 312.50 1 'gnc:budget-month - (make-bill-mechanism 1 2))) #t) + (make-bill-mechanism 1 2))) + #t) (make-budget-entry "house junk" '("Expense:Household:Stuff") #f (list (make-budget-subentry #f 25 1 'gnc:budget-month - (make-recurring-mechanism))) #t) + (make-recurring-mechanism))) + #t) (make-budget-entry "medical" '("Expense:Medical:Dental" "Expense:Medical:Optical" "Expense:Medical:Other") #f (list (make-budget-subentry #f 1000 1 'gnc:budget-year - (make-contingency-mechanism))) #t) + (make-contingency-mechanism))) + #t) (make-budget-entry "clothes" '("Expense:Personal:Clothes") #f (list (make-budget-subentry #f 150 3 'gnc:budget-month - (make-recurring-mechanism))) #t) + (make-recurring-mechanism))) + #t) (make-budget-entry "hygeine" '("Expense:Personal:Personal maintenance") #f (list (make-budget-subentry #f 30 1 'gnc:budget-month - (make-recurring-mechanism))) #t) + (make-recurring-mechanism))) + #t) (make-budget-entry "newspapers" '("Expense:Stuff:Newspapers") #f (list (make-budget-subentry #f 20.52 1 'gnc:budget-month - (make-bill-mechanism 14 14))) #t) + (make-bill-mechanism 14 14))) + #t) (make-budget-entry "stuff" '("Expense:Stuff:CD's" "Expense:Stuff:Electronic entertainment" "Expense:Stuff:Fiction" @@ -258,37 +320,43 @@ "Expense:Stuff:Videos") #f (list (make-budget-subentry #f 250 1 'gnc:budget-month - (make-recurring-mechanism))) #t) + (make-recurring-mechanism))) + #t) (make-budget-entry "student loan" '("Expense:Bills:Student Loan Interest" "Loans:student loan") #f (list (make-budget-subentry #f 94.54 1 'gnc:budget-month - (make-bill-mechanism -1 -1))) #t) + (make-bill-mechanism -1 -1))) + #t) (make-budget-entry "car loan" '("Expense:Car:Loan Interest" "Loans:Car Loan") #f (list (make-budget-subentry #f 374.18 1 'gnc:budget-month - (make-bill-mechanism 15 17))) #t) + (make-bill-mechanism 15 17))) + #t) (make-budget-entry "RRSP loan" '("Expense:Investment Expenses:RRSP LOC Interest" "Loans:Scotia Bank RRSP Line of Credit") budget-filter-pred-debit (list (make-budget-subentry #f 100 1 'gnc:budget-month - (make-bill-mechanism 5 8))) #t) + (make-bill-mechanism 5 8))) + #t) (make-budget-entry "cash write off" '("Expense:Cash write-off") #f (list (make-budget-subentry #f 60 1 'gnc:budget-month - (make-recurring-mechanism))) #t) + (make-recurring-mechanism))) + #t) (make-budget-entry "taxes" '("Expense:Taxes:CPP" "Expense:Taxes:EI" "Expense:Taxes:Federal Income Tax") #f (list (make-budget-subentry #f 1034.38 1 'gnc:budget-month - (make-bill-mechanism -1 -2))) #t))) + (make-bill-mechanism -1 -2))) + #t))) ;; these are the "other collectors". This is where all transactions @@ -296,76 +364,64 @@ ;; by account-type, which is an integer. (define gnc:budget-others (list - (make-budget-entry "other bank" '() #f (list - (make-budget-subentry #f 0 1 'gnc:budget-month - (make-nominal-mechanism))) #f) - (make-budget-entry "other cash" '() #f (list - (make-budget-subentry #f 0 1 'gnc:budget-month - (make-nominal-mechanism))) #f) - (make-budget-entry "other asset" '() #f (list - (make-budget-subentry #f 0 1 'gnc:budget-month - (make-nominal-mechanism))) #f) - (make-budget-entry "other credit" '() #f (list - (make-budget-subentry #f 0 1 'gnc:budget-month - (make-nominal-mechanism))) #f) - (make-budget-entry "other liability" '() #f (list - (make-budget-subentry #f 0 1 'gnc:budget-month - (make-nominal-mechanism))) #f) - (make-budget-entry "other stock" '() #f (list - (make-budget-subentry #f 0 1 'gnc:budget-month - (make-nominal-mechanism))) #f) - (make-budget-entry "other mutual" '() #f (list - (make-budget-subentry #f 0 1 'gnc:budget-month - (make-nominal-mechanism))) #f) - (make-budget-entry "other currency" '() #f (list - (make-budget-subentry #f 0 1 'gnc:budget-month - (make-nominal-mechanism))) #f) - (make-budget-entry "other income" '() #f (list - (make-budget-subentry #f -10000 5 'gnc:budget-year - (make-contingency-mechanism))) 'gnc:budget-comment) - (make-budget-entry "other expense" '() #f (list - (make-budget-subentry #f 10000 5 'gnc:budget-year - (make-contingency-mechanism))) 'gnc:budget-comment) - (make-budget-entry "other equity" '() #f (list - (make-budget-subentry #f 10000 5 'gnc:budget-year - (make-contingency-mechanism))) #f))) - -(define budget-entry-get-description - (record-accessor budget-entry-structure 'description)) - -(define budget-subentry-get-description - (record-accessor budget-subentry-structure 'description)) - -(define budget-entry-get-accounts - (record-accessor budget-entry-structure 'accounts)) - -(define budget-entry-get-subentries - (record-accessor budget-entry-structure 'subentries)) - -(define budget-entry-get-action - (record-accessor budget-entry-structure 'action)) - -(define budget-entry-get-filter-pred - (record-accessor budget-entry-structure 'filter-pred)) - -(define budget-subentry-get-amount - (record-accessor budget-subentry-structure 'amount)) - -(define budget-subentry-get-period - (record-accessor budget-subentry-structure 'period)) - -(define budget-subentry-get-period-type - (record-accessor budget-subentry-structure 'period-type)) - -(define budget-bill-get-window-start-day - (record-accessor budget-bill-mechanism-structure 'window-start-day)) - -(define budget-bill-get-window-end-day - (record-accessor budget-bill-mechanism-structure 'window-end-day)) - -(define budget-subentry-get-mechanism - (record-accessor budget-subentry-structure 'mechanism)) + (make-budget-entry "other bank" '() #f + (list + (make-budget-subentry #f 0 1 'gnc:budget-month + (make-nominal-mechanism))) + #f) + (make-budget-entry "other cash" '() #f + (list + (make-budget-subentry #f 0 1 'gnc:budget-month + (make-nominal-mechanism))) + #f) + (make-budget-entry "other asset" '() #f + (list + (make-budget-subentry #f 0 1 'gnc:budget-month + (make-nominal-mechanism))) + #f) + (make-budget-entry "other credit" '() #f + (list + (make-budget-subentry #f 0 1 'gnc:budget-month + (make-nominal-mechanism))) + #f) + (make-budget-entry "other liability" '() #f + (list + (make-budget-subentry #f 0 1 'gnc:budget-month + (make-nominal-mechanism))) + #f) + (make-budget-entry "other stock" '() #f + (list + (make-budget-subentry #f 0 1 'gnc:budget-month + (make-nominal-mechanism))) + #f) + (make-budget-entry "other mutual" '() #f + (list + (make-budget-subentry #f 0 1 'gnc:budget-month + (make-nominal-mechanism))) + #f) + (make-budget-entry "other currency" '() #f + (list + (make-budget-subentry #f 0 1 'gnc:budget-month + (make-nominal-mechanism))) + #f) + (make-budget-entry "other income" '() #f + (list + (make-budget-subentry #f -10000 5 'gnc:budget-year + (make-contingency-mechanism))) + 'gnc:budget-comment) + (make-budget-entry "other expense" '() #f + (list + (make-budget-subentry #f 10000 5 'gnc:budget-year + (make-contingency-mechanism))) + 'gnc:budget-comment) + (make-budget-entry "other equity" '() #f + (list + (make-budget-subentry #f 10000 5 'gnc:budget-year + (make-contingency-mechanism))) + #f))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Budget Report (define budget-report-structure (make-record-type "budget-report-structure" @@ -424,6 +480,37 @@ (define budget-subreport-get-maximum-expected (record-accessor budget-subreport-structure 'maximum-expected)) +(define budget-report-set-actual! + (record-modifier budget-report-structure 'actual)) + +(define (budget-report-accumulate-actual! value budget-line) + (budget-report-set-actual! + (budget-line-get-report budget-line) + (+ value (budget-report-get-actual + (budget-line-get-report budget-line))))) + +(define budget-subreport-set-min-expected! + (record-modifier budget-subreport-structure 'minimum-expected)) + +(define budget-subreport-set-max-expected! + (record-modifier budget-subreport-structure 'maximum-expected)) + +(define budget-report-set-min-expected! + (record-modifier budget-report-structure 'minimum-expected)) + +(define budget-report-set-max-expected! + (record-modifier budget-report-structure 'maximum-expected)) + +(define (budget-report-accumulate-min-expected! report min-expected) + (budget-report-set-min-expected! report + (+ min-expected (budget-report-get-minimum-expected report)))) + +(define (budget-report-accumulate-max-expected! report max-expected) + (budget-report-set-max-expected! report + (+ max-expected (budget-report-get-maximum-expected report)))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Budget Line (define budget-line-structure (make-record-type "budget-line-structure" '(entry report))) @@ -463,34 +550,7 @@ (length (budget-entry-get-subentries (budget-line-get-entry line)))) -(define budget-report-set-actual! - (record-modifier budget-report-structure 'actual)) - -(define (budget-report-accumulate-actual! value budget-line) - (budget-report-set-actual! - (budget-line-get-report budget-line) - (+ value (budget-report-get-actual - (budget-line-get-report budget-line))))) - -(define budget-subreport-set-min-expected! - (record-modifier budget-subreport-structure 'minimum-expected)) - -(define budget-subreport-set-max-expected! - (record-modifier budget-subreport-structure 'maximum-expected)) - -(define budget-report-set-min-expected! - (record-modifier budget-report-structure 'minimum-expected)) - -(define budget-report-set-max-expected! - (record-modifier budget-report-structure 'maximum-expected)) - -(define (budget-report-accumulate-min-expected! report min-expected) - (budget-report-set-min-expected! report - (+ min-expected (budget-report-get-minimum-expected report)))) - -(define (budget-report-accumulate-max-expected! report max-expected) - (budget-report-set-max-expected! report - (+ max-expected (budget-report-get-maximum-expected report)))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; return the # of budget periods over the report period (define (budget-num-periods subentry begin-date end-date) @@ -510,9 +570,10 @@ (define budget-nominal-pred (record-predicate budget-nominal-mechanism-structure)) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (define (budget-calculate-expected! budget-line begin-date end-date) - (let ((entry (budget-line-get-entry budget-line)) - (report (budget-line-get-report budget-line))) + (let ((report (budget-line-get-report budget-line))) (for-each (lambda (subentry subreport) (let ((mechanism (budget-subentry-get-mechanism subentry))) @@ -533,7 +594,8 @@ report (budget-subreport-get-minimum-expected subreport)) (budget-report-accumulate-max-expected! report (budget-subreport-get-maximum-expected subreport)))) - (budget-entry-get-subentries entry) + + (budget-entry-get-subentries (budget-line-get-entry budget-line)) (budget-report-get-subreports report)))) ;; calculate the nominal value. @@ -577,83 +639,78 @@ (budget-subreport-set-max-expected! subreport (+ min amount))))) (define (budget-calculate-bill! subentry subreport mechanism begin-date end-date) - (let ((N-type (budget-subentry-get-period-type subentry)) - (window-start (budget-bill-get-window-start-day mechanism)) - (window-end (budget-bill-get-window-end-day mechanism)) - (psize (budget-subentry-get-period subentry)) - (amount (budget-subentry-get-amount subentry))) - ; convert negative numbers to positive numbers - (let ((trig-start-A (if (> window-start 0) - window-start - (+ window-start - (gnc:days-in-period - begin-date N-type psize)))) - (trig-start-B (if (> window-start 0) - window-start - (+ window-start - (gnc:days-in-period - end-date N-type psize)))) - (trig-end-A (if (> window-end 0) - window-end - (+ window-end - (gnc:days-in-period - begin-date N-type psize)))) - (trig-end-B (if (> window-end 0) - window-end - (+ window-end - (gnc:days-in-period - end-date N-type psize)))) - (possible 0) - (sure 0) - (report-start (gnc:date-to-N-remainder begin-date N-type psize)) - (report-end (gnc:date-to-N-remainder end-date N-type psize))) - ; special case if report start and end are in same period - (cond ((= (floor (/ (gnc:date-to-N-fraction end-date N-type) psize)) - (floor (/ (gnc:date-to-N-fraction begin-date N-type) psize))) - (cond ((<= trig-start-A trig-end-A) - (cond ((> report-start trig-end-A) #f) - ((< report-end trig-start-A) #f) - ((or (> report-start trig-start-A) - (< report-end trig-end-A)) - (set! possible 1)) - (else (set! sure 1)))) - (else - (if (<= report-start trig-end-A) - (set! possible 1)) - (if (>= report-end trig-start-A) - (set! possible (+ possible 1)))))) - ; not in same period. - (else - ; first calculate terminal periods - (cond ((<= trig-start-A trig-end-A) - (cond ((> report-start trig-end-A) #f) - ((<= report-start trig-start-A) - (set! sure (+ sure 1))) - (else (set! possible (+ possible 1)))) - (cond ((< report-end trig-start-B) #f) - ((>= report-end trig-end-B) (set! sure (+ sure 1))) - (else (set! possible (+ possible 1))))) - (else - (if (<= report-start trig-end-A) - (set! possible (+ possible 1))) - (if (>= report-end trig-start-B) - (set! possible (+ possible 1))) - (if (or (> report-start trig-start-A) - (< report-end trig-end-B)) - (set! possible (+ possible 1)) - (set! sure (+ sure 1))))) - ; then add intermediate periods - (set! sure (+ -1 sure - (inexact->exact - (- (floor (/ (gnc:date-to-N-fraction - end-date N-type) psize)) - (floor (/ (gnc:date-to-N-fraction - begin-date N-type) psize)))))))) - ; now save 'em into the record - (budget-subreport-set-min-expected! subreport - (* amount sure)) - (budget-subreport-set-max-expected! subreport - (* amount (+ sure possible)))))) + (letrec ((N-type (budget-subentry-get-period-type subentry)) + (window-start (budget-bill-get-window-start-day mechanism)) + (window-end (budget-bill-get-window-end-day mechanism)) + (psize (budget-subentry-get-period subentry)) + (amount (budget-subentry-get-amount subentry)) + (date-positiverter + (lambda (num date) + (if (> num 0) + num + (+ num (gnc:days-in-period num date N-type psize)))))) + ;; convert negative numbers to positive numbers + (let ((trig-start-A (date-positiverter window-start begin-date)) + (trig-start-B (date-positiverter window-start end-date)) + (trig-end-A (date-positiverter window-end begin-date)) + (trig-end-B (date-positiverter window-end end-date)) + (possible 0) + (sure 0) + (report-start (gnc:date-to-N-remainder begin-date N-type psize)) + (report-end (gnc:date-to-N-remainder end-date N-type psize)) + (date-diff (inexact->exact + (- (floor (/ (gnc:date-to-N-fraction + end-date N-type) psize)) + (floor (/ (gnc:date-to-N-fraction + begin-date N-type) psize)))))) + ;; special case if report start and end are in same period + (if (= 0 date-diff) + (cond ((<= trig-start-A trig-end-A) + (cond ((or (> report-start trig-end-A) + (< report-end trig-start-A)) + #f) + ((or (> report-start trig-start-A) + (< report-end trig-end-A)) + (set! possible 1)) + (else + (set! sure 1)))) + (else + (if (<= report-start trig-end-A) + (set! possible 1)) + (if (>= report-end trig-start-A) + (set! possible (+ possible 1))))) + ;; not in same period. + ;; first calculate terminal periods + (begin + (cond ((<= trig-start-A trig-end-A) + (cond ((> report-start trig-end-A) + #f) + ((<= report-start trig-start-A) + (set! sure 1)) + (else + (set! possible 1))) + (cond ((< report-end trig-start-B) + #f) + ((>= report-end trig-end-B) + (set! sure 1)) + (else + (set! possible 1)))) + (else + (if (<= report-start trig-end-A) + (set! possible (+ possible 1))) + (if (>= report-end trig-start-B) + (set! possible (+ possible 1))) + (if (or (> report-start trig-start-A) + (< report-end trig-end-B)) + (set! possible (+ possible 1)) + (set! sure (+ sure 1))))) + ;; then add intermediate periods + (set! sure (+ -1 sure date-diff)))) + ;; now save 'em into the record + (budget-subreport-set-min-expected! subreport + (* amount sure)) + (budget-subreport-set-max-expected! subreport + (* amount (+ sure possible)))))) (define (budget-calculate-actual! budget-hash others begin-date-secs end-date-secs) (let loop ((group (gnc:get-current-group)))