From 38fcb8da8f34dca650bf63b40d7a3f37d768ef92 Mon Sep 17 00:00:00 2001 From: Dave Peticolas Date: Wed, 5 Apr 2000 01:57:40 +0000 Subject: [PATCH] *** empty log message *** git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@2157 57a11ea4-9604-0410-9ed3-97b8803252fd --- po/de.po | 498 ++++++++++------------ src/SplitLedger.c | 6 +- src/backup.txt | 40 ++ src/scm/report-utilities.scm | 1 + src/scm/report/budget-report.scm | 696 +++++++++++++++++++------------ src/scm/srfi/srfi-1.r5rs.scm | 2 +- 6 files changed, 702 insertions(+), 541 deletions(-) create mode 100644 src/backup.txt diff --git a/po/de.po b/po/de.po index 3a99f47465..99c8729154 100644 --- a/po/de.po +++ b/po/de.po @@ -230,7 +230,6 @@ msgstr "" " ist leer." #: messages-i18n.c:39 -#, fuzzy msgid "Changes have been made since the last Save. Save the data to file?" msgstr "" "Es wurden Veränderungen seit der letzten Speicherung vorgenommen. " @@ -358,9 +357,8 @@ msgid "Are you sure you want to delete the current transaction?" msgstr "Sind sie sicher das sie das %s Konto löschen wollen?" #: messages-i18n.c:57 -#, fuzzy msgid "Recalculate Transaction" -msgstr "Buchung löschen" +msgstr "Buchung neu kalkulieren" #: messages-i18n.c:58 msgid "" @@ -504,12 +502,10 @@ msgid "Enter the total value of the shares" msgstr "Geben sie den Gesamtwert der Anteile ein" #: messages-i18n.c:86 -#, fuzzy msgid "Enter the account to transfer from, or choose one from the list" msgstr "Geben sie ein Transferkonto ein oder wählen sie aus der Liste" #: messages-i18n.c:87 -#, fuzzy msgid "Enter the account to transfer to, or choose one from the list" msgstr "Geben sie ein Transferkonto ein oder wählen sie aus der Liste" @@ -870,9 +866,8 @@ msgid "Cash" msgstr "Bargeld" #: messages-i18n.c:176 -#, fuzzy msgid "Changed" -msgstr "Belastung" +msgstr "Geändert" #: messages-i18n.c:177 msgid "Charge" @@ -1232,9 +1227,8 @@ msgid "Second Option" msgstr "Zweite Option" #: po/guile_strings.txt:3 -#, fuzzy msgid "Cost" -msgstr "Schliessen" +msgstr "Kosten" #: po/guile_strings.txt:5 msgid "Status" @@ -1263,7 +1257,6 @@ msgid "Stock Portfolio Valuation" msgstr "" #: po/guile_strings.txt:15 -#, fuzzy msgid "Stock Portfolio" msgstr "Portfolio" @@ -1383,7 +1376,6 @@ msgid "Income-Salary-Taxable" msgstr "zu versteuerndes Einkommen" #: po/guile_strings.txt:45 -#, fuzzy msgid "_Stock Portfolio" msgstr "Portfolio" @@ -1396,9 +1388,8 @@ msgid "US-style: mm/dd/yyyy" msgstr "US-Stil : Monat/Tag/Jahr" #: po/guile_strings.txt:48 -#, fuzzy msgid "You have not selected an account." -msgstr "Wählen sie ein Konto zum Ausbuchen" +msgstr "Sie haben kein Konto ausgewählt" #: po/guile_strings.txt:49 msgid "By default, show every transaction in an account." @@ -1449,7 +1440,6 @@ msgid "Display the Hello, World report." msgstr "Den 'Hallo Welt'-Report anzeigen" #: po/guile_strings.txt:64 -#, fuzzy msgid "Gain" msgstr "Gewinn/Verlust" @@ -1511,7 +1501,6 @@ msgid "Import QIF File - Scripted in Guile." msgstr "Importieren einer Quicken-Datei (QIF) - Skriptsprache Guile" #: po/guile_strings.txt:79 -#, fuzzy msgid "Category" msgstr "QIF Kategorie" @@ -1555,9 +1544,8 @@ msgid "The background color for the active transaction in single mode" msgstr "Hintergrundfarbe für die aktive Transaktion im 'Single-Mode'" #: po/guile_strings.txt:88 -#, fuzzy msgid "Loss" -msgstr "Gewinn/Verlust" +msgstr "Verlust" #: po/guile_strings.txt:89 msgid "Credit Accounts" @@ -1580,19 +1568,17 @@ msgid "Save window sizes and positions." msgstr "Speichere Fenstergrössen und -positionen" #: po/guile_strings.txt:95 -#, fuzzy msgid "Number Option" -msgstr "Berichtsoptionen" +msgstr "Zahlenoptionen" #: po/guile_strings.txt:96 -#, fuzzy msgid "There are no accounts to report on." -msgstr "Es wurden keine Konten in der Kontenliste ausgewählt." +msgstr "Es gibt keine Konten für den Bericht." #: po/guile_strings.txt:97 -#, fuzzy, c-format +#, c-format msgid "Report for %s." -msgstr "Berichte" +msgstr "Bericht für %s." #: po/guile_strings.txt:98 msgid "Reverse Income and Expense Accounts" @@ -1690,9 +1676,8 @@ msgid "Date Format Display" msgstr "Datumsformat-Anzeige" #: po/guile_strings.txt:124 -#, fuzzy msgid "Ending" -msgstr "Zunehmend" +msgstr "Endend" #: po/guile_strings.txt:125 msgid "Reversed-balance account types" @@ -1723,9 +1708,8 @@ msgid "Calculate balance sheet up to this date" msgstr "" #: po/guile_strings.txt:133 -#, fuzzy msgid "Transaction Report" -msgstr "Transaktion" +msgstr "Transaktionsbericht" #: po/guile_strings.txt:134 msgid "Alternate the even and odd colors with each transaction, not each row" @@ -1816,14 +1800,12 @@ msgid "Do transaction report on this account" msgstr "Sie können nicht von und zu dem selben Konto transferieren !" #: po/guile_strings.txt:157 -#, fuzzy msgid "Recent Price" -msgstr "Verkaufspreis" +msgstr "letzter Preis" #: po/guile_strings.txt:158 -#, fuzzy msgid "Net Inflow" -msgstr "Datei Info" +msgstr "Preis aus dem Netz" #: po/guile_strings.txt:159 msgid "Single mode default even row background" @@ -1896,9 +1878,9 @@ msgid "Show both icons and text" msgstr "Sowohl Icons, als auch Text anzeigen" #: po/guile_strings.txt:180 -#, fuzzy, c-format +#, c-format msgid "The number option is %s." -msgstr "Die Datums-Option ist %s." +msgstr "Die Zahlen-Option ist %s." #: po/guile_strings.txt:181 #, c-format @@ -1938,9 +1920,8 @@ msgid "Primary Sort Order" msgstr "Hauptsortier-Reihenfolge" #: po/guile_strings.txt:191 -#, fuzzy msgid "Name" -msgstr "Nummer" +msgstr "Name" #: po/guile_strings.txt:192 msgid "Descending" @@ -2073,9 +2054,8 @@ msgid "First Option" msgstr "Erste Option" #: po/guile_strings.txt:225 -#, fuzzy msgid "Display the Stock Portfolio report." -msgstr "Den 'Hallo Welt'-Report anzeigen" +msgstr "Den Portfolio-Bericht anzeigen" #: po/guile_strings.txt:226 msgid "" @@ -2165,9 +2145,8 @@ msgid "Primary Key" msgstr "Primärschlüssel" #: po/guile_strings.txt:247 -#, fuzzy msgid "Ticker" -msgstr "Zeit" +msgstr "Ticker" #: po/guile_strings.txt:248 msgid "Time and Date Option" @@ -2230,19 +2209,16 @@ msgid "Average Balance" msgstr "Durchschnitt" #: po/guile_strings.txt:265 -#, fuzzy msgid "Totals" msgstr "Gesamt" #: po/guile_strings.txt:266 -#, fuzzy msgid "Profit/Loss" msgstr "Saldo Einnahmen/Ausgaben" #: po/guile_strings.txt:267 -#, fuzzy msgid "Shares" -msgstr "Belastung" +msgstr "Anteile" #: po/guile_strings.txt:268 msgid "Show All Transactions" @@ -2377,9 +2353,8 @@ msgstr "" "Zeige Kreditkarten-, Schulden-, Ausgleichs- und Einkommenskonten umgedreht" #: po/guile_strings.txt:300 -#, fuzzy msgid "This is a number option." -msgstr "Dies ist eine boolsche Option" +msgstr "Dies ist eine Zahlen Option" #: po/guile_strings.txt:302 msgid "Multi mode active split background" @@ -2416,7 +2391,6 @@ msgid "Something is very wrong with QIF Importing." msgstr "Es ist etwas nicht in Ordnung mit dem QIF-Import." #: src/gnome/glade-gnc-dialogs.c:74 -#, fuzzy msgid "Import QIF Files" msgstr "QIF-File importieren" @@ -2518,16 +2492,14 @@ msgid "Categories" msgstr "Kategorien" #: src/gnome/glade-gnc-dialogs.c:506 -#, fuzzy msgid "Select Account" -msgstr "Konto löschen" +msgstr "Konto auswählen" #: src/gnome/glade-gnc-dialogs.c:564 msgid "Selected account:" msgstr "Ausgewähltes Konto:" #: src/gnome/glade-gnc-dialogs.c:573 -#, fuzzy msgid "Description:" msgstr "Beschreibung:" @@ -2540,7 +2512,6 @@ msgid "Mutual" msgstr "Investmentfonds" #: src/gnome/glade-gnc-dialogs.c:700 -#, fuzzy msgid "Print Preview" msgstr "Vorschau" @@ -2585,403 +2556,390 @@ msgid "Preview" msgstr "Vorschau" #: src/gnome/glade-gnc-dialogs.c:1036 -#, fuzzy msgid "Select Paper Size" -msgstr "Drucker auswählen" +msgstr "Papiergrösse auswählen" #: src/gnome/glade-gnc-dialogs.c:1149 -#, fuzzy msgid "Print Check" -msgstr "Einstellungen drucken" +msgstr "Scheck drucken" #: src/gnome/glade-gnc-dialogs.c:1178 -#, fuzzy msgid "Check format:" -msgstr "Datumsformat:" +msgstr "Scheckformat:" #: src/gnome/glade-gnc-dialogs.c:1186 src/gnome/glade-gnc-dialogs.c:1356 -#, fuzzy msgid "Check position:" -msgstr "Girokonto" +msgstr "Scheckposition:" #: src/gnome/glade-gnc-dialogs.c:1216 msgid "Quicken/QuickBooks (tm)" -msgstr "" +msgstr "Quicken/Quickbooks (tm)" #: src/gnome/glade-gnc-dialogs.c:1219 src/gnome/glade-gnc-dialogs.c:1240 #: src/gnome/glade-gnc-dialogs.c:1276 -#, fuzzy msgid "Custom" -msgstr "AutoDepot" +msgstr "Üblich" #: src/gnome/glade-gnc-dialogs.c:1231 -#, fuzzy msgid "Top" -msgstr "Zu" +msgstr "Anfang/Oben" #: src/gnome/glade-gnc-dialogs.c:1234 -#, fuzzy msgid "Middle" -msgstr "Datei" +msgstr "Mittig" #: src/gnome/glade-gnc-dialogs.c:1237 msgid "Bottom" -msgstr "" +msgstr "Unten/Ende" #: src/gnome/glade-gnc-dialogs.c:1252 msgid "December 31, 2000" -msgstr "" +msgstr "Dezember 31., 2000" #: src/gnome/glade-gnc-dialogs.c:1255 msgid "31 December, 2000" -msgstr "" +msgstr "31. Dezember, 2000" #: src/gnome/glade-gnc-dialogs.c:1258 -#, fuzzy msgid "Dec 31, 2000" -msgstr "Dezimal (1,000.00)" +msgstr "Dez 31, 2000" #: src/gnome/glade-gnc-dialogs.c:1261 msgid "31 Dec, 2000" -msgstr "" +msgstr "31. Dez, 2000" #: src/gnome/glade-gnc-dialogs.c:1264 msgid "12/31/2000" -msgstr "" +msgstr "12/31/2000" #: src/gnome/glade-gnc-dialogs.c:1267 msgid "12/31/00" -msgstr "" +msgstr "12/31/00" #: src/gnome/glade-gnc-dialogs.c:1270 msgid "31/12/2000" -msgstr "" +msgstr "31/12/2000" #: src/gnome/glade-gnc-dialogs.c:1273 msgid "31/12/00" -msgstr "" +msgstr "31/12/00" #: src/gnome/glade-gnc-dialogs.c:1281 msgid "Custom check parameters" -msgstr "" +msgstr "Allgemeine Scheck-Parameter" #: src/gnome/glade-gnc-dialogs.c:1316 -#, fuzzy msgid "Payee:" -msgstr "Belastung" +msgstr "Zahlungsempfänger" #: src/gnome/glade-gnc-dialogs.c:1324 -#, fuzzy msgid "Date:" -msgstr "Datum" +msgstr "Datum:" #: src/gnome/glade-gnc-dialogs.c:1332 msgid "Amount (words):" -msgstr "" +msgstr "Betrag (in Worten):" #: src/gnome/glade-gnc-dialogs.c:1340 msgid "Amount (numbers):" -msgstr "" +msgstr "Betrag (in Zahlen):" #: src/gnome/glade-gnc-dialogs.c:1348 -#, fuzzy msgid "Memo:" -msgstr "Memo" +msgstr "Memo:" #: src/gnome/glade-gnc-dialogs.c:1372 msgid "Units:" -msgstr "" +msgstr "Einheiten:" #: src/gnome/glade-gnc-dialogs.c:1387 msgid "x" -msgstr "" +msgstr "x" #: src/gnome/glade-gnc-dialogs.c:1457 -#, fuzzy msgid "Inches" -msgstr "Zunahme" +msgstr "Inches" #: src/gnome/glade-gnc-dialogs.c:1460 msgid "Centimeters" -msgstr "" +msgstr "Zentimeter" #: src/gnome/glade-gnc-dialogs.c:1463 msgid "Millimeters" -msgstr "" +msgstr "Millimeter" #: src/gnome/glade-gnc-dialogs.c:1466 -#, fuzzy msgid "Points" -msgstr "Saldo Einnahmen/Ausgaben" +msgstr "Punkte" #: src/gnome/glade-gnc-dialogs.c:1478 msgid "y" -msgstr "" +msgstr "y" #: src/gnome/print-session.c:230 msgid "You must select a printer first." msgstr "Sie müssen erst einen Drucker auswählen" -#~ msgid "Double line mode with multi-line cursor" -#~ msgstr "Doppel-Zeilen Modus mit Multi-Zeilen-Cursor" +msgid "Double line mode with multi-line cursor" +msgstr "Doppel-Zeilen Modus mit Multi-Zeilen-Cursor" -#~ msgid "Single line mode with multi-line cursor" -#~ msgstr "Einzel-Zeilen Modus mit Multi-Zeilen-Cursor" +msgid "Single line mode with multi-line cursor" +msgstr "Einzel-Zeilen Modus mit Multi-Zeilen-Cursor" -#~ msgid "Adjust the balance of the selected account" -#~ msgstr "Saldo anpassen" +msgid "Adjust the balance of the selected account" +msgstr "Saldo anpassen" -#~ msgid "Adjust the balance of the main account for this register" -#~ msgstr "Anpassen des Saldo" +msgid "Adjust the balance of the main account for this register" +msgstr "Anpassen des Saldo" -#~ msgid "Move to the blank transaction at the bottom of the register" -#~ msgstr "Springe zur ersten freien Zeile" +msgid "Move to the blank transaction at the bottom of the register" +msgstr "Springe zur ersten freien Zeile" -#~ msgid "Cancel the current transaction" -#~ msgstr "Buchung nicht ausführen" +msgid "Cancel the current transaction" +msgstr "Buchung nicht ausführen" -#~ msgid "Close this register window" -#~ msgstr "Fenster schliessen" +msgid "Close this register window" +msgstr "Fenster schliessen" -#~ msgid "Set the date range of this register" -#~ msgstr "Den Datumsbereich dieses Registers setzen" +msgid "Set the date range of this register" +msgstr "Den Datumsbereich dieses Registers setzen" -#~ msgid "Delete selected account" -#~ msgstr "Gewähltes Konto löschen." +msgid "Delete selected account" +msgstr "Gewähltes Konto löschen." -#~ msgid "Delete the current transaction" -#~ msgstr "Buchung löschen" +msgid "Delete the current transaction" +msgstr "Buchung löschen" -#~ msgid "Make a copy of the current transaction" -#~ msgstr "Aktuelle Buchung kopieren" +msgid "Make a copy of the current transaction" +msgstr "Aktuelle Buchung kopieren" -#~ msgid "Edit the selected account" -#~ msgstr "Gewähltes Konto bearbeiten." +msgid "Edit the selected account" +msgstr "Gewähltes Konto bearbeiten." -#~ msgid "Edit the main account for this register" -#~ msgstr "Bearbeiten des Hauptkonto" +msgid "Edit the main account for this register" +msgstr "Bearbeiten des Hauptkonto" -#~ msgid "Exit GnuCash" -#~ msgstr "GnuCash verlassen." +msgid "Exit GnuCash" +msgstr "GnuCash verlassen." -#~ msgid "Open the GnuCash help window" -#~ msgstr "Das GnuCash-Hilfe-Fenster öffnen" +msgid "Open the GnuCash help window" +msgstr "Das GnuCash-Hilfe-Fenster öffnen" -#~ msgid "Import a Quicken QIF file" -#~ msgstr "Importieren einer Quicken QIF-Datei" +msgid "Import a Quicken QIF file" +msgstr "Importieren einer Quicken QIF-Datei" -#~ msgid "Jump to the corresponding transaction in the other account" -#~ msgstr "Zur passenden Gegentransaktion im Gegenkonto springen" +msgid "Jump to the corresponding transaction in the other account" +msgstr "Zur passenden Gegentransaktion im Gegenkonto springen" -#~ msgid "Create a new account" -#~ msgstr "Ein neues Konto eröffnen." +msgid "Create a new account" +msgstr "Ein neues Konto eröffnen." -#~ msgid "Create a new file" -#~ msgstr "Eine neue Datei anlegen" +msgid "Create a new file" +msgstr "Eine neue Datei anlegen" -#~ msgid "Open the selected account" -#~ msgstr "Gewähltes Konto löschen." +msgid "Open the selected account" +msgstr "Gewähltes Konto löschen." -#~ msgid "Open the selected account and all its subaccounts" -#~ msgstr "Öffne das gewählte Konto und alle Sub-Konten" +msgid "Open the selected account and all its subaccounts" +msgstr "Öffne das gewählte Konto und alle Sub-Konten" -#~ msgid "Open a file" -#~ msgstr "Datei öffnen" +msgid "Open a file" +msgstr "Datei öffnen" -#~ msgid "Open the global preferences dialog" -#~ msgstr "Allgemeine Optionen" +msgid "Open the global preferences dialog" +msgstr "Allgemeine Optionen" -#~ msgid "Reconcile the selected account" -#~ msgstr "Gewähltes Konto ausgleichen" +msgid "Reconcile the selected account" +msgstr "Gewähltes Konto ausgleichen" -#~ msgid "Reconcile the main account for this register" -#~ msgstr "Ausgleichen des Hauptkontos" +msgid "Reconcile the main account for this register" +msgstr "Ausgleichen des Hauptkontos" -#~ msgid "Record the current transaction" -#~ msgstr "Buchung durchführen" +msgid "Record the current transaction" +msgstr "Buchung durchführen" -#~ msgid "Save the file to disk" -#~ msgstr "Speichern dieser Datei" +msgid "Save the file to disk" +msgstr "Speichern dieser Datei" -#~ msgid "Identify and fix problems in the account" -#~ msgstr "Identifizieren und Beseitigen von Problemen in diesem Konto" +msgid "Identify and fix problems in the account" +msgstr "Identifizieren und Beseitigen von Problemen in diesem Konto" -#~ msgid "Identify and fix problems in all the accounts" -#~ msgstr "Identifizieren und Beseitigen von Problemen in allen Konten" +msgid "Identify and fix problems in all the accounts" +msgstr "Identifizieren und Beseitigen von Problemen in allen Konten" -#~ msgid "Identify and fix problems in the account and its subaccounts" -#~ msgstr "" -#~ "Identifizieren und Beseitigen von Problemen in diesem Konto und in den " -#~ "Unterkonten" +msgid "Identify and fix problems in the account and its subaccounts" +msgstr "" +"Identifizieren und Beseitigen von Problemen in diesem Konto und in den " +"Unterkonten" -#~ msgid "Identify and fix problems in the accounts of this register" -#~ msgstr "Identifizieren und Beseitigen von Problemen in diesem Konto" +msgid "Identify and fix problems in the accounts of this register" +msgstr "Identifizieren und Beseitigen von Problemen in diesem Konto" -#~ msgid "Show all of the transactions in the account" -#~ msgstr "Alle Buchungen anzeigen" +msgid "Show all of the transactions in the account" +msgstr "Alle Buchungen anzeigen" -#~ msgid "Sort by Amount, then Date, then Num" -#~ msgstr "Sortieren nach Betrag, Datum und danach nach Nummer" +msgid "Sort by Amount, then Date, then Num" +msgstr "Sortieren nach Betrag, Datum und danach nach Nummer" -#~ msgid "Sort by Date, then Num, then Amount" -#~ msgstr "Sortieren nach Datum, Nummer und danach nach Summe" +msgid "Sort by Date, then Num, then Amount" +msgstr "Sortieren nach Datum, Nummer und danach nach Summe" -#~ msgid "Sort by Description, then Date, then Num" -#~ msgstr "Sortieren nach Beschreibung, Datum und danach nach Nummer" +msgid "Sort by Description, then Date, then Num" +msgstr "Sortieren nach Beschreibung, Datum und danach nach Nummer" -#~ msgid "Sort by Memo, then Date, then Num" -#~ msgstr "Sortieren nach Memo, Datum und danach nach Nummer" +msgid "Sort by Memo, then Date, then Num" +msgstr "Sortieren nach Memo, Datum und danach nach Nummer" -#~ msgid "Sort by Num, then Date, then Amount" -#~ msgstr "Sortieren nach Nummer, Datum und danach nach Betrag" +msgid "Sort by Num, then Date, then Amount" +msgstr "Sortieren nach Nummer, Datum und danach nach Betrag" -#~ msgid "Keep normal account order" -#~ msgstr "Beibehalten der normalen Kontoreihenfolge" +msgid "Keep normal account order" +msgstr "Beibehalten der normalen Kontoreihenfolge" -#~ msgid "Transfer funds from one account to another" -#~ msgstr "Transferieren von Währungen von einem Konto zu einem anderen" +msgid "Transfer funds from one account to another" +msgstr "Transferieren von Währungen von einem Konto zu einem anderen" -#~ msgid "_Account" -#~ msgstr "Konto" +msgid "_Account" +msgstr "Konto" -#~ msgid "_Accounts" -#~ msgstr "_Konten" +msgid "_Accounts" +msgstr "_Konten" -#~ msgid "_Blank" -#~ msgstr "Leer" +msgid "_Blank" +msgstr "Leer" -#~ msgid "_Cancel" -#~ msgstr "Abbrechen" +msgid "_Cancel" +msgstr "Abbrechen" -#~ msgid "_Date Range" -#~ msgstr "Datumsbereich" +msgid "_Date Range" +msgstr "Datumsbereich" -#~ msgid "_Delete Account" -#~ msgstr "Konto löschen" +msgid "_Delete Account" +msgstr "Konto löschen" -#~ msgid "_Delete" -#~ msgstr "Löschen" +msgid "_Delete" +msgstr "Löschen" -#~ msgid "D_uplicate" -#~ msgstr "Wiederholen" +msgid "D_uplicate" +msgstr "Wiederholen" -#~ msgid "_Edit Account" -#~ msgstr "_Konto bearbeiten" +msgid "_Edit Account" +msgstr "_Konto bearbeiten" -#~ msgid "_Help" -#~ msgstr "_Hilfe" +msgid "_Help" +msgstr "_Hilfe" -#~ msgid "_Jump" -#~ msgstr "Springe" +msgid "_Jump" +msgstr "Springe" -#~ msgid "_Open Account" -#~ msgstr "_Konto öffnen" +msgid "_Open Account" +msgstr "_Konto öffnen" -#~ msgid "Open S_ubaccounts" -#~ msgstr "Öffnen Unterkonten" +msgid "Open S_ubaccounts" +msgstr "Öffnen Unterkonten" -#~ msgid "_Record" -#~ msgstr "Eintragen" +msgid "_Record" +msgstr "Eintragen" -#~ msgid "_Register" -#~ msgstr "Register" +msgid "_Register" +msgstr "Register" -#~ msgid "_Scrub" -#~ msgstr "Ausbuchen" +msgid "_Scrub" +msgstr "Ausbuchen" -#~ msgid "Scrub A_ccount" -#~ msgstr "Konto ausbuchen" +msgid "Scrub A_ccount" +msgstr "Konto ausbuchen" -#~ msgid "Scrub A_ll" -#~ msgstr "Ausbuchen" +msgid "Scrub A_ll" +msgstr "Ausbuchen" -#~ msgid "Scrub Su_baccounts" -#~ msgstr "Ausbuchen Unterkonten" +msgid "Scrub Su_baccounts" +msgstr "Ausbuchen Unterkonten" -#~ msgid "Show _All" -#~ msgstr "Alle anzeigen" +msgid "Show _All" +msgstr "Alle anzeigen" -#~ msgid "Sort _Order" -#~ msgstr "Sortierreihenfolge" +msgid "Sort _Order" +msgstr "Sortierreihenfolge" -#~ msgid "_Style" -#~ msgstr "Stil" +msgid "_Style" +msgstr "Stil" -#~ msgid "_Transaction" -#~ msgstr "Transaktion" +msgid "_Transaction" +msgstr "_Transaktion" -#~ msgid "New File" -#~ msgstr "Datei öffnen" +msgid "New File" +msgstr "Neue Datei" -#~ msgid "Sort by Amount" -#~ msgstr "Sortiere nach Betrag" +msgid "Sort by Amount" +msgstr "Sortiere nach Betrag" -#~ msgid "Sort by Date" -#~ msgstr "Sortiere nach Datum" +msgid "Sort by Date" +msgstr "Sortiere nach Datum" -#~ msgid "Sort by Description" -#~ msgstr "Sortiere nach Beschreibung" +msgid "Sort by Description" +msgstr "Sortiere nach Beschreibung" -#~ msgid "Sort by Memo" -#~ msgstr "Sortiere nach Memo" +msgid "Sort by Memo" +msgstr "Sortiere nach Memo" -#~ msgid "Sort by Num" -#~ msgstr "Sortiere nach Nummer" +msgid "Sort by Num" +msgstr "Sortiere nach Nummer" -#~ msgid "Standard order" -#~ msgstr "Standard Order" +msgid "Standard order" +msgstr "Standard Order" -#~ msgid "Blank" -#~ msgstr "Leer" +msgid "Blank" +msgstr "Leer" -#~ msgid "Cancel" -#~ msgstr "Abbrechen" +msgid "Cancel" +msgstr "Abbrechen" -#~ msgid "Close" -#~ msgstr "Schliessen" +msgid "Close" +msgstr "Schliessen" -#~ msgid "Delete" -#~ msgstr "Löschen" +msgid "Delete" +msgstr "Löschen" -#~ msgid "Duplicate" -#~ msgstr "Wiederholen" +msgid "Duplicate" +msgstr "Wiederholen" -#~ msgid "Edit" -#~ msgstr "Bearbeiten" +msgid "Edit" +msgstr "Bearbeiten" -#~ msgid "Exit" -#~ msgstr "Beenden" +msgid "Exit" +msgstr "Beenden" -#~ msgid "Import" -#~ msgstr "QIF-File importieren" +msgid "Import" +msgstr "QIF-File importieren" -#~ msgid "Jump" -#~ msgstr "Sprung" +msgid "Jump" +msgstr "Sprung" -#~ msgid "New" -#~ msgstr "Neu" +msgid "New" +msgstr "Neu" -#~ msgid "Open" -#~ msgstr "Öffnen" +msgid "Open" +msgstr "Öffnen" -#~ msgid "Record" -#~ msgstr "Eintragen" +msgid "Record" +msgstr "Eintragen" -#~ msgid "Save" -#~ msgstr "Sichern" +msgid "Save" +msgstr "Sichern" -#~ msgid "Transfer" -#~ msgstr "Transfer" +msgid "Transfer" +msgstr "Transfer" -#~ msgid "Show transactions on multiple lines with one line for each split" -#~ msgstr "Transaktionen im Multi-Mode mit einer Zeile pro Split anzeigen" +msgid "Show transactions on multiple lines with one line for each split" +msgstr "Transaktionen im Multi-Mode mit einer Zeile pro Split anzeigen" -#~ msgid "__gui" -#~ msgstr "__gui" +msgid "__gui" +msgstr "__gui" -#~ msgid "Print Dialog" -#~ msgstr "Dialog ausdrucken" +msgid "Print Dialog" +msgstr "Dialog ausdrucken" -#~ msgid "Failed to load QIF file. Are you sure it's a QIF file?" -#~ msgstr "" -#~ "QIF-Import fehlgeschlagen.Sind sie sicher, dass es eine QIF-Datei ist?" +msgid "Failed to load QIF file. Are you sure it's a QIF file?" +msgstr "" +"QIF-Import fehlgeschlagen.Sind sie sicher, dass es eine QIF-Datei ist?" diff --git a/src/SplitLedger.c b/src/SplitLedger.c index 9b6c108de5..2232d91163 100644 --- a/src/SplitLedger.c +++ b/src/SplitLedger.c @@ -2070,10 +2070,10 @@ xaccSRLoadRegister (SplitRegister *reg, Split **slist, gncBoolean dynamic; unsigned int changed; + int save_phys_col; + int type, style; int phys_row; int vrow; - int type, style; - int save_phys_col; int i; xaccSplitRegisterConfigColors (reg); @@ -2107,6 +2107,8 @@ xaccSRLoadRegister (SplitRegister *reg, Split **slist, /* paranoia */ if (save_phys_col < 0) save_phys_col = 0; + if (save_phys_col >= table->num_phys_cols) + save_phys_col = table->num_phys_cols - 1; /* count the number of rows, looking for the place we want to go. */ found_split = xaccSRCountRows (reg, slist, find_trans, find_split); diff --git a/src/backup.txt b/src/backup.txt new file mode 100644 index 0000000000..28236756d8 --- /dev/null +++ b/src/backup.txt @@ -0,0 +1,40 @@ + +Currently, backups and log files are automatically stored by the engine +with date/time stamps every time the user hits 'save' in the gui. + +(The actual file writing is done by xaccWriteAccountGroupFile() in +in src/engine/FileIOP.h) + +Proposed design changes: +------------------------ +a) Allow user to configure which directory backups should be put into. + (currently, this is same as current directory). Requires changes to + engine FileIOP.h as well as GUI. + + One possible default is ~/.gnucash/data/ (Which is supposed to + be the place where files are saved if no directory is specified.!?) + +b) Prompt the user to make a backup every third save. Make this number + configurable. If no default backup path set, prompt to set it, + with suggested path being ~/.gnucash/backups/ + +c) If save format was XML text, then could use RCS ... + Alternately, +For those that don't know, xdelta is like RCS, but it's designed to +handle any kind of data, including binary, is supposed to work really +well, and transparently handles gzipped data with some form of MD5sum +verification. It's also available in library form. Like RCS it would +give us the ability to do cool things like snapshot the data every so +often for nearly no cost. Want to see what things looked like 6 +months ago? Just enter the right date into the "time-warp" dialog :> + +For those on Debian systems, just install the xdelta and +libxdelta2-dev packages. Others can get the source from +ftp://www.xcf.berkeley.edu/pub/xdelta/, or just go to +ftp.debian.org:/pub/debian/dists/unstable/main/source/utils/xdelta*.tar.gz + + +d) Could monitor how many changes (records altered) the user has made, + and could prompt for more frequent saves if lots of editing has + ocurred... + diff --git a/src/scm/report-utilities.scm b/src/scm/report-utilities.scm index 7d9e9b4ff1..91d3ca672e 100644 --- a/src/scm/report-utilities.scm +++ b/src/scm/report-utilities.scm @@ -57,6 +57,7 @@ ;; like map, but restricted to one dimension, and ;; guaranteed to have inorder semantics. +;; note: map-in-order is in a SRFI. (define (gnc:inorder-map the-list fn) (let loop ((rest the-list) (collected '())) diff --git a/src/scm/report/budget-report.scm b/src/scm/report/budget-report.scm index 90a97a3076..bb24628843 100644 --- a/src/scm/report/budget-report.scm +++ b/src/scm/report/budget-report.scm @@ -3,26 +3,32 @@ ;; Report on budget ;; Bryan Larsen (blarsen@ada-works.com) -;; situations I want to handle -;; lunch M-F -- funny period -;; xmas gifts & birthday gifts in same budget line -;; car repairs -- contingency -;; car fuel-ups -- known amount, variable period -;; paychecks & rent payments -- specific dates +;; TODO +;; properly handle income as well +;; proper totals +;; "upcoming/overdue bills" report +;; druids to enter budget +;; save/load budget +;; internationalization +;; speedup: replace linear search with hash, +;; create structure functions on load, +;; move subexpressions outside loops +;; clean up report +;; graph budget progress (require 'sort) (require 'record) (gnc:depend "report-utilities.scm") (gnc:depend "html-generator.scm") (gnc:depend "date-utilities.scm") +(gnc:depend "acc-create.scm") ;; budget types - ;(define gnc:budget-recurring 1) ; regular, recurring budget expenses - ; that happen once per period - ;(define gnc:budget-contingency 2) ; a budget item where you estimate a - ; value over a long period for - ; unexpected expenses. - +;;(define gnc:budget-recurring 1) ; regular, recurring budget expenses +;; that happen once per period +;;(define gnc:budget-contingency 2) ; a budget item where you estimate a +;; value over a long period for +;; unexpected expenses. ;; convert a date to a defined fraction (define (gnc:date-to-N-fraction caltime type) (case type @@ -126,92 +132,151 @@ (define budget-entry-structure (make-record-type "budget-entry-structure" - '(description amount accounts period period-type budget-type - window-start window-end))) + '(description accounts subentries))) -(define (make-budget-entry desc amt acct per ptype budget-type start end) +(define budget-subentry-structure + (make-record-type + "budget-subentry-structure" + '(description amount period period-type mechanism))) + +(define budget-recurring-mechanism-structure + (make-record-type + "budget-recurring-mechanism-structure" + '())) + +(define budget-bill-mechanism-structure + (make-record-type + "budget-bill-mechanism-structure" + '(window-start-day window-end-day))) + +(define budget-contingency-mechanism-structure + (make-record-type + "budget-contingency-mechanism-structure" + '())) + +(define (make-budget-entry desc acct subentries) ((record-constructor budget-entry-structure) - desc amt acct per ptype budget-type start end)) + desc acct subentries)) + +(define (make-budget-subentry desc amt per ptype mech) + ((record-constructor budget-subentry-structure) + desc amt per ptype mech)) + +(define (make-recurring-mechanism) + ((record-constructor budget-recurring-mechanism-structure))) + +(define (make-bill-mechanism window-start-day window-end-day) + ((record-constructor budget-bill-mechanism-structure) + window-start-day window-end-day)) + +(define (make-contingency-mechanism) + ((record-constructor budget-contingency-mechanism-structure))) (define gnc:budget-entries (list - (make-budget-entry "lunch" 8 '("Food:Lunch") 1 - 'gnc:budget-day 'gnc:budget-recurring 1 0) - (make-budget-entry "junk food" 0.50 '("Food:Junk") 1 - 'gnc:budget-day 'gnc:budget-recurring 1 0) - (make-budget-entry "car repairs" 2500 '("Car:Repairs") 5 - 'gnc:budget-year 'gnc:budget-contingency 1 0) - (make-budget-entry "rent" 312.50 '("Household:Rent") 1 - 'gnc:budget-month 'gnc:budget-trigger -1 2) - (make-budget-entry "car payments" 374.80 '("Car:Loan Payments") 1 - 'gnc:budget-month 'gnc:budget-trigger 13 17) - (make-budget-entry "car 2" 374.80 '("Car:Loan Payments") 1 - 'gnc:budget-month 'gnc:budget-trigger 20 20))) + ;; first line is always the "other" collector. + (make-budget-entry "other" '() + (list + (make-budget-subentry "" 3 1 'gnc:budget-day + (make-recurring-mechanism)))) + (make-budget-entry "lunch" '("Expense:Food:Lunch" "Expense:Food:Junk") + (list + (make-budget-subentry "" 8 1 'gnc:budget-day + (make-recurring-mechanism)))) + (make-budget-entry "car repairs" '("Expense:Car:Repairs") + (list + (make-budget-subentry "contingency" 2500 5 'gnc:budget-year + (make-contingency-mechanism)) + (make-budget-subentry "maintenance" 50 6 'gnc:budget-month + (make-recurring-mechanism)))) + (make-budget-entry "rent" '("Expense:Household:Rent") + (list + (make-budget-subentry "" 312.50 1 'gnc:budget-month + (make-bill-mechanism 0 2)))) + (make-budget-entry "car payments" '("Expense:Car:Loan Payments") + (list + (make-budget-subentry "" 374.80 1 'gnc:budget-month + (make-bill-mechanism 13 17)))))) (define (budget-entry-get-description budget-entry) ((record-accessor budget-entry-structure 'description) budget-entry)) -(define (budget-entry-get-amount budget-entry) - ((record-accessor budget-entry-structure 'amount) budget-entry)) +(define (budget-subentry-get-description subentry) + ((record-accessor budget-subentry-structure 'description) subentry)) (define (budget-entry-get-accounts budget-entry) ((record-accessor budget-entry-structure 'accounts) budget-entry)) -(define (budget-entry-get-period budget-entry) - ((record-accessor budget-entry-structure 'period) budget-entry)) +(define (budget-entry-get-subentries budget-entry) + ((record-accessor budget-entry-structure 'subentries) budget-entry)) -(define (budget-entry-get-period-type budget-entry) - ((record-accessor budget-entry-structure 'period-type) budget-entry)) +(define (budget-subentry-get-amount subentry) + ((record-accessor budget-subentry-structure 'amount) subentry)) -(define (budget-entry-get-window-start budget-entry) - ((record-accessor budget-entry-structure 'window-start) budget-entry)) +(define (budget-subentry-get-period subentry) + ((record-accessor budget-subentry-structure 'period) subentry)) -(define (budget-entry-get-window-end budget-entry) - ((record-accessor budget-entry-structure 'window-end) budget-entry)) +(define (budget-subentry-get-period-type subentry) + ((record-accessor budget-subentry-structure 'period-type) subentry)) + +(define (budget-bill-get-window-start-day bill) + ((record-accessor budget-bill-mechanism-structure 'window-start-day) bill)) + +(define (budget-bill-get-window-end-day bill) + ((record-accessor budget-bill-mechanism-structure 'window-end-day) bill)) + +(define (budget-subentry-get-mechanism subentry) + ((record-accessor budget-subentry-structure 'mechanism) subentry)) (define (budget-description-html-proc) - (lambda (budget-line) - (html-generic-cell #f #f #f - (budget-entry-get-description - (budget-line-get-entry budget-line))))) + (lambda (entry subentry report subreport) + (html-generic-cell #f #f #f (budget-entry-get-description entry)))) -(define (budget-amount-html-proc) - (lambda (budget-line) - (html-currency-cell #f #f (budget-entry-get-amount - (budget-line-get-entry budget-line))))) +(define (budget-sub-description-html-proc) + (lambda (entry subentry report subreport) + (html-generic-cell #f #f #f (budget-subentry-get-description subentry)))) -;; fixme -- only returns the first account in the list (define (budget-accounts-html-proc) - (lambda (budget-line) + (lambda (entry subentry report subreport) (html-generic-cell #f #f #f - (car (budget-entry-get-accounts (budget-line-get-entry budget-line)))))) + (list->string (budget-entry-get-accounts entry))))) + +(define (budget-amount-html-proc) + (lambda (entry subentry report subreport) + (html-currency-cell #f #f (budget-subentry-get-amount subentry)))) (define (budget-period-html-proc) - (lambda (budget-line) + (lambda (entry subentry report subreport) (html-number-cell - #f #f "%i" (budget-entry-get-period (budget-line-get-entry budget-line))))) + #f #f "%i" (budget-subentry-get-period subentry)))) (define (budget-period-type-html-proc) - (lambda (budget-line) + (lambda (entry subentry report subreport) (html-generic-cell #f #f #f (gnc:date-describe-type - (budget-entry-get-period-type (budget-line-get-entry budget-line)))))) + (budget-subentry-get-period-type subentry))))) -(define (budget-window-start-html-proc) - (lambda (budget-line) - (html-number-cell - #f #f "%i" (budget-entry-get-window-start (budget-line-get-entry budget-line))))) +(define (budget-window-start-day-html-proc) + (lambda (entry subentry report subreport) + (let ((mechanism (budget-subentry-get-mechanism subentry))) + (if ((record-predicate budget-bill-mechanism-structure) mechanism) + (html-number-cell + #f #f "%i" (budget-bill-get-window-start-day mechanism)) + (html-generic-cell #f #f #f ""))))) -(define (budget-window-end-html-proc) - (lambda (budget-line) - (html-number-cell - #f #f "%i" (budget-entry-get-window-end (budget-line-get-entry budget-line))))) +(define (budget-window-end-day-html-proc) + (lambda (entry subentry report subreport) + (let ((mechanism (budget-subentry-get-mechanism subentry))) + (if ((record-predicate budget-bill-mechanism-structure) mechanism) + (html-number-cell + #f #f "%i" (budget-bill-get-window-end-day mechanism)) + (html-generic-cell #f #f #f ""))))) ;; budget report: a vector with indexes corresponding to the budget ;; 0 - actual: the amount spend / recieved -;; 1 - budgeted: the budgeted amount. Simply the periods * amount +;; 1 - nominal: the nominal budgeted amount. Simply the periods * amount ;; 2 - num-periods: the number of periods for the line in the report ;; 3 - mimimum-expected: minimum you expected to spend during the ;; report period @@ -222,83 +287,88 @@ (define budget-report-structure (make-record-type "budget-report-structure" - '(actual budgeted num-periods minimum-expected maximum-expected - time-remaining num-triggers-upper num-triggers-lower))) + '(actual nominal minimum-expected maximum-expected subreports))) -(define (make-empty-budget-report) +(define budget-subreport-structure + (make-record-type + "budget-subreport-structure" + '(nominal minimum-expected maximum-expected))) + +(define (make-empty-budget-report entry) ((record-constructor budget-report-structure) - 0 0 0 0 0 0 0 0)) + 0 0 0 0 + (map + (lambda (subentry) + (make-empty-subreport)) + (budget-entry-get-subentries entry)))) + +(define (make-empty-subreport) + ((record-constructor budget-subreport-structure) + 0 0 0)) + +(define (budget-report-get-subreports brep) + ((record-accessor budget-report-structure 'subreports) brep)) (define (budget-report-get-actual brep) ((record-accessor budget-report-structure 'actual) brep)) -(define (budget-report-get-budgeted brep) - ((record-accessor budget-report-structure 'budgeted) brep)) +(define (budget-report-get-nominal brep) + ((record-accessor budget-report-structure 'nominal) brep)) -(define (budget-report-get-num-periods brep) - ((record-accessor budget-report-structure 'num-periods) brep)) +(define (budget-subreport-get-nominal brep) + ((record-accessor budget-subreport-structure 'nominal) brep)) (define (budget-report-get-minimum-expected brep) ((record-accessor budget-report-structure 'minimum-expected) brep)) +(define (budget-subreport-get-minimum-expected brep) + ((record-accessor budget-subreport-structure 'minimum-expected) brep)) + (define (budget-report-get-maximum-expected brep) ((record-accessor budget-report-structure 'maximum-expected) brep)) -(define (budget-report-get-time-remaining brep) - ((record-accessor budget-report-structure 'time-remaining) brep)) - -(define (budget-report-get-num-triggers-upper brep) - ((record-accessor budget-report-structure 'num-triggers-upper) brep)) - -(define (budget-report-get-num-triggers-lower brep) - ((record-accessor budget-report-structure 'num-triggers-lower) brep)) +(define (budget-subreport-get-maximum-expected brep) + ((record-accessor budget-subreport-structure 'maximum-expected) brep)) (define (budget-actual-html-proc) - (lambda (budget-line) - (html-currency-cell #f #f (budget-report-get-actual - (budget-line-get-report budget-line))))) + (lambda (entry subentry report subreport) + (html-currency-cell #f #f (budget-report-get-actual report)))) -(define (budget-budgeted-html-proc) - (lambda (budget-line) - (html-currency-cell #f #f (budget-report-get-budgeted - (budget-line-get-report budget-line))))) - -(define (budget-num-periods-html-proc) - (lambda (budget-line) - (html-number-cell #f #f "%.6f" (budget-report-get-num-periods - (budget-line-get-report budget-line))))) +(define (budget-nominal-html-proc) + (lambda (entry subentry report subreport) + (html-currency-cell #f #f (budget-report-get-nominal report)))) (define (budget-minimum-expected-html-proc) - (lambda (budget-line) - (html-currency-cell #f #f (budget-report-get-minimum-expected - (budget-line-get-report budget-line))))) + (lambda (entry subentry report subreport) + (html-currency-cell #f #f (budget-report-get-minimum-expected report)))) (define (budget-maximum-expected-html-proc) - (lambda (budget-line) - (html-currency-cell #f #f (budget-report-get-maximum-expected - (budget-line-get-report budget-line))))) + (lambda (entry subentry report subreport) + (html-currency-cell #f #f (budget-report-get-maximum-expected report)))) -(define (budget-time-remaining-html-proc) - (lambda (budget-line) - (html-number-cell #f #f "%.1f" (budget-report-get-time-remaining - (budget-line-get-report budget-line))))) +(define (budget-sub-nominal-html-proc) + (lambda (entry subentry report subreport) + (html-currency-cell #f #f (budget-subreport-get-nominal subreport)))) -(define (budget-num-triggers-upper-html-proc) - (lambda (budget-line) - (html-number-cell #f #f "%.0f" (budget-report-get-num-triggers-upper - (budget-line-get-report budget-line))))) +(define (budget-sub-minimum-expected-html-proc) + (lambda (entry subentry report subreport) + (html-currency-cell #f #f (budget-subreport-get-minimum-expected subreport)))) -(define (budget-num-triggers-lower-html-proc) - (lambda (budget-line) - (html-number-cell #f #f "%.0f" (budget-report-get-num-triggers-lower - (budget-line-get-report budget-line))))) +(define (budget-sub-maximum-expected-html-proc) + (lambda (entry subentry report subreport) + (html-currency-cell #f #f (budget-subreport-get-maximum-expected subreport)))) + +(define (budget-null-html-proc) + (lambda (entry subentry report subreport) + (html-generic-cell + #f #f #f ""))) (define budget-line-structure (make-record-type "budget-line-structure" '(entry report))) (define (make-budget-line entry report) - ((record-constructor budget-line-structure) entry report)) + ((record-constructor budget-line-structure) entry report)) (define (budget-line-get-entry line) ((record-accessor budget-line-structure 'entry) line)) @@ -306,6 +376,53 @@ (define (budget-line-get-report line) ((record-accessor budget-line-structure 'report) line)) +(define report-spec-structure + (make-record-type + "report-spec-structure" + '(header format-proc type))) + +(define (make-report-spec header format-proc type) + ((record-constructor report-spec-structure) + header format-proc type)) + +(define (report-spec-get-header spec) + ((record-accessor report-spec-structure 'header) spec)) + +(define (report-spec-get-format-proc spec) + ((record-accessor report-spec-structure 'format-proc) spec)) + +(define (report-spec-get-type spec) + ((record-accessor report-spec-structure 'type) spec)) + +(define (budget-line-html line report-specs) + (let ((entry (budget-line-get-entry line)) + (report (budget-line-get-report line))) + ;;(map-in-order + (map + (lambda (subentry subreport) + (html-table-row-manual + (map + (lambda (specs) + (case (report-spec-get-type specs) + ((gnc:report-all) + ((report-spec-get-format-proc specs) + entry subentry report subreport)) + ((gnc:report-first) + (if (eqv? subreport (car (budget-report-get-subreports report))) + ((report-spec-get-format-proc specs) + entry subentry report subreport) + ((budget-null-html-proc) + entry subentry report subreport))) + ((gnc:report-last) + (if (= (cdr subentry) '()) + ((report-spec-get-format-proc specs) + entry subentry report subreport) + ((budget-null-html-proc) + entry subentry report subreport))) + (else (gnc:debug "budget-line-html: invalid type")))) + report-specs))) + (budget-entry-get-subentries entry) + (budget-report-get-subreports report)))) ;; add a value to the budget accumulator (define (budget-report-accumulate-actual! value budget-line) @@ -313,56 +430,90 @@ (budget-line-get-report budget-line) (+ value (budget-report-get-actual (budget-line-get-report budget-line))))) -;; calculate the # of periods on a budget line. -;; dates are in # seconds after 1970 -(define (budget-calculate-periods! budget-line begin-date end-date) - (let ((entry (budget-line-get-entry budget-line))) - ((record-modifier budget-report-structure 'num-periods) - (budget-line-get-report budget-line) - (/ (gnc:date-N-delta begin-date end-date - (budget-entry-get-period-type entry)) - (budget-entry-get-period entry))))) +(define (budget-subreport-set-min-expected! subreport min-expected) + ((record-modifier budget-subreport-structure 'minimum-expected) + subreport min-expected)) -;; calculate the budgeted value. -;; dependency: budget-calculate-periods! -(define (budget-calculate-budgeted! budget-line) - ((record-modifier budget-report-structure 'budgeted) +(define (budget-subreport-set-max-expected! subreport max-expected) + ((record-modifier budget-subreport-structure 'maximum-expected) + subreport max-expected)) + +(define (budget-report-accumulate-min-expected! report min-expected) + ((record-modifier budget-report-structure 'minimum-expected) report + (+ min-expected (budget-report-get-minimum-expected report)))) + +(define (budget-report-accumulate-max-expected! report max-expected) + ((record-modifier budget-report-structure 'maximum-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) + (/ (gnc:date-N-delta begin-date end-date + (budget-subentry-get-period-type subentry)) + (budget-subentry-get-period subentry))) + + +(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))) + (for-each + (lambda (subentry subreport) + (let ((mechanism (budget-subentry-get-mechanism subentry))) + (cond (((record-predicate + budget-bill-mechanism-structure) mechanism) + (budget-calculate-bill! + subentry subreport mechanism begin-date end-date)) + (((record-predicate + budget-recurring-mechanism-structure) mechanism) + (budget-calculate-recurring! + subentry subreport mechanism begin-date end-date)) + (((record-predicate + budget-contingency-mechanism-structure) mechanism) + (budget-calculate-contingency! + subentry subreport mechanism begin-date end-date)) + (else (gnc:debug "invalid mechanism!"))) + (budget-report-accumulate-min-expected! + 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-report-get-subreports report)))) + +;; calculate the nominal value. +(define (budget-calculate-nominal! budget-line begin-date end-date) + ((record-modifier budget-report-structure 'nominal) (budget-line-get-report budget-line) - (* (budget-entry-get-amount (budget-line-get-entry budget-line)) - (budget-report-get-num-periods (budget-line-get-report budget-line))))) + (apply + + (map + (lambda (subentry subreport) + (let ((t (* (budget-subentry-get-amount subentry) + (budget-num-periods subentry begin-date end-date)))) + ((record-modifier budget-subreport-structure 'nominal) + subreport t) + t)) + (budget-entry-get-subentries (budget-line-get-entry budget-line)) + (budget-report-get-subreports (budget-line-get-report budget-line)))))) -;; calculate the values for minimum-expected and maxmimum-expected -;; dependency: budget-calculate-periods! -(define (budget-calculate-expected! budget-line) - (let ((brep (budget-line-get-report budget-line)) - (entry (budget-line-get-entry budget-line))) - ; fixme: contingency type budget entries may have a lower minimum - ((record-modifier budget-report-structure 'minimum-expected) brep - (* (budget-entry-get-amount entry) - (floor (budget-report-get-num-periods brep)))) - ((record-modifier budget-report-structure 'maximum-expected) brep - (* (budget-entry-get-amount entry) - (ceiling (budget-report-get-num-periods brep)))))) +(define (budget-calculate-recurring! subentry subreport mechanism begin end) + (let ((np (budget-num-periods subentry begin end)) + (amount (budget-subentry-get-amount subentry))) + (budget-subreport-set-min-expected! subreport (* amount (floor np))) + (budget-subreport-set-max-expected! subreport (* amount (ceiling np))))) -;; calculate the amount of time remaining in the budget period -;; dependency: budget-calculate-periods! -(define (budget-calculate-time-remaining! budget-line) - (let* ((entry (budget-line-get-entry budget-line)) - (brep (budget-line-get-report budget-line)) - (periods (budget-report-get-num-periods brep))) - ((record-modifier budget-report-structure 'time-remaining) brep - (* (- (ceiling periods) periods) - (budget-entry-get-period entry))))) +(define (budget-calculate-contingency! subentry subreport mechanism begin end) + (let ((np (budget-num-periods subentry begin end)) + (amount (budget-subentry-get-amount subentry))) + (let ((min + (max 0 (* (- np 1.0) amount)))) + (budget-subreport-set-min-expected! subreport min) + (budget-subreport-set-max-expected! subreport (+ min amount))))) -;; calculate the number of times the trigger window occurs in the budget -;; period -(define (budget-calculate-num-triggers! budget-line begin-date end-date) - (let ((entry (budget-line-get-entry budget-line))) - (let ((brep (budget-line-get-report budget-line)) - (N-type (budget-entry-get-period-type entry)) - (window-start (budget-entry-get-window-start entry)) - (window-end (budget-entry-get-window-end entry)) - (psize (budget-entry-get-period entry))) +(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 @@ -431,26 +582,33 @@ (floor (/ (gnc:date-to-N-fraction begin-date N-type) psize)))))))) ; now save 'em into the record - ((record-modifier budget-report-structure 'num-triggers-lower) brep - sure) - ((record-modifier budget-report-structure 'num-triggers-upper) brep - (+ sure possible)))))) + (budget-subreport-set-min-expected! subreport + (* amount sure)) + (budget-subreport-set-max-expected! subreport + (* amount (+ sure possible)))))) ;; given an account name, return the budget line ;; return #f if there is no budget line for that account -(define (budget-get-line account-name budget) - (cond ((null? budget) #f) - (else - (let loop2 - ((accounts (budget-entry-get-accounts - (budget-line-get-entry (car budget))))) - (cond ((null? accounts) #f) - (else - (cond ((or (string=? account-name (car accounts)) - (loop2 (cdr accounts))) - (car budget)) - (else - (budget-get-line account-name (cdr budget)))))))))) +(define (budget-get-line account-name budg) + (let loop1 ((budget budg)) + (cond ((null? budget) #f) + (else + (cond ((budget-get-line-2 account-name (car budget)) + (car budget)) + (else (loop1 (cdr budget)))))))) + +;; I should be able to put this inside budget-get-line, but for some +;; reason, it screws up. +(define (budget-get-line-2 account-name budget-line) + (let loop2 + ((accounts (budget-entry-get-accounts + (budget-line-get-entry budget-line)))) + (cond ((null? accounts) #f) + (else + (cond ((or (string=? account-name (car accounts)) + (loop2 (cdr accounts))) + budget-line) + (else #f)))))) ;; register a configuration option for the budget report @@ -503,6 +661,73 @@ "How are you doing on your budget?")))) gnc:*budget-report-options*) +(define gnc:budget-full-report-specs + (list + (make-report-spec + "Description" (budget-description-html-proc) 'gnc:report-first) + (make-report-spec + "Accounts" (budget-accounts-html-proc) 'gnc:report-first) + (make-report-spec + "Description (subs)" (budget-sub-description-html-proc) 'gnc:report-all) + (make-report-spec + "Amount" (budget-amount-html-proc) 'gnc:report-all) + (make-report-spec + "Period" (budget-period-html-proc) 'gnc:report-all) + (make-report-spec + "" (budget-period-type-html-proc) 'gnc:report-all) + (make-report-spec + "Window Start Day" (budget-window-start-day-html-proc) 'gnc:report-all) + (make-report-spec + "Window End Day" (budget-window-end-day-html-proc) 'gnc:report-all) + (make-report-spec + "Actual" (budget-actual-html-proc) 'gnc:report-first) + (make-report-spec + "Nominal (total)" (budget-nominal-html-proc) 'gnc:report-first) + (make-report-spec + "Nominal" (budget-sub-nominal-html-proc) 'gnc:report-all) + (make-report-spec + "Upper Limit (total)" (budget-maximum-expected-html-proc) 'gnc:report-first) + (make-report-spec + "Upper Limit" (budget-sub-maximum-expected-html-proc) 'gnc:report-all) + (make-report-spec + "Lower Limit (total)" (budget-minimum-expected-html-proc) 'gnc:report-first) + (make-report-spec + "Lower Limit" (budget-sub-minimum-expected-html-proc) 'gnc:report-all))) + +(define gnc:budget-balance-report-specs + (list + (make-report-spec + "Description" (budget-description-html-proc) 'gnc:report-first) + (make-report-spec + "Accounts" (budget-accounts-html-proc) 'gnc:report-first) + (make-report-spec + "Description (subs)" (budget-sub-description-html-proc) 'gnc:report-all) + (make-report-spec + "Amount" (budget-amount-html-proc) 'gnc:report-all) + (make-report-spec + "Period" (budget-period-html-proc) 'gnc:report-all) + (make-report-spec + "" (budget-period-type-html-proc) 'gnc:report-all) + (make-report-spec + "Window Start Day" (budget-window-start-day-html-proc) 'gnc:report-all) + (make-report-spec + "Window End Day" (budget-window-end-day-html-proc) 'gnc:report-all) + (make-report-spec + "Nominal (total)" (budget-nominal-html-proc) 'gnc:report-first) + (make-report-spec + "Nominal" (budget-sub-nominal-html-proc) 'gnc:report-all))) + +(define gnc:budget-status-report-specs + (list + (make-report-spec + "Description" (budget-description-html-proc) 'gnc:report-first) + (make-report-spec + "Upper Limit" (budget-maximum-expected-html-proc) 'gnc:report-first) + (make-report-spec + "Lower Limit" (budget-minimum-expected-html-proc) 'gnc:report-first) + (make-report-spec + "Actual" (budget-actual-html-proc) 'gnc:report-first))) + (gnc:define-report ;; version 1 @@ -520,124 +745,59 @@ (gnc:option-value enddate)))) (budget-list (map (lambda (entry) - (make-budget-line entry (make-empty-budget-report))) + (make-budget-line entry (make-empty-budget-report entry))) gnc:budget-entries))) (let loop ((group (gnc:get-current-group))) (if (not (pointer-token-null? group)) (gnc:group-map-accounts (lambda (account) - (let ((line - (budget-get-line - (gnc:account-get-full-name account) - budget-list))) - (if line + (if (eqv? (gnc:account-type->symbol (gnc:account-get-type account)) + 'EXPENSE) + (let* ((line + (budget-get-line + (gnc:account-get-full-name account) + budget-list)) + (line2 (if line line (car budget-list)))) (gnc:for-each-split-in-account account (lambda (split) - (budget-report-accumulate-actual! - (gnc:split-get-value split) line)))) - (loop (gnc:account-get-children account)))) + (budget-report-accumulate-actual! + (gnc:split-get-value split) line2))))) + (loop (gnc:account-get-children account))) group))) (for-each (lambda (line) (begin - (budget-calculate-periods! line begin-date-secs end-date-secs) - (budget-calculate-budgeted! line) - (budget-calculate-expected! line) - (budget-calculate-time-remaining! line) - (budget-calculate-num-triggers! line begin-date-secs end-date-secs))) + (budget-calculate-nominal! line begin-date-secs end-date-secs) + (budget-calculate-expected! line begin-date-secs end-date-secs))) budget-list) - (let ((report-headers '()) - (report-procs '())) - (case (gnc:option-value - (gnc:lookup-option options "Report Options" "View")) - ((full) - (set! report-headers (list - "Description" - "Amount" - "Accounts" - "Period" - "" - "Actual" - "Window Start" - "Window End" - "Budgeted" - "Number of Periods" - "Lower Limit" - "Upper Limit" - "Time Remaining" - "" - "Num Triggers Upper" - "Num Triggers Lower")) - (set! report-procs (list - budget-description-html-proc - budget-amount-html-proc - budget-accounts-html-proc - budget-period-html-proc - budget-period-type-html-proc - budget-actual-html-proc - budget-window-start-html-proc - budget-window-end-html-proc - budget-budgeted-html-proc - budget-num-periods-html-proc - budget-minimum-expected-html-proc - budget-maximum-expected-html-proc - budget-time-remaining-html-proc - budget-period-type-html-proc - budget-num-triggers-upper-html-proc - budget-num-triggers-lower-html-proc))) - ((balancing) - (set! report-headers (list - "Description" - "Accounts" - "Period" - "" - "Amount" - "Number of Periods" - "Budgeted")) - (set! report-procs (list - budget-description-html-proc - budget-accounts-html-proc - budget-period-html-proc - budget-period-type-html-proc - budget-amount-html-proc - budget-num-periods-html-proc - budget-budgeted-html-proc))) - ((status) - (set! report-headers (list - "Description" - "Time Remaining" - "" - "Lower Limit" - "Upper Limit" - "Actual")) - (set! report-procs (list - budget-description-html-proc - budget-time-remaining-html-proc - budget-period-type-html-proc - budget-minimum-expected-html-proc - budget-maximum-expected-html-proc - budget-actual-html-proc))) - (else - (gnc:debug "Invalid view option"))) + (let ((report-specs + (case (gnc:option-value + (gnc:lookup-option options "Report Options" "View")) + ((full) gnc:budget-full-report-specs) + ((balancing) gnc:budget-balance-report-specs) + ((status) gnc:budget-status-report-specs) + (else (gnc:debug (list "Invalid view option" + (gnc:option-value + (gnc:lookup-option options "Report Options" "View")))))))) (list (html-start-document) "

This is a budget report. It is very preliminary, but you may find it useful. To actually change the budget, currently you have to edit budget-report.scm.

" (html-start-table) (html-table-row-manual - (map-in-order - (lambda (item) (html-cell-header item)) - report-headers)) - (map-in-order + ;;(map-in-order + (map + (lambda (spec) + (html-cell-header + (report-spec-get-header spec))) + report-specs)) + ;;(map-in-order + (map (lambda (line) - (html-table-row-manual - (map-in-order - (lambda (proc) - ((proc) line)) - report-procs))) + (budget-line-html line report-specs)) budget-list) (html-end-table) - (html-end-document)))))) + (html-end-document)))))) \ No newline at end of file diff --git a/src/scm/srfi/srfi-1.r5rs.scm b/src/scm/srfi/srfi-1.r5rs.scm index 914b282037..7fe29b2015 100644 --- a/src/scm/srfi/srfi-1.r5rs.scm +++ b/src/scm/srfi/srfi-1.r5rs.scm @@ -1019,7 +1019,7 @@ ;;; We extend MAP to handle arguments of unequal length. -(define map map-in-order) +;; (define map map-in-order) ;;; filter, remove, partition