mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
Merge branch 'maint'
This commit is contained in:
@@ -637,6 +637,7 @@ set(gnucash_DOCS
|
||||
ChangeLog.2016
|
||||
ChangeLog.2017
|
||||
ChangeLog.2018
|
||||
ChangeLog.2019
|
||||
DOCUMENTERS
|
||||
HACKING
|
||||
LICENSE
|
||||
@@ -791,7 +792,7 @@ add_subdirectory(cmake)
|
||||
|
||||
if (BUILDING_FROM_VCS)
|
||||
add_custom_target(ChangeLog ALL
|
||||
COMMAND ${GIT_EXECUTABLE} log --format=\"%ad %aN %n%n%x09* %s%d%n\" --date=short --since=2019-01-01 > ${CMAKE_BINARY_DIR}/ChangeLog
|
||||
COMMAND ${GIT_EXECUTABLE} log --format=\"%ad %aN %n%n%x09* %s%d%n\" --date=short --since=2020-01-01 > ${CMAKE_BINARY_DIR}/ChangeLog
|
||||
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||
)
|
||||
install(FILES ${CMAKE_BINARY_DIR}/ChangeLog DESTINATION ${CMAKE_INSTALL_DOCDIR})
|
||||
|
||||
5132
ChangeLog.2019
Normal file
5132
ChangeLog.2019
Normal file
File diff suppressed because it is too large
Load Diff
168
NEWS
168
NEWS
@@ -1,5 +1,173 @@
|
||||
Version history:
|
||||
------- -------
|
||||
3.9 - 29 March 2020
|
||||
The tenth release of the 3.x stable series.
|
||||
|
||||
Note for Online Banking users: When used with the latest releases of
|
||||
AQBanking and Gwenhywfar (provided in the MacOS and Microsoft Windows
|
||||
bundles) this release is fully stable for both FinTS and OFX Direct
|
||||
Connect.
|
||||
|
||||
|
||||
The following bugs have been fixed:
|
||||
Bug 685102 - Scheduled Transactions don't always respect weekends for
|
||||
first occurrence
|
||||
Bug 794916 - Fails to find environment file at startup when installation
|
||||
prefix is '/opt
|
||||
Bug 796579 - Cannot go forward with empty duplicates screen
|
||||
Bug 796911 - Minimum window width to large.
|
||||
To fix this the text labels used have been enabled to ellipsize
|
||||
at the end
|
||||
Bug 796984 - Import Bills & Invoices: date of line item is not validated;
|
||||
can lead to unexpected results
|
||||
Bug 796985 - Import Bills & Invoices: option 'open not yet posted docs in
|
||||
tab' does not open tab if invoice could not be posted
|
||||
Bug 796986 - Import Bills & Invoices: in case of invalid posting date
|
||||
in import file, invoice is posted with unexpected date
|
||||
Bug 796987 - Import Bills & Invoices: fixing import items only works
|
||||
in special case
|
||||
Bug 797022 - Import Bills & Invoices: expense/income account is not
|
||||
validated - leads to one-sided posting if account is invalid
|
||||
Bug 797023 - Import Bills & Invoices: no user confirmation requested
|
||||
for update of invoices, if new invoice is created first
|
||||
Bug 797024 - Import Bills & Invoices: import matches csv data rows with
|
||||
too few separators, messing up the import data
|
||||
Bug 797025 - Import Bills & Invoices: the type of the post to account
|
||||
is not validated - enabling A/P and A/R postings on regular
|
||||
accounts
|
||||
Bug 797042 - OK button in OFX importer doesn't work if nothing is
|
||||
imported.
|
||||
Bug 797133 - CSV Import of multicurrency transaction export in multiline
|
||||
form
|
||||
Bug 797139 - test-report-utilities failure after 10-march in travis
|
||||
Bug 797419 - equity-statement unrealized-gain calculator uses
|
||||
weighted-average
|
||||
Bug 797481 - crash on close of unsaved tabs by pressing [X]
|
||||
Bug 797522 - Focus after reconcile jumps to a different account
|
||||
Bug 797536 - cmake errors out because it cannot find GncPkgConfig
|
||||
(cmake 3.5.2)
|
||||
Bug 797540 - Mapping of aqbanking accounts to gnucash accounts doesn't
|
||||
work
|
||||
Bug 797546 - Autocomplete not updated when account names changed
|
||||
Bug 797548 - multicolumn income statement: some closing entries are not
|
||||
ignored when within reporting period
|
||||
Bug 797549 - Reconcile window shows S_tatement Date rather than
|
||||
Statement Date.
|
||||
Bug 797550 - Crash when changing register tab position
|
||||
Bug 797551 - Budget totals line missing in 3.8
|
||||
Reinstate Income/Expense/Transfer/Total, but rename to:
|
||||
* Inflow from Income
|
||||
* Outflow to Expense
|
||||
* Outflow to Asset/Equity/Liability
|
||||
* Remaining to Budget
|
||||
Bug 797566 - Crash on use of context menu in importer
|
||||
Bug 797569 - Swedish account templates not accessible
|
||||
Bug 797570 - Unable to import vendors.
|
||||
In the import of Customer/Vendor or Bill/Invoice, the
|
||||
dialog that lists rows that were not imported shows a
|
||||
scrollable view of only four rows.
|
||||
Bug 797572 - Customer Report (beta): "Period Totals" includes total debit
|
||||
and credits outside the current period
|
||||
Change to formal accounting convention. Can swap to informal
|
||||
headers if set by global preference.
|
||||
Bug 797573 - Incorrect value of securities in the Asset Chart
|
||||
Bug 797576 - xaccAccountOrder shouldn't sort account codes as base-36
|
||||
Bug 797583 - gnc:book-add-quotes crashes when there are no quotes
|
||||
Bug 797584 - New-owner - bill amount field links to wrong account
|
||||
Bug 797588 - Gnucash segfaults when using mysql backend with empty
|
||||
password
|
||||
Bug 797591 - multiperiod b/s and PnL reports: add style sheet 'easy'
|
||||
Bug 797609 - Backtraces for eguile report errors strips wrong part of
|
||||
stack
|
||||
Bug 797613 - Due Invoices Reminder shows Job Name instead of Company
|
||||
Name
|
||||
Bug 797624 - At some point Vietnam Dong seemed to drop xu (decimals)
|
||||
Bug 797631 - Superfluous account selection dialog on first online
|
||||
retrieval
|
||||
The online id, which is needed to find a GnuCash account
|
||||
for a transaction or the balance retrieved from an online
|
||||
account, is already assigned to each matched GnuCash
|
||||
account within the Online Banking Setup tool. The online
|
||||
id is removed from the GnuCash account if it is no longer
|
||||
matched with an AqBanking account.
|
||||
Bug 797636 - Incorrect Online account matches cannot be deleted
|
||||
A push button with text "Delete selected matches" is added
|
||||
to the "Match Online accounts with GnuCash accounts" page
|
||||
of the "Online Banking Setup" tool. Additionally, the
|
||||
underlying tree view is set to multiple selection mode
|
||||
from single selection mode. Pushing the button will remove
|
||||
the matched GnuCash account from all selected AqBanking
|
||||
(Online) accounts.
|
||||
Bug 797638 - SIGSEGV editing transaction after closing Find Accounts
|
||||
dialog.
|
||||
Bug 797640 - The Reconciliation Window starting balance calculator
|
||||
needs to ignore splits after statement date
|
||||
Bug 797648 - Cannot reconcile both splits of a transaction with 2 splits
|
||||
for bank account subaccounts if only 1 is cleared
|
||||
Force all splits in a transaction for the account being
|
||||
reconciled and its children to have the same
|
||||
reconciliation status.
|
||||
Bug 797656 - Immediate crash when retrieving quotes
|
||||
|
||||
Other repairs or enhancements not marked as bugs:
|
||||
[report-utilities] fix gnc:account-accumulate-at-dates sorting &
|
||||
operator
|
||||
This commit performs 2 important fixes:
|
||||
1. The account splitlist walking assumes that the split->date always
|
||||
increases. This is now enforced by sorting the splitlist, *only* if
|
||||
a custom split->date is offered. By default the splits are sorted by
|
||||
posted_date, and if a custom split->date is used, will be
|
||||
stable-sorted to ensure the algorithm works.
|
||||
2. The handling of splits *ON* date boundaries is fixed. Previously if
|
||||
a split->date was equal to a date boundary, it would be considered
|
||||
part of the "after" date section. It is more intuitive that a date
|
||||
boundary includes all splits on and before the date.
|
||||
When selecting a file for OFX import, restrict the files listed to .OFX
|
||||
(or .QFX)
|
||||
Fix crash when changing account-separator.
|
||||
Change the default focus to search entry for 'Find Account'
|
||||
Fix rounding precision when importing prices from CSV
|
||||
[trep-engine] subtotals when cells have monetary only
|
||||
Instead of accumulating subtotals from any non-#f value, ensure value
|
||||
is a gnc-monetary before accumulating subtotals. This paves the way
|
||||
to allow non-monetary in RHS custom-calculated-cells.
|
||||
Travis - don't try to copy the removed after-failure file to the test
|
||||
container
|
||||
Travis - use ctest built-in feature to verbosely log test failures
|
||||
Fix tokenize_string()to prevent empty strings as Bayes account-matching
|
||||
tokens and remove duplicated tokens.
|
||||
Fix calculation of Bayes account-matching token info to find exactly
|
||||
matching tokens only.
|
||||
Clear online banking KVP from accounts no longer associated with an online
|
||||
one
|
||||
Account template improvements for Swiss-German KMU and Germany SKR04.
|
||||
Appdata file allows packagers to include distribution release information.
|
||||
Ensure that new budgets are saved instead of saving only the state
|
||||
information.
|
||||
Update US Income Tax information for 2019.
|
||||
Correct double-counting of accounts in some cases in US Income Tax
|
||||
Report.
|
||||
Housekeeping - reduce the number of PACKAGE and VERSION related cmake
|
||||
variables
|
||||
Restrict gnucash.pot comment collection to ones beginning with
|
||||
"Translators". At the recommendation of the Translation Project
|
||||
coordinator.
|
||||
[html-table][API] html-table can have multirow-col-headers
|
||||
* NEW API: gnc:html-table-multirow-col-headers and
|
||||
gnc:html-table-set-multirow-col-headers! gnc:html-table col-headers
|
||||
have been augmented to support list of <th> rows.
|
||||
* BACKWARD COMPATIBILITY is offered. Old use of single-row headers API
|
||||
gnc:html-table-col-headers and gnc:html-table-set-col-headers! should
|
||||
be unchanged; will get/set a single row of <th> elements.
|
||||
* NEW functions gnc:html-table-multirow-col-headers and
|
||||
gnc:html-table-set-multirow-col-headers! will get/set an arbitrary
|
||||
number of rows of <th> elements.
|
||||
* using old API gnc:html-table-col-headers on a table, whose multiple
|
||||
row headers have been set, will lead to a warning and return the first
|
||||
row only.
|
||||
|
||||
Translations Updated: Croatian, German, Polish, Ukrainian.
|
||||
|
||||
3.8 - 29 December 2019
|
||||
The ninth release of the 3.x stable series.
|
||||
|
||||
|
||||
@@ -89,7 +89,7 @@ function(gnc_add_test _TARGET _SOURCE_FILES TEST_INCLUDE_VAR_NAME TEST_LIBS_VAR_
|
||||
)
|
||||
set_tests_properties(${_TARGET} PROPERTIES ENVIRONMENT "GNC_UNINSTALLED=YES;GNC_BUILDDIR=${CMAKE_BINARY_DIR};${ARGN}")
|
||||
else()
|
||||
add_test(NAME ${_TARGET} COMMAND ${_TARGET})
|
||||
add_test(NAME ${_TARGET} COMMAND ${_TARGET} CONFIGURATIONS Debug;Release)
|
||||
set_tests_properties(${_TARGET} PROPERTIES ENVIRONMENT "GNC_UNINSTALLED=YES;GNC_BUILDDIR=${CMAKE_BINARY_DIR}")
|
||||
endif()
|
||||
add_dependencies(check ${_TARGET})
|
||||
|
||||
@@ -77,8 +77,19 @@ gnc_find_account_dialog_window_destroy_cb (GtkWidget *object, gpointer user_data
|
||||
ENTER(" ");
|
||||
gnc_unregister_gui_component_by_data (DIALOG_FIND_ACCOUNT_CM_CLASS, facc_dialog);
|
||||
|
||||
if (facc_dialog->event_handler_id)
|
||||
{
|
||||
qof_event_unregister_handler (facc_dialog->event_handler_id);
|
||||
facc_dialog->event_handler_id = 0;
|
||||
}
|
||||
|
||||
if (facc_dialog->saved_filter_text)
|
||||
g_free (facc_dialog->saved_filter_text);
|
||||
|
||||
if (facc_dialog->window)
|
||||
{
|
||||
gnc_save_window_size (GNC_PREFS_GROUP,
|
||||
GTK_WINDOW(facc_dialog->window));
|
||||
gtk_widget_destroy (facc_dialog->window);
|
||||
facc_dialog->window = NULL;
|
||||
}
|
||||
@@ -463,17 +474,6 @@ close_handler (gpointer user_data)
|
||||
FindAccountDialog *facc_dialog = user_data;
|
||||
|
||||
ENTER(" ");
|
||||
|
||||
if (facc_dialog->event_handler_id)
|
||||
{
|
||||
qof_event_unregister_handler (facc_dialog->event_handler_id);
|
||||
facc_dialog->event_handler_id = 0;
|
||||
}
|
||||
|
||||
if (facc_dialog->saved_filter_text)
|
||||
g_free (facc_dialog->saved_filter_text);
|
||||
|
||||
gnc_save_window_size (GNC_PREFS_GROUP, GTK_WINDOW(facc_dialog->window));
|
||||
gtk_widget_destroy (GTK_WIDGET(facc_dialog->window));
|
||||
LEAVE(" ");
|
||||
}
|
||||
|
||||
@@ -501,25 +501,59 @@ gnc_reconcile_view_class_init (GNCReconcileViewClass *klass)
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
static gboolean
|
||||
gnc_reconcile_view_toggle_split (GNCReconcileView *view, Split *split)
|
||||
{
|
||||
Split *current;
|
||||
|
||||
g_return_val_if_fail (GNC_IS_RECONCILE_VIEW (view), FALSE);
|
||||
g_return_val_if_fail (view->reconciled != NULL, FALSE);
|
||||
|
||||
current = g_hash_table_lookup (view->reconciled, split);
|
||||
|
||||
if (current == NULL)
|
||||
{
|
||||
g_hash_table_insert (view->reconciled, split, split);
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_hash_table_remove (view->reconciled, split);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/** Insert or remove a split from the list of splits to be reconciled
|
||||
* (view->reconciled) so that all other splits in the same transaction
|
||||
* for the account being reconciled (including children), are the same
|
||||
* reconciliation state as the split that has been toggled.
|
||||
*
|
||||
* @param view The view to use.
|
||||
*
|
||||
* @param split The split to be inserted or removed
|
||||
*
|
||||
* @param reconcile TRUE=insert, FALSE=remove
|
||||
*/
|
||||
static void
|
||||
gnc_reconcile_view_rec_or_unrec_split (GNCReconcileView *view, Split *split, gboolean reconcile)
|
||||
{
|
||||
Split *current;
|
||||
|
||||
g_return_if_fail (GNC_IS_RECONCILE_VIEW (view));
|
||||
g_return_if_fail (view->reconciled != NULL);
|
||||
|
||||
current = g_hash_table_lookup (view->reconciled, split);
|
||||
|
||||
if (current == NULL)
|
||||
if (current == NULL && reconcile)
|
||||
g_hash_table_insert (view->reconciled, split, split);
|
||||
else
|
||||
if ((current != NULL) && (!reconcile))
|
||||
g_hash_table_remove (view->reconciled, split);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
gnc_reconcile_view_toggle_children (Account *account, GNCReconcileView *view, Split *split)
|
||||
gnc_reconcile_view_toggle_children (Account *account, GNCReconcileView *view, Split *split, gboolean reconcile)
|
||||
{
|
||||
GList *child_accounts, *node;
|
||||
Transaction *transaction;
|
||||
@@ -529,7 +563,8 @@ gnc_reconcile_view_toggle_children (Account *account, GNCReconcileView *view, Sp
|
||||
* in the same hierarchy as the account being reconciled (not necessarily
|
||||
* the account this split is from.)
|
||||
*
|
||||
* For each of these splits toggle them all to the same state.
|
||||
* For each of these splits set them to the same state as the split whose
|
||||
* checkbox was toggled.
|
||||
*/
|
||||
child_accounts = gnc_account_get_descendants (account);
|
||||
child_accounts = g_list_prepend (child_accounts, account);
|
||||
@@ -578,7 +613,8 @@ gnc_reconcile_view_toggle_children (Account *account, GNCReconcileView *view, Sp
|
||||
{
|
||||
gboolean toggled;
|
||||
gtk_tree_model_get (model, &iter, REC_RECN, &toggled, -1);
|
||||
gtk_list_store_set (GTK_LIST_STORE (model), &iter, REC_RECN, !toggled, -1);
|
||||
if (toggled != reconcile)
|
||||
gtk_list_store_set (GTK_LIST_STORE (model), &iter, REC_RECN, reconcile, -1);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -586,7 +622,7 @@ gnc_reconcile_view_toggle_children (Account *account, GNCReconcileView *view, Sp
|
||||
}
|
||||
|
||||
/* ...and toggle its reconciled state in the internal hash */
|
||||
gnc_reconcile_view_toggle_split (current_view, other_split);
|
||||
gnc_reconcile_view_rec_or_unrec_split (current_view, other_split, reconcile);
|
||||
}
|
||||
g_list_free (child_accounts);
|
||||
}
|
||||
@@ -596,15 +632,16 @@ static void
|
||||
gnc_reconcile_view_toggle (GNCReconcileView *view, Split *split)
|
||||
{
|
||||
gboolean include_children;
|
||||
gboolean is_reconciled;
|
||||
|
||||
g_return_if_fail (GNC_IS_RECONCILE_VIEW (view));
|
||||
g_return_if_fail (view->reconciled != NULL);
|
||||
|
||||
gnc_reconcile_view_toggle_split (view, split);
|
||||
is_reconciled = gnc_reconcile_view_toggle_split (view, split);
|
||||
|
||||
include_children = xaccAccountGetReconcileChildrenStatus (view->account);
|
||||
if (include_children)
|
||||
gnc_reconcile_view_toggle_children (view->account, view, split);
|
||||
gnc_reconcile_view_toggle_children (view->account, view, split, is_reconciled);
|
||||
|
||||
g_signal_emit (G_OBJECT (view),
|
||||
reconcile_view_signals[TOGGLE_RECONCILED], 0, split);
|
||||
|
||||
@@ -280,7 +280,8 @@ recnRecalculateBalance (RecnWindow *recnData)
|
||||
|
||||
/* update the starting balance */
|
||||
include_children = xaccAccountGetReconcileChildrenStatus(account);
|
||||
starting = gnc_ui_account_get_reconciled_balance(account, include_children);
|
||||
starting = gnc_ui_account_get_reconciled_balance_as_of_date
|
||||
(account, recnData->statement_date, include_children);
|
||||
print_info = gnc_account_print_info (account, TRUE);
|
||||
|
||||
/*
|
||||
|
||||
@@ -185,6 +185,8 @@
|
||||
<object class="GtkLabel" id="filter-label">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="margin_top">3</property>
|
||||
<property name="margin_bottom">3</property>
|
||||
<property name="label" translatable="yes">Case insensitive searching is available on 'Account Full Name'.</property>
|
||||
<property name="justify">center</property>
|
||||
</object>
|
||||
@@ -213,6 +215,9 @@
|
||||
<object class="GtkEntry" id="filter-text-entry">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="has_focus">True</property>
|
||||
<property name="can_default">True</property>
|
||||
<property name="has_default">True</property>
|
||||
<property name="invisible_char">●</property>
|
||||
<property name="primary_icon_activatable">False</property>
|
||||
<property name="secondary_icon_activatable">False</property>
|
||||
@@ -259,6 +264,8 @@
|
||||
<object class="GtkLabel" id="label8">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="margin_top">3</property>
|
||||
<property name="margin_bottom">3</property>
|
||||
<property name="label" translatable="yes">Select a row and then press 'jump to' to jump to account in the Account Tree,
|
||||
if account should not be shown, this will be temporarily overridden.</property>
|
||||
<property name="justify">center</property>
|
||||
|
||||
@@ -64,6 +64,7 @@
|
||||
#include "gnc-ui-util.h"
|
||||
#include "gnc-session.h"
|
||||
#include "import-account-matcher.h"
|
||||
#include "import-utilities.h"
|
||||
#ifndef AQBANKING6
|
||||
# include <aqbanking/dlg_setup.h>
|
||||
#endif
|
||||
@@ -89,6 +90,7 @@ gboolean aai_key_press_event_cb(GtkWidget *widget, GdkEventKey *event, gpointer
|
||||
|
||||
void aai_wizard_page_prepare (GtkAssistant *assistant, gpointer user_data);
|
||||
void aai_wizard_button_clicked_cb(GtkButton *button, gpointer user_data);
|
||||
void aai_match_delete_button_clicked_cb(GtkButton *button, gpointer user_data);
|
||||
|
||||
#ifdef AQBANKING6
|
||||
static guint aai_ab_account_hash(gconstpointer v);
|
||||
@@ -106,6 +108,8 @@ static gboolean find_gnc_acc_cb(gpointer key, gpointer value, gpointer user_data
|
||||
static gboolean clear_line_cb(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer user_data);
|
||||
static void account_list_clicked_cb (GtkTreeView *view, GtkTreePath *path,
|
||||
GtkTreeViewColumn *col, gpointer user_data);
|
||||
static void delete_account_match(ABInitialInfo *info, RevLookupData *data);
|
||||
static void delete_selected_match_cb(gpointer data, gpointer user_data);
|
||||
static void insert_acc_into_revhash_cb(gpointer ab_acc, gpointer gnc_acc, gpointer revhash);
|
||||
static void remove_acc_from_revhash_cb(gpointer ab_acc, gpointer gnc_acc, gpointer revhash);
|
||||
static void clear_kvp_acc_cb(gpointer key, gpointer value, gpointer user_data);
|
||||
@@ -305,6 +309,66 @@ aai_wizard_button_clicked_cb(GtkButton *button, gpointer user_data)
|
||||
LEAVE(" ");
|
||||
}
|
||||
|
||||
static void delete_account_match(ABInitialInfo *info, RevLookupData *data)
|
||||
{
|
||||
g_return_if_fail(info && info->gnc_hash &&
|
||||
info->account_view && data && data->ab_acc);
|
||||
|
||||
g_hash_table_remove(info->gnc_hash, data->ab_acc);
|
||||
gtk_tree_model_foreach(
|
||||
GTK_TREE_MODEL(info->account_store),
|
||||
(GtkTreeModelForeachFunc) clear_line_cb,
|
||||
data);
|
||||
}
|
||||
|
||||
static void
|
||||
delete_selected_match_cb(gpointer data, gpointer user_data)
|
||||
{
|
||||
GNC_AB_ACCOUNT_SPEC *ab_acc = NULL;
|
||||
GtkTreeIter iter;
|
||||
GtkTreeModel *model = NULL;
|
||||
RevLookupData revLookupData = {NULL, NULL};
|
||||
|
||||
GtkTreePath *path = (GtkTreePath *) data;
|
||||
ABInitialInfo *info = (ABInitialInfo *) user_data;
|
||||
g_return_if_fail(path && info && info->account_view);
|
||||
|
||||
model = gtk_tree_view_get_model(info->account_view);
|
||||
g_return_if_fail(model);
|
||||
|
||||
if (gtk_tree_model_get_iter(model, &iter, path))
|
||||
{
|
||||
gtk_tree_model_get(model, &iter, ACCOUNT_LIST_COL_AB_ACCT, &revLookupData.ab_acc, -1);
|
||||
if (revLookupData.ab_acc)
|
||||
delete_account_match(info, &revLookupData);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
aai_match_delete_button_clicked_cb(GtkButton *button, gpointer user_data)
|
||||
{
|
||||
GList *selected_matches = NULL;
|
||||
GtkTreeSelection *selection = NULL;
|
||||
ABInitialInfo *info = (ABInitialInfo *) user_data;
|
||||
|
||||
g_return_if_fail(info && info->api && info->account_view && info->gnc_hash);
|
||||
|
||||
PINFO("Selected account matches are deleted");
|
||||
|
||||
selection = gtk_tree_view_get_selection (info->account_view);
|
||||
if (selection)
|
||||
{
|
||||
selected_matches = gtk_tree_selection_get_selected_rows (selection, NULL);
|
||||
if (selected_matches)
|
||||
{
|
||||
g_list_foreach (selected_matches, delete_selected_match_cb, info);
|
||||
g_list_free_full (
|
||||
selected_matches,
|
||||
(GDestroyNotify) gtk_tree_path_free);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef AQBANKING6
|
||||
static guint
|
||||
aai_ab_account_hash (gconstpointer v)
|
||||
@@ -648,13 +712,7 @@ account_list_clicked_cb (GtkTreeView *view, GtkTreePath *path,
|
||||
g_hash_table_find(info->gnc_hash, (GHRFunc) find_gnc_acc_cb,
|
||||
&data);
|
||||
if (data.ab_acc)
|
||||
{
|
||||
g_hash_table_remove(info->gnc_hash, data.ab_acc);
|
||||
gtk_tree_model_foreach(
|
||||
GTK_TREE_MODEL(info->account_store),
|
||||
(GtkTreeModelForeachFunc) clear_line_cb,
|
||||
&data);
|
||||
}
|
||||
delete_account_match(info, &data);
|
||||
|
||||
/* Map ab_acc to gnc_acc */
|
||||
g_hash_table_insert(info->gnc_hash, ab_acc, gnc_acc);
|
||||
@@ -682,7 +740,8 @@ static void
|
||||
clear_kvp_acc_cb(gpointer gnc_acc, gpointer ab_acc, gpointer user_data)
|
||||
{
|
||||
g_return_if_fail(gnc_acc);
|
||||
/* Delete complete "hbci..." KVPs for GnuCash account */
|
||||
/* Delete "online-id" and complete "hbci..." KVPs for GnuCash account */
|
||||
gnc_account_delete_map_entry((Account *) gnc_acc, "online_id", NULL, NULL, FALSE);
|
||||
gnc_account_delete_map_entry((Account *) gnc_acc, "hbci", NULL, NULL, FALSE);
|
||||
}
|
||||
|
||||
@@ -694,6 +753,10 @@ save_kvp_acc_cb(gpointer key, gpointer value, gpointer user_data)
|
||||
guint32 ab_account_uid;
|
||||
const gchar *ab_accountid, *gnc_accountid;
|
||||
const gchar *ab_bankcode, *gnc_bankcode;
|
||||
#ifdef AQBANKING6
|
||||
gchar *ab_online_id;
|
||||
const gchar *gnc_online_id;
|
||||
#endif
|
||||
|
||||
g_return_if_fail(ab_acc && gnc_acc);
|
||||
|
||||
@@ -726,6 +789,14 @@ save_kvp_acc_cb(gpointer key, gpointer value, gpointer user_data)
|
||||
&& (!gnc_bankcode
|
||||
|| (strcmp(gnc_bankcode, ab_bankcode) != 0)))
|
||||
gnc_ab_set_account_bankcode(gnc_acc, ab_bankcode);
|
||||
|
||||
#ifdef AQBANKING6
|
||||
ab_online_id = gnc_ab_create_online_id(ab_bankcode, ab_accountid);
|
||||
gnc_online_id = gnc_import_get_acc_online_id(gnc_acc);
|
||||
if (ab_online_id && (!gnc_online_id || (strcmp(ab_online_id, gnc_online_id) != 0)))
|
||||
gnc_import_set_acc_online_id(gnc_acc, ab_online_id);
|
||||
g_free(ab_online_id);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -800,7 +871,7 @@ gnc_ab_initial_assistant_new(void)
|
||||
gtk_tree_view_append_column(info->account_view, column);
|
||||
|
||||
selection = gtk_tree_view_get_selection(info->account_view);
|
||||
gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
|
||||
gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE);
|
||||
|
||||
gnc_restore_window_size (GNC_PREFS_GROUP,
|
||||
GTK_WINDOW(info->window), gnc_ui_get_main_window(NULL));
|
||||
|
||||
@@ -125,6 +125,19 @@ Click on "Next" to proceed or "Cancel" to Abort Import.</property>
|
||||
<property name="border_width">12</property>
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">12</property>
|
||||
<child>
|
||||
<object class="GtkLabel" id="account_label">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes">Double Click on the line of an Online Banking account name if you want to match it to a GnuCash account or select incorrect matches and click "Delete selected matches". Click "Next" when all desired accounts are matching.</property>
|
||||
<property name="wrap">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkScrolledWindow" id="account_scrolledwindow">
|
||||
<property name="visible">True</property>
|
||||
@@ -143,20 +156,34 @@ Click on "Next" to proceed or "Cancel" to Abort Import.</property>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel" id="account_label">
|
||||
<object class="GtkBox" id="button_box">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes">Double Click on the line of an Online Banking account name if you want to match it to a GnuCash account. Click "Next" when all desired accounts are matching.</property>
|
||||
<property name="wrap">True</property>
|
||||
<child>
|
||||
<object class="GtkButton" id="ab_match_delete_button">
|
||||
<property name="label" translatable="yes">_Delete selected matches</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="halign">start</property>
|
||||
<property name="use_underline">True</property>
|
||||
<signal name="clicked" handler="aai_match_delete_button_clicked_cb" swapped="no"/>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
|
||||
@@ -63,7 +63,6 @@ G_GNUC_UNUSED static QofLogModule log_module = G_LOG_DOMAIN;
|
||||
static AB_BANKING *gnc_AB_BANKING = NULL;
|
||||
static gint gnc_AB_BANKING_refcount = 0;
|
||||
|
||||
static gchar* create_online_id(const gchar *bankcode, const gchar *accountnumber);
|
||||
static gpointer join_ab_strings_cb(const gchar *str, gpointer user_data);
|
||||
static Account *gnc_ab_accinfo_to_gnc_acc(GtkWidget *parent,
|
||||
AB_IMEXPORTER_ACCOUNTINFO *account_info);
|
||||
@@ -318,8 +317,8 @@ gnc_AB_VALUE_to_readable_string(const AB_VALUE *value)
|
||||
}
|
||||
|
||||
|
||||
static gchar*
|
||||
create_online_id(const gchar *bankcode, const gchar *accountnumber)
|
||||
gchar*
|
||||
gnc_ab_create_online_id(const gchar *bankcode, const gchar *accountnumber)
|
||||
{
|
||||
gchar *online_id;
|
||||
|
||||
@@ -669,7 +668,7 @@ gnc_ab_accinfo_to_gnc_acc(GtkWidget *parent, AB_IMEXPORTER_ACCOUNTINFO *acc_info
|
||||
|
||||
bankcode = AB_ImExporterAccountInfo_GetBankCode(acc_info);
|
||||
accountnumber = AB_ImExporterAccountInfo_GetAccountNumber(acc_info);
|
||||
online_id = create_online_id(bankcode, accountnumber);
|
||||
online_id = gnc_ab_create_online_id(bankcode, accountnumber);
|
||||
gnc_acc = gnc_import_select_account(
|
||||
parent, online_id, 1, AB_ImExporterAccountInfo_GetAccountName(acc_info),
|
||||
NULL, ACCT_TYPE_NONE, NULL, NULL);
|
||||
@@ -708,7 +707,7 @@ gnc_ab_txn_to_gnc_acc(GtkWidget *parent, const AB_TRANSACTION *transaction)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
online_id = create_online_id(bankcode, accountnumber);
|
||||
online_id = gnc_ab_create_online_id(bankcode, accountnumber);
|
||||
gnc_acc = gnc_import_select_account(
|
||||
parent, online_id, 1, AB_Transaction_GetLocalName(transaction),
|
||||
NULL, ACCT_TYPE_NONE, NULL, NULL);
|
||||
@@ -940,7 +939,7 @@ txn_accountinfo_cb(AB_IMEXPORTER_ACCOUNTINFO *element, gpointer user_data)
|
||||
if (!data->generic_importer)
|
||||
{
|
||||
data->generic_importer = gnc_gen_trans_list_new(data->parent, NULL,
|
||||
TRUE, 14);
|
||||
TRUE, 14, TRUE);
|
||||
if (data->execute_txns)
|
||||
{
|
||||
gnc_gen_trans_list_add_tp_cb(data->generic_importer,
|
||||
|
||||
@@ -276,6 +276,17 @@ gboolean gnc_ab_ieci_run_matcher(GncABImExContextImport *ieci);
|
||||
*/
|
||||
GWEN_DB_NODE *gnc_ab_get_permanent_certs(void);
|
||||
|
||||
/**
|
||||
* Creates an online ID from bank code and account number.
|
||||
*
|
||||
* The returned string must be g_free'd by the caller.
|
||||
*
|
||||
* @param bankcode Bank code
|
||||
* @param accountnumber Account number
|
||||
* @return an online ID
|
||||
*/
|
||||
gchar* gnc_ab_create_online_id(const gchar *bankcode, const gchar *accountnumber);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
/** @} */
|
||||
|
||||
@@ -888,7 +888,7 @@ hide_progress(GncGWENGui *gui, Progress *progress)
|
||||
/* Last other progress to be hidden */
|
||||
gtk_grid_remove_row (GTK_GRID(gui->entries_grid),
|
||||
OTHER_ENTRIES_ROW_OFFSET);
|
||||
gtk_widget_destroy(box);
|
||||
/* Box destroyed, Null the reference. */
|
||||
gui->other_entries_box = NULL;
|
||||
}
|
||||
g_list_free(entries);
|
||||
|
||||
@@ -7,8 +7,8 @@ set(test_aqb_INCLUDE_DIRS
|
||||
${CMAKE_SOURCE_DIR}/gnucash/import-export
|
||||
${CMAKE_SOURCE_DIR}/gnucash/gnome
|
||||
${CMAKE_SOURCE_DIR}/gnucash/register/ledger-core
|
||||
${CMAKE_SOURCE_DIR}/gnucash/register/regiser-gnome
|
||||
${CMAKE_SOURCE_DIR}/gnucash/register/regitser-core
|
||||
${CMAKE_SOURCE_DIR}/gnucash/register/register-gnome
|
||||
${CMAKE_SOURCE_DIR}/gnucash/register/register-core
|
||||
${CMAKE_SOURCE_DIR}/gnucash/gnome-utils
|
||||
${CMAKE_SOURCE_DIR}/libgnucash/app-utils
|
||||
${CMAKE_SOURCE_DIR}/libgnucash/engine
|
||||
|
||||
@@ -332,7 +332,9 @@ Result GncImportPrice::create_price (QofBook* book, GNCPriceDB *pdb, bool over)
|
||||
gnc_price_set_commodity (price, *m_from_commodity);
|
||||
gnc_price_set_currency (price, *m_to_currency);
|
||||
|
||||
auto amount_conv = amount.convert<RoundType::half_up>(CURRENCY_DENOM);
|
||||
int scu = gnc_commodity_get_fraction (*m_to_currency);
|
||||
auto amount_conv = amount.convert<RoundType::half_up>(scu * COMMODITY_DENOM_MULT);
|
||||
|
||||
gnc_price_set_value (price, static_cast<gnc_numeric>(amount_conv));
|
||||
|
||||
gnc_price_set_time64 (price, date);
|
||||
|
||||
@@ -35,6 +35,7 @@ extern "C" {
|
||||
#include "Account.h"
|
||||
#include "Transaction.h"
|
||||
#include "gnc-pricedb.h"
|
||||
#include <gnc-exp-parser.h>
|
||||
|
||||
}
|
||||
|
||||
@@ -193,6 +194,32 @@ gnc_commodity* parse_commodity (const std::string& comm_str)
|
||||
return comm;
|
||||
}
|
||||
|
||||
|
||||
static GncNumeric parse_price (const std::string &str)
|
||||
{
|
||||
/* An empty field is treated as zero */
|
||||
if (str.empty())
|
||||
return GncNumeric{};
|
||||
|
||||
/* Strings otherwise containing not digits will be considered invalid */
|
||||
if(!boost::regex_search(str, boost::regex("[0-9]")))
|
||||
throw std::invalid_argument (_("Value doesn't appear to contain a valid number."));
|
||||
|
||||
auto expr = boost::make_u32regex("[[:Sc:]]");
|
||||
std::string str_no_symbols = boost::u32regex_replace(str, expr, "");
|
||||
|
||||
/* Convert based on user chosen currency format */
|
||||
gnc_numeric val = gnc_numeric_zero();
|
||||
char *endptr;
|
||||
|
||||
auto success = gnc_exp_parser_parse (str.c_str(), &val, &endptr);
|
||||
gnc_exp_parser_shutdown();
|
||||
if (!success)
|
||||
throw std::invalid_argument (_("Price can't be parsed into a number."));
|
||||
|
||||
return GncNumeric(val);
|
||||
}
|
||||
|
||||
void GncPreTrans::set (GncTransPropType prop_type, const std::string& value)
|
||||
{
|
||||
try
|
||||
@@ -437,7 +464,7 @@ void GncPreSplit::set (GncTransPropType prop_type, const std::string& value)
|
||||
|
||||
case GncTransPropType::PRICE:
|
||||
m_price = boost::none;
|
||||
m_price = parse_amount (value, m_currency_format); // Will throw if parsing fails
|
||||
m_price = parse_price (value); // Will throw if parsing fails
|
||||
break;
|
||||
|
||||
case GncTransPropType::REC_STATE:
|
||||
|
||||
@@ -4,7 +4,6 @@ set(CSV_IMP_TEST_INCLUDE_DIRS
|
||||
${CMAKE_SOURCE_DIR}/common
|
||||
${CMAKE_SOURCE_DIR}/libgnucash/engine
|
||||
${CMAKE_SOURCE_DIR}/common/test-core
|
||||
${CMAKE_SOURCE_DIR}/lib
|
||||
${GLIB2_INCLUDE_DIRS}
|
||||
)
|
||||
set(CSV_IMP_TEST_LIBS gncmod-csv-import gnc-engine test-core)
|
||||
|
||||
@@ -50,6 +50,23 @@ static QofLogModule log_module = GNC_MOD_IMPORT;
|
||||
|
||||
#define GNC_PREFS_GROUP "dialogs.import.generic.account-picker"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
Account* partial_match;
|
||||
int count;
|
||||
const char* online_id;
|
||||
} AccountOnlineMatch;
|
||||
|
||||
static Account*
|
||||
partial_match_if_valid (AccountOnlineMatch *match)
|
||||
{
|
||||
if (match->partial_match && match->count == 1)
|
||||
return match->partial_match;
|
||||
else
|
||||
PERR("Online ID %s partially matches %d accounts and fully matches none",
|
||||
match->online_id, match->count);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*-******************************************************************\
|
||||
* Functions needed by gnc_import_select_account
|
||||
@@ -81,20 +98,66 @@ static AccountPickerDialog* gnc_import_new_account_picker(void)
|
||||
*
|
||||
* test for match of account online_ids.
|
||||
**************************************************/
|
||||
static gpointer test_acct_online_id_match(Account *acct, gpointer param_online_id)
|
||||
static gpointer test_acct_online_id_match(Account *acct, gpointer data)
|
||||
{
|
||||
const gchar * current_online_id = gnc_import_get_acc_online_id(acct);
|
||||
if ( (current_online_id != NULL
|
||||
&& param_online_id != NULL )
|
||||
&& strncmp( current_online_id, param_online_id,
|
||||
strlen( current_online_id ) ) == 0 )
|
||||
{
|
||||
return (gpointer *) acct;
|
||||
}
|
||||
else
|
||||
{
|
||||
AccountOnlineMatch *match = (AccountOnlineMatch*)data;
|
||||
const char *acct_online_id = gnc_import_get_acc_online_id(acct);
|
||||
int acct_len, match_len;
|
||||
|
||||
if (acct_online_id == NULL || match->online_id == NULL)
|
||||
return NULL;
|
||||
|
||||
acct_len = strlen(acct_online_id);
|
||||
match_len = strlen(match->online_id);
|
||||
|
||||
if (acct_online_id[acct_len - 1] == ' ')
|
||||
--acct_len;
|
||||
if (match->online_id[match_len - 1] == ' ')
|
||||
--match_len;
|
||||
|
||||
if (strncmp (acct_online_id, match->online_id, acct_len) == 0)
|
||||
{
|
||||
if (strncmp(acct_online_id, match->online_id, match_len) == 0)
|
||||
return (gpointer *) acct;
|
||||
if (match->partial_match == NULL)
|
||||
{
|
||||
match->partial_match = acct;
|
||||
++match->count;
|
||||
}
|
||||
else
|
||||
{
|
||||
const char *partial_online_id =
|
||||
gnc_import_get_acc_online_id(match->partial_match);
|
||||
int partial_len = strlen(partial_online_id);
|
||||
if (partial_online_id[partial_len - 1] == ' ')
|
||||
--partial_len;
|
||||
/* Both partial_online_id and acct_online_id are substrings of
|
||||
* match->online_id, but whichever is longer is the better match.
|
||||
* Reset match->count to 1 just in case there was ambiguity on the
|
||||
* shorter partial match.
|
||||
*/
|
||||
if (partial_len < acct_len)
|
||||
{
|
||||
match->partial_match = acct;
|
||||
match->count = 1;
|
||||
}
|
||||
/* If they're the same size then there are two accounts with the
|
||||
* same online id and we don't know which one to select. Increment
|
||||
* match->count to dissuade gnc_import_find_account from using
|
||||
* match->online_id and log an error.
|
||||
*/
|
||||
else if (partial_len == acct_len)
|
||||
{
|
||||
++match->count;
|
||||
PERR("Accounts %s and %s have the same online-id %s",
|
||||
gnc_account_get_full_name(match->partial_match),
|
||||
gnc_account_get_full_name(acct),
|
||||
partial_online_id);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -309,39 +372,14 @@ Account * gnc_import_select_account(GtkWidget *parent,
|
||||
/*DEBUG("Looking for account with online_id: \"%s\"", account_online_id_value);*/
|
||||
if (account_online_id_value != NULL)
|
||||
{
|
||||
AccountOnlineMatch match = {NULL, 0, account_online_id_value};
|
||||
retval =
|
||||
gnc_account_foreach_descendant_until(gnc_get_current_root_account (),
|
||||
test_acct_online_id_match,
|
||||
/* This argument will only be used as a "const char*" */
|
||||
(void*)account_online_id_value);
|
||||
|
||||
/* BEGIN: try again without extra space at the end */
|
||||
/*
|
||||
* libofx, used for file import, generates online_id as
|
||||
* ACCTID + space + ACCTKEY which differs from the online_id
|
||||
* generated by aqbanking for online ofx transfer as ACCTID.
|
||||
*
|
||||
* If a gnucash account has been associated with an online_id
|
||||
* via aqbanking data, it is not possible to construct an OFX
|
||||
* file for gnucash import that matches the same online_id
|
||||
* because even with no ACCTKEY in the file, there will be a
|
||||
* trailing space.
|
||||
*
|
||||
* This is a hack to overcome that problem.
|
||||
*/
|
||||
if ((retval == NULL) && g_str_has_suffix(account_online_id_value, " "))
|
||||
{
|
||||
gchar *trimmed = g_strndup(account_online_id_value, strlen(account_online_id_value) - 1);
|
||||
if (trimmed)
|
||||
{
|
||||
retval = gnc_account_foreach_descendant_until(
|
||||
gnc_get_current_root_account (),
|
||||
test_acct_online_id_match,
|
||||
(void *)trimmed);
|
||||
}
|
||||
g_free(trimmed);
|
||||
}
|
||||
/* END: try again without extra space at the end */
|
||||
test_acct_online_id_match,
|
||||
(void*)&match);
|
||||
if (!retval && match.count == 1 &&
|
||||
new_account_default_type == ACCT_TYPE_NONE)
|
||||
retval = match.partial_match;
|
||||
}
|
||||
if (retval == NULL && auto_create != 0)
|
||||
{
|
||||
|
||||
@@ -180,6 +180,21 @@ void gnc_gen_trans_list_delete (GNCImportMainMatcher *info)
|
||||
g_free (info);
|
||||
}
|
||||
|
||||
gboolean gnc_gen_trans_list_empty(GNCImportMainMatcher *info)
|
||||
{
|
||||
GtkTreeModel *model;
|
||||
GtkTreeIter iter;
|
||||
GNCImportTransInfo *trans_info;
|
||||
g_assert (info);
|
||||
model = gtk_tree_view_get_model (info->view);
|
||||
return !gtk_tree_model_get_iter_first (model, &iter);
|
||||
}
|
||||
|
||||
void gnc_gen_trans_list_show_all(GNCImportMainMatcher *info)
|
||||
{
|
||||
gtk_widget_show_all (GTK_WIDGET (info->main_widget));
|
||||
}
|
||||
|
||||
void
|
||||
on_matcher_ok_clicked (GtkButton *button, GNCImportMainMatcher *info)
|
||||
{
|
||||
@@ -193,7 +208,11 @@ on_matcher_ok_clicked (GtkButton *button, GNCImportMainMatcher *info)
|
||||
|
||||
model = gtk_tree_view_get_model (info->view);
|
||||
if (!gtk_tree_model_get_iter_first (model, &iter))
|
||||
{
|
||||
// No transaction, we can just close the dialog.
|
||||
gnc_gen_trans_list_delete (info);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Don't run any queries and/or split sorts while processing the matcher
|
||||
results. */
|
||||
@@ -922,7 +941,8 @@ show_matched_info_toggled_cb (GtkToggleButton *togglebutton,
|
||||
GNCImportMainMatcher *gnc_gen_trans_list_new (GtkWidget *parent,
|
||||
const gchar* heading,
|
||||
gboolean all_from_same_account,
|
||||
gint match_date_hardlimit)
|
||||
gint match_date_hardlimit,
|
||||
gboolean show_all)
|
||||
{
|
||||
GNCImportMainMatcher *info;
|
||||
GtkBuilder *builder;
|
||||
@@ -980,7 +1000,8 @@ GNCImportMainMatcher *gnc_gen_trans_list_new (GtkWidget *parent,
|
||||
gtk_label_set_text (GTK_LABEL (heading_label), heading);
|
||||
|
||||
gnc_restore_window_size (GNC_PREFS_GROUP, GTK_WINDOW(info->main_widget), GTK_WINDOW (parent));
|
||||
gtk_widget_show_all (GTK_WIDGET (info->main_widget));
|
||||
if(show_all)
|
||||
gtk_widget_show_all (GTK_WIDGET (info->main_widget));
|
||||
|
||||
info->transaction_processed_cb = NULL;
|
||||
|
||||
|
||||
@@ -62,12 +62,15 @@ typedef void (*GNCTransactionProcessedCB) (GNCImportTransInfo *trans_info,
|
||||
* with paper checks (e.g. OFX, QIF), values like 42 (days) seem more
|
||||
* appropriate.
|
||||
*
|
||||
@param show_all if true, all widgets are shown
|
||||
*
|
||||
* @return A pointer to the GNCImportMainMatcher which has been setup.
|
||||
*/
|
||||
GNCImportMainMatcher *gnc_gen_trans_list_new (GtkWidget *parent,
|
||||
const gchar* heading,
|
||||
gboolean all_from_same_account,
|
||||
gint match_date_hardlimit);
|
||||
gint match_date_hardlimit,
|
||||
gboolean show_all);
|
||||
|
||||
|
||||
|
||||
@@ -170,13 +173,28 @@ void gnc_gen_trans_list_add_trans_with_ref_id(GNCImportMainMatcher *gui, Transac
|
||||
/** Run this dialog and return only after the user pressed Ok, Cancel,
|
||||
or closed the window. This means that all actual importing will
|
||||
have been finished upon returning.
|
||||
*/
|
||||
* @param info A pointer to a the GNCImportMainMatcher structure.
|
||||
* @return The boolean return value of the dialog run.
|
||||
*/
|
||||
gboolean gnc_gen_trans_list_run (GNCImportMainMatcher *info);
|
||||
|
||||
|
||||
/** Returns the widget of this dialog.
|
||||
* @param info A pointer to a the GNCImportMainMatcher structure.
|
||||
* @return A GtkWidget pointer to the dialog's widget.
|
||||
*/
|
||||
GtkWidget *gnc_gen_trans_list_widget (GNCImportMainMatcher *info);
|
||||
|
||||
/** Checks whether there are no transactions to match.
|
||||
* @param info A pointer to a the GNCImportMainMatcher structure.
|
||||
* @return A boolean indicating whether the transaction list is empty.
|
||||
*/
|
||||
gboolean gnc_gen_trans_list_empty(GNCImportMainMatcher *info);
|
||||
|
||||
/** Shows widgets.
|
||||
* @param info A pointer to a the GNCImportMainMatcher structure.
|
||||
*/
|
||||
void gnc_gen_trans_list_show_all(GNCImportMainMatcher *info);
|
||||
|
||||
#endif
|
||||
/**@}*/
|
||||
|
||||
@@ -66,6 +66,7 @@ static QofLogModule log_module = GNC_MOD_IMPORT;
|
||||
GNCImportMainMatcher *gnc_ofx_importer_gui = NULL;
|
||||
static gboolean auto_create_commodity = FALSE;
|
||||
static Account *ofx_parent_account = NULL;
|
||||
static gint num_trans_processed = 0;
|
||||
|
||||
GList *ofx_created_commodites = NULL;
|
||||
|
||||
@@ -889,7 +890,7 @@ int ofx_proc_transaction_cb(struct OfxTransactionData data, void *user_data)
|
||||
xaccTransDestroy(transaction);
|
||||
xaccTransCommitEdit(transaction);
|
||||
}
|
||||
|
||||
num_trans_processed += 1;
|
||||
return 0;
|
||||
}//end ofx_proc_transaction()
|
||||
|
||||
@@ -1031,6 +1032,8 @@ void gnc_file_ofx_import (GtkWindow *parent)
|
||||
char *selected_filename;
|
||||
char *default_dir;
|
||||
LibofxContextPtr libofx_context = libofx_get_new_context();
|
||||
GList *filters = NULL;
|
||||
GtkFileFilter* filter = gtk_file_filter_new ();
|
||||
|
||||
ofx_PARSER_msg = false;
|
||||
ofx_DEBUG_msg = false;
|
||||
@@ -1042,9 +1045,13 @@ void gnc_file_ofx_import (GtkWindow *parent)
|
||||
DEBUG("gnc_file_ofx_import(): Begin...\n");
|
||||
|
||||
default_dir = gnc_get_default_directory(GNC_PREFS_GROUP);
|
||||
gtk_file_filter_set_name (filter, "ofx/qfx files (*.ofx,*.qfx)");
|
||||
gtk_file_filter_add_pattern (filter, "*.[oqOQ][fF][xX]");
|
||||
filters = g_list_prepend( filters, filter );
|
||||
|
||||
selected_filename = gnc_file_dialog(parent,
|
||||
_("Select an OFX/QFX file to process"),
|
||||
NULL,
|
||||
filters,
|
||||
default_dir,
|
||||
GNC_FILE_DIALOG_IMPORT);
|
||||
g_free(default_dir);
|
||||
@@ -1064,7 +1071,7 @@ void gnc_file_ofx_import (GtkWindow *parent)
|
||||
DEBUG("Filename found: %s", selected_filename);
|
||||
|
||||
/* Create the Generic transaction importer GUI. */
|
||||
gnc_ofx_importer_gui = gnc_gen_trans_list_new (GTK_WIDGET(parent), NULL, FALSE, 42);
|
||||
gnc_ofx_importer_gui = gnc_gen_trans_list_new (GTK_WIDGET(parent), NULL, FALSE, 42, FALSE);
|
||||
|
||||
/* Look up the needed preferences */
|
||||
auto_create_commodity =
|
||||
@@ -1085,8 +1092,21 @@ void gnc_file_ofx_import (GtkWindow *parent)
|
||||
#endif
|
||||
|
||||
DEBUG("Opening selected file");
|
||||
num_trans_processed = 0;
|
||||
libofx_proc_file(libofx_context, selected_filename, AUTODETECT);
|
||||
// Now would be a good time to see whether the view has anything in it!
|
||||
if(gnc_gen_trans_list_empty(gnc_ofx_importer_gui))
|
||||
{
|
||||
gnc_gen_trans_list_delete (gnc_ofx_importer_gui);
|
||||
if(num_trans_processed)
|
||||
gnc_info_dialog(parent,_("OFX file imported, %d transactions processed, no transactions to match"),num_trans_processed);
|
||||
}
|
||||
else
|
||||
{
|
||||
gnc_gen_trans_list_show_all(gnc_ofx_importer_gui);
|
||||
}
|
||||
g_free(selected_filename);
|
||||
|
||||
}
|
||||
|
||||
if (ofx_created_commodites)
|
||||
|
||||
@@ -22,5 +22,22 @@ gnc_add_test(test-link-generic-import test-link.c
|
||||
gnc_add_test(test-import-pending-matches test-import-pending-matches.cpp
|
||||
GENERIC_IMPORT_TEST_INCLUDE_DIRS GENERIC_IMPORT_TEST_LIBS
|
||||
)
|
||||
|
||||
set(IMPORT_ACCOUNT_MATCHER_TEST_INCLUDE_DIRS
|
||||
${CMAKE_BINARY_DIR}/common # for config.h
|
||||
${CMAKE_SOURCE_DIR}/gnucash/import-export
|
||||
${CMAKE_SOURCE_DIR}/libgnucash/engine
|
||||
${CMAKE_SOURCE_DIR}/libgnucash/app-utils
|
||||
${CMAKE_SOURCE_DIR}/gnucash/gnome-utils
|
||||
${GLIB2_INCLUDE_DIRS}
|
||||
${GTK3_INCLUDE_DIRS}
|
||||
${GTEST_INCLUDE_DIR}
|
||||
)
|
||||
|
||||
set(IMPORT_ACCOUNT_MATCHER_TEST_LIBS gncmod-generic-import gnc-engine test-core gtest)
|
||||
gnc_add_test(test-import-account-matcher gtest-import-account-matcher.cpp
|
||||
IMPORT_ACCOUNT_MATCHER_TEST_INCLUDE_DIRS IMPORT_ACCOUNT_MATCHER_TEST_LIBS)
|
||||
|
||||
set_dist_list(test_generic_import_DIST CMakeLists.txt
|
||||
test-link.c test-import-parse.c test-import-pending-matches.cpp)
|
||||
test-link.c test-import-parse.c test-import-pending-matches.cpp
|
||||
gtest-import-account-matcher.cpp)
|
||||
|
||||
172
gnucash/import-export/test/gtest-import-account-matcher.cpp
Normal file
172
gnucash/import-export/test/gtest-import-account-matcher.cpp
Normal file
@@ -0,0 +1,172 @@
|
||||
/********************************************************************
|
||||
* gtest-import-account-matcher.cpp -- *
|
||||
* unit tests import-account-matcher. *
|
||||
* Copyright (C) 2020 John Ralls <jralls@ceridwen.us> *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or *
|
||||
* modify it under the terms of the GNU General Public License as *
|
||||
* published by the Free Software Foundation; either version 2 of *
|
||||
* the License, or (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License*
|
||||
* along with this program; if not, contact: *
|
||||
* *
|
||||
* Free Software Foundation Voice: +1-617-542-5942 *
|
||||
* 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
|
||||
* Boston, MA 02110-1301, USA gnu@gnu.org *
|
||||
* *
|
||||
*******************************************************************/
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
extern "C"
|
||||
{
|
||||
#include <config.h>
|
||||
#include <import-account-matcher.h>
|
||||
#include <gnc-session.h>
|
||||
#include <qofbook.h>
|
||||
#include <Account.h>
|
||||
#include <gtk/gtk.h>
|
||||
}
|
||||
#include <vector>
|
||||
|
||||
using AccountV = std::vector<const Account*>;
|
||||
using AccountTypeV = std::vector<GNCAccountType>;
|
||||
using AccountPair = std::pair<AccountV&,
|
||||
const AccountTypeV&>;
|
||||
|
||||
class ImportMatcherTest : public ::testing::Test
|
||||
{
|
||||
protected:
|
||||
ImportMatcherTest() :
|
||||
m_book{gnc_get_current_book()}, m_root{gnc_account_create_root(m_book)}
|
||||
{
|
||||
auto create_account = [this](Account* parent, GNCAccountType type,
|
||||
const char* name,
|
||||
const char* online)->Account* {
|
||||
auto account = xaccMallocAccount(this->m_book);
|
||||
xaccAccountBeginEdit(account);
|
||||
xaccAccountSetType(account, type);
|
||||
xaccAccountSetName(account, name);
|
||||
xaccAccountBeginEdit(parent);
|
||||
gnc_account_append_child(parent, account);
|
||||
if (online)
|
||||
qof_instance_set(QOF_INSTANCE(account), "online-id", online, NULL);
|
||||
xaccAccountCommitEdit(parent);
|
||||
xaccAccountCommitEdit(account);
|
||||
return account;
|
||||
};
|
||||
auto assets = create_account(m_root, ACCT_TYPE_ASSET,
|
||||
"Assets", nullptr);
|
||||
auto liabilities = create_account(m_root, ACCT_TYPE_LIABILITY,
|
||||
"Liabilities", nullptr);
|
||||
auto expenses = create_account(m_root, ACCT_TYPE_EXPENSE,
|
||||
"Expenses", nullptr);
|
||||
create_account(assets, ACCT_TYPE_BANK, "Bank", "Bank");
|
||||
auto broker = create_account(assets, ACCT_TYPE_ASSET,
|
||||
"Broker", "Broker");
|
||||
auto stocks = create_account(broker, ACCT_TYPE_STOCK,
|
||||
"Stocks", "BrokerStocks");
|
||||
create_account(stocks, ACCT_TYPE_STOCK, "AAPL", "BrokerStocksAAPL");
|
||||
create_account(stocks, ACCT_TYPE_STOCK, "MSFT", "BrokerStocksMSFT ");
|
||||
create_account(stocks, ACCT_TYPE_STOCK, "HPE", "BrokerStocksHPE");
|
||||
create_account(broker, ACCT_TYPE_BANK, "Cash Management",
|
||||
"BrokerCash Management");
|
||||
create_account(expenses, ACCT_TYPE_EXPENSE, "Food", nullptr);
|
||||
create_account(expenses, ACCT_TYPE_EXPENSE, "Gas", nullptr);
|
||||
create_account(expenses, ACCT_TYPE_EXPENSE, "Rent", nullptr);
|
||||
}
|
||||
~ImportMatcherTest()
|
||||
{
|
||||
xaccAccountBeginEdit(m_root);
|
||||
xaccAccountDestroy(m_root); //It does the commit
|
||||
gnc_clear_current_session();
|
||||
}
|
||||
|
||||
QofBook* m_book;
|
||||
Account* m_root;
|
||||
};
|
||||
|
||||
TEST_F(ImportMatcherTest, test_simple_match)
|
||||
{
|
||||
auto found = gnc_import_select_account(nullptr, "Bank", FALSE, nullptr,
|
||||
nullptr, ACCT_TYPE_NONE, nullptr,
|
||||
nullptr);
|
||||
ASSERT_NE(nullptr, found);
|
||||
EXPECT_STREQ("Bank", xaccAccountGetName(found));
|
||||
}
|
||||
|
||||
TEST_F(ImportMatcherTest, test_noisy_match)
|
||||
{
|
||||
auto found = gnc_import_select_account(nullptr, "BankUSD", FALSE, nullptr,
|
||||
nullptr, ACCT_TYPE_NONE, nullptr,
|
||||
nullptr);
|
||||
ASSERT_NE(nullptr, found);
|
||||
EXPECT_STREQ("Bank", xaccAccountGetName(found));
|
||||
}
|
||||
|
||||
TEST_F(ImportMatcherTest, test_match_with_subaccounts)
|
||||
{
|
||||
auto found = gnc_import_select_account(nullptr, "BrokerStocks", FALSE,
|
||||
nullptr, nullptr, ACCT_TYPE_NONE,
|
||||
nullptr, nullptr);
|
||||
ASSERT_NE(nullptr, found);
|
||||
EXPECT_STREQ("Stocks", xaccAccountGetName(found));
|
||||
}
|
||||
|
||||
TEST_F(ImportMatcherTest, test_subaccount_match)
|
||||
{
|
||||
auto found = gnc_import_select_account(nullptr, "BrokerStocksHPE", FALSE,
|
||||
nullptr, nullptr, ACCT_TYPE_NONE,
|
||||
nullptr, nullptr);
|
||||
ASSERT_NE(nullptr, found);
|
||||
EXPECT_STREQ("HPE", xaccAccountGetName(found));
|
||||
}
|
||||
|
||||
TEST_F(ImportMatcherTest, test_subaccount_match_trailing_noise)
|
||||
{
|
||||
auto found = gnc_import_select_account(nullptr, "BrokerStocksHPEUSD", FALSE,
|
||||
nullptr, nullptr, ACCT_TYPE_NONE,
|
||||
nullptr, nullptr);
|
||||
ASSERT_NE(nullptr, found);
|
||||
EXPECT_STREQ("HPE", xaccAccountGetName(found));
|
||||
}
|
||||
|
||||
TEST_F(ImportMatcherTest, test_subaccount_no_match)
|
||||
{
|
||||
auto found = gnc_import_select_account(nullptr, "BrokerStocksINTC", FALSE,
|
||||
nullptr, nullptr, ACCT_TYPE_STOCK,
|
||||
nullptr, nullptr);
|
||||
ASSERT_EQ(nullptr, found);
|
||||
}
|
||||
|
||||
TEST_F(ImportMatcherTest, test_subaccount_match_trailing_space)
|
||||
{
|
||||
auto found = gnc_import_select_account(nullptr, "BrokerStocksMSFT ", FALSE,
|
||||
nullptr, nullptr, ACCT_TYPE_NONE,
|
||||
nullptr, nullptr);
|
||||
ASSERT_NE(nullptr, found);
|
||||
EXPECT_STREQ("MSFT", xaccAccountGetName(found));
|
||||
}
|
||||
|
||||
TEST_F(ImportMatcherTest, test_subaccount_match_trim_trailing_space)
|
||||
{
|
||||
auto found = gnc_import_select_account(nullptr, "BrokerStocksMSFT", FALSE,
|
||||
nullptr, nullptr, ACCT_TYPE_NONE,
|
||||
nullptr, nullptr);
|
||||
ASSERT_NE(nullptr, found);
|
||||
EXPECT_STREQ("MSFT", xaccAccountGetName(found));
|
||||
}
|
||||
|
||||
TEST_F(ImportMatcherTest, test_subaccount_match_internal_space)
|
||||
{
|
||||
auto found = gnc_import_select_account(nullptr, "BrokerCash Management",
|
||||
FALSE, nullptr, nullptr,
|
||||
ACCT_TYPE_NONE, nullptr, nullptr);
|
||||
ASSERT_NE(nullptr, found);
|
||||
EXPECT_STREQ("Cash Management", xaccAccountGetName(found));
|
||||
}
|
||||
@@ -25,8 +25,9 @@
|
||||
(export gnc:book-add-quotes) ;; called from gnome/dialog-price-edit-db.c
|
||||
(export gnc:price-quotes-install-sources)
|
||||
|
||||
(use-modules (gnucash engine))
|
||||
(use-modules (gnucash utilities))
|
||||
(use-modules (gnucash gettext))
|
||||
(use-modules (gnucash utilities))
|
||||
(use-modules (gnucash gnc-module))
|
||||
(use-modules (gnucash core-utils))
|
||||
(use-modules (gnucash app-utils))
|
||||
(use-modules (gnucash gnome-utils))
|
||||
@@ -197,10 +198,11 @@
|
||||
commodity-list)
|
||||
|
||||
;; Now translate to just what gnc-fq-helper expects.
|
||||
(append
|
||||
(hash-map->list cons commodity-hash)
|
||||
(map (lambda (cmd) (cons (car cmd) (list (cdr cmd))))
|
||||
currency-list-filtered)))))
|
||||
(and (or (pair? currency-list-filtered) (pair? commodity-list))
|
||||
(append
|
||||
(hash-map->list cons commodity-hash)
|
||||
(map (lambda (cmd) (cons (car cmd) (list (cdr cmd))))
|
||||
currency-list-filtered))))))
|
||||
|
||||
(define (fq-call-data->fq-calls fq-call-data)
|
||||
;; take an output element from book->commodity->fq-call-data and
|
||||
|
||||
@@ -2194,9 +2194,8 @@ gnc_split_register_confirm (VirtualLocation virt_loc, gpointer user_data)
|
||||
}
|
||||
title = _("Change transaction containing a reconciled split?");
|
||||
message_format =
|
||||
_("The transaction you are about to change is protected because it contains reconciled splits in the following accounts:\n%s"
|
||||
"\n\nIf you continue editing this transaction all reconciled splits will be unreconciled. "
|
||||
"This might make future reconciliation difficult! Continue with this change?");
|
||||
_("The transaction you are about to change is contains reconciled splits in the following accounts:\n%s"
|
||||
"\n\nAre you sure you want to continue with this change ?");
|
||||
|
||||
message = g_strdup_printf (message_format, acc_list);
|
||||
g_free (acc_list);
|
||||
@@ -2250,14 +2249,6 @@ gnc_split_register_confirm (VirtualLocation virt_loc, gpointer user_data)
|
||||
}
|
||||
}
|
||||
|
||||
if (protected_trans_cell)
|
||||
{
|
||||
if (reg->unrecn_splits != NULL)
|
||||
g_list_free (reg->unrecn_splits);
|
||||
|
||||
reg->unrecn_splits = g_list_copy (xaccTransGetSplitList (trans));
|
||||
}
|
||||
|
||||
PINFO ("Unreconcile split list length is %d", g_list_length(reg->unrecn_splits));
|
||||
info->change_confirmed = TRUE;
|
||||
}
|
||||
|
||||
@@ -61,7 +61,7 @@ enum
|
||||
static GtkBoxClass *gnc_item_edit_parent_class;
|
||||
|
||||
static GtkToggleButtonClass *gnc_item_edit_tb_parent_class;
|
||||
|
||||
static void gnc_item_edit_destroying(GtkWidget *this, gpointer data);
|
||||
static void
|
||||
gnc_item_edit_tb_init (GncItemEditTb *item_edit_tb)
|
||||
{
|
||||
@@ -662,28 +662,6 @@ gnc_item_edit_get_property (GObject *object,
|
||||
}
|
||||
}
|
||||
|
||||
/* FIXME: Idle events calling gnc_item_edit_update can fire after the
|
||||
* GncItemEdit is finalized, but because the GncItemEdit class is
|
||||
* defined by hand instead of with the GType macros there's no way to
|
||||
* run gnc_item_edit_dispose or gnc_item_edit_finalize to null out the
|
||||
* pointers. We resort instead to a weak reference to null out the
|
||||
* sheet when it gets finalized to prevent gnc_item_edit_upate from
|
||||
* accessing the freed sheet.
|
||||
*
|
||||
* https://bugs.gnucash.org/show_bug.cgi?id=797481
|
||||
*
|
||||
* Note that this is still not bulletproof, after all we're still
|
||||
* using the GncItemEdit after it has been freed but without a dispose
|
||||
* function to do this correctly we're a bit stuck.
|
||||
*/
|
||||
static void
|
||||
sheet_destroyed (gpointer data, GObject *table)
|
||||
{
|
||||
GncItemEdit *item_edit = (GncItemEdit*)data;
|
||||
if (item_edit)
|
||||
item_edit->sheet = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
gnc_item_edit_set_property (GObject *object,
|
||||
guint param_id,
|
||||
@@ -694,15 +672,7 @@ gnc_item_edit_set_property (GObject *object,
|
||||
switch (param_id)
|
||||
{
|
||||
case PROP_SHEET:
|
||||
if (item_edit->sheet)
|
||||
g_object_weak_unref(G_OBJECT(item_edit->sheet),
|
||||
(GWeakNotify)sheet_destroyed,
|
||||
(gpointer)item_edit);
|
||||
item_edit->sheet = GNUCASH_SHEET (g_value_get_object (value));
|
||||
if (item_edit->sheet)
|
||||
g_object_weak_ref(G_OBJECT(item_edit->sheet),
|
||||
(GWeakNotify)sheet_destroyed,
|
||||
(gpointer)item_edit);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
|
||||
@@ -963,9 +933,18 @@ gnc_item_edit_new (GnucashSheet *sheet)
|
||||
|
||||
gtk_box_pack_start (GTK_BOX(item_edit), vb, FALSE, FALSE, 0);
|
||||
gtk_widget_show_all(GTK_WIDGET(item_edit));
|
||||
g_signal_connect(G_OBJECT(item_edit), "destroy",
|
||||
G_CALLBACK(gnc_item_edit_destroying), NULL);
|
||||
return GTK_WIDGET(item_edit);
|
||||
}
|
||||
|
||||
static void
|
||||
gnc_item_edit_destroying(GtkWidget *item_edit, gpointer data)
|
||||
{
|
||||
while (g_idle_remove_by_data((gpointer)item_edit))
|
||||
continue;
|
||||
}
|
||||
|
||||
static void
|
||||
check_popup_height_is_true (GtkWidget *widget,
|
||||
GdkRectangle *allocation,
|
||||
|
||||
@@ -383,9 +383,14 @@
|
||||
(define* (gnc:account-accumulate-at-dates
|
||||
acc dates #:key
|
||||
(nosplit->elt #f)
|
||||
(split->date (compose xaccTransGetDate xaccSplitGetParent))
|
||||
(split->date #f)
|
||||
(split->elt xaccSplitGetBalance))
|
||||
(let lp ((splits (xaccAccountGetSplitList acc))
|
||||
(define to-date (or split->date (compose xaccTransGetDate xaccSplitGetParent)))
|
||||
(define (less? a b) (< (to-date a) (to-date b)))
|
||||
|
||||
(let lp ((splits (if split->date
|
||||
(stable-sort! (xaccAccountGetSplitList acc) less?)
|
||||
(xaccAccountGetSplitList acc)))
|
||||
(dates (sort dates <))
|
||||
(result '())
|
||||
(last-result nosplit->elt))
|
||||
@@ -395,8 +400,8 @@
|
||||
(() (reverse result))
|
||||
|
||||
((date . rest)
|
||||
(define (before-date? s) (< (split->date s) date))
|
||||
(define (after-date? s) (< date (split->date s)))
|
||||
(define (before-date? s) (<= (to-date s) date))
|
||||
(define (after-date? s) (< date (to-date s)))
|
||||
(match splits
|
||||
|
||||
;; end of splits, but still has dates. pad with last-result
|
||||
|
||||
@@ -888,7 +888,7 @@
|
||||
(gnc:register-inv-option
|
||||
(gnc:make-simple-boolean-option
|
||||
(N_ "Display Columns") credit-header
|
||||
"had" (N_ "Display a period credits column?") #t))
|
||||
"had" (N_ "Display the period credits column?") #t))
|
||||
|
||||
(gnc:register-inv-option
|
||||
(gnc:make-simple-boolean-option
|
||||
|
||||
@@ -594,7 +594,7 @@
|
||||
(gnc:register-inv-option
|
||||
(gnc:make-simple-boolean-option
|
||||
(N_ "Display Columns") debit-header
|
||||
"had" (N_ "Display a period debits column?") #t))
|
||||
"had" (N_ "Display the period debits column?") #t))
|
||||
|
||||
(gnc:register-inv-option
|
||||
(gnc:make-simple-boolean-option
|
||||
|
||||
@@ -570,6 +570,13 @@
|
||||
(define (split->amount split)
|
||||
(and split (xaccSplitGetAmount split)))
|
||||
|
||||
(define (set-reconcile txn date)
|
||||
(for-each
|
||||
(lambda (s)
|
||||
(xaccSplitSetReconcile s #\y)
|
||||
(xaccSplitSetDateReconciledSecs s date))
|
||||
(xaccTransGetSplitList txn)))
|
||||
|
||||
(define (test-get-account-at-dates)
|
||||
(test-group-with-cleanup "test-get-balance-at-dates"
|
||||
(let* ((env (create-test-env))
|
||||
@@ -655,5 +662,40 @@
|
||||
|
||||
(test-equal "1 txn in early slot"
|
||||
'(#f 10 10 10)
|
||||
(gnc:account-accumulate-at-dates bank4 dates)))
|
||||
(gnc:account-accumulate-at-dates bank4 dates))
|
||||
|
||||
;; Tests split->date sorting. note the 3 txns created below are
|
||||
;; initially sorted by posted_date ie txn2 < txn3 <
|
||||
;; txn1. However the reconciled_date sorting will be
|
||||
;; different. The accumulator will test both the reconciled_date
|
||||
;; sorting and the splits being accumulated in the correct date
|
||||
;; buckets.
|
||||
(let ((txn1 (env-transfer env 15 03 1971 income bank1 2))
|
||||
(txn2 (env-transfer env 15 01 1971 income bank1 3))
|
||||
(txn3 (env-transfer env 15 02 1971 income bank1 11)))
|
||||
|
||||
(define split->reconciled
|
||||
(let ((accum 0))
|
||||
(lambda (s)
|
||||
(when (eqv? (xaccSplitGetReconcile s) #\y)
|
||||
(set! accum (+ accum (xaccSplitGetAmount s))))
|
||||
accum)))
|
||||
|
||||
(define (split->reconciled-date s)
|
||||
(if (eqv? (xaccSplitGetReconcile s) #\y)
|
||||
(xaccSplitGetDateReconciled s)
|
||||
+inf.0))
|
||||
|
||||
(set-reconcile txn1 (gnc-dmy2time64 1 4 1971))
|
||||
(set-reconcile txn2 (gnc-dmy2time64 1 4 1971))
|
||||
(set-reconcile txn3 (gnc-dmy2time64 1 5 1971))
|
||||
|
||||
(test-equal "sort by reconcile-date"
|
||||
'(#f 5 16)
|
||||
(gnc:account-accumulate-at-dates
|
||||
bank1 (list (gnc-dmy2time64 1 3 1971)
|
||||
(gnc-dmy2time64 1 4 1971)
|
||||
(gnc-dmy2time64 1 5 1971))
|
||||
#:split->date split->reconciled-date
|
||||
#:split->elt split->reconciled))))
|
||||
(teardown)))
|
||||
|
||||
@@ -1404,6 +1404,8 @@ be excluded from periodic reporting.")
|
||||
(data (if (and (any (lambda (c) (eq? 'bal-bf (vector-ref c 5)))
|
||||
calculated-cells)
|
||||
(memq sortkey ACCOUNT-SORTING-TYPES))
|
||||
;; Translators: Balance b/f stands for "Balance
|
||||
;; brought forward".
|
||||
(string-append data ": " (_ "Balance b/f"))
|
||||
data))
|
||||
(renderer-fn (keylist-get-info
|
||||
@@ -2195,6 +2197,7 @@ be excluded from periodic reporting.")
|
||||
(gnc:make-html-text
|
||||
(gnc:html-markup-h3
|
||||
(format #f
|
||||
;; Translators: Both ~a's are dates
|
||||
(_ "From ~a to ~a")
|
||||
(qof-print-date begindate)
|
||||
(qof-print-date enddate)))))
|
||||
|
||||
@@ -179,11 +179,11 @@ gnc_ui_account_get_print_report_balance (xaccGetBalanceInCurrencyFn fn,
|
||||
return g_strdup(xaccPrintAmount(balance, print_info));
|
||||
}
|
||||
|
||||
|
||||
gnc_numeric
|
||||
gnc_ui_account_get_balance_as_of_date (Account *account,
|
||||
time64 date,
|
||||
gboolean include_children)
|
||||
static gnc_numeric
|
||||
account_get_balance_as_of_date (Account *account,
|
||||
time64 date,
|
||||
gboolean include_children,
|
||||
xaccGetBalanceAsOfDateFn fn)
|
||||
{
|
||||
QofBook *book = gnc_account_get_book (account);
|
||||
GNCPriceDB *pdb = gnc_pricedb_get_db (book);
|
||||
@@ -194,7 +194,7 @@ gnc_ui_account_get_balance_as_of_date (Account *account,
|
||||
return gnc_numeric_zero ();
|
||||
|
||||
currency = xaccAccountGetCommodity (account);
|
||||
balance = xaccAccountGetBalanceAsOfDate (account, date);
|
||||
balance = fn (account, date);
|
||||
|
||||
if (include_children)
|
||||
{
|
||||
@@ -210,7 +210,7 @@ gnc_ui_account_get_balance_as_of_date (Account *account,
|
||||
|
||||
child = node->data;
|
||||
child_currency = xaccAccountGetCommodity (child);
|
||||
child_balance = xaccAccountGetBalanceAsOfDate (child, date);
|
||||
child_balance = fn (child, date);
|
||||
child_balance =
|
||||
gnc_pricedb_convert_balance_latest_price (pdb, child_balance,
|
||||
child_currency,
|
||||
@@ -228,6 +228,24 @@ gnc_ui_account_get_balance_as_of_date (Account *account,
|
||||
return balance;
|
||||
}
|
||||
|
||||
gnc_numeric
|
||||
gnc_ui_account_get_balance_as_of_date (Account *account,
|
||||
time64 date,
|
||||
gboolean include_children)
|
||||
{
|
||||
return account_get_balance_as_of_date (account, date, include_children,
|
||||
xaccAccountGetBalanceAsOfDate);
|
||||
}
|
||||
|
||||
gnc_numeric
|
||||
gnc_ui_account_get_reconciled_balance_as_of_date (Account *account,
|
||||
time64 date,
|
||||
gboolean include_children)
|
||||
{
|
||||
return account_get_balance_as_of_date (account, date, include_children,
|
||||
xaccAccountGetReconciledBalanceAsOfDate);
|
||||
}
|
||||
|
||||
|
||||
/********************************************************************
|
||||
* Balance calculations related to owners
|
||||
|
||||
@@ -110,6 +110,10 @@ gnc_ui_account_get_print_report_balance (xaccGetBalanceInCurrencyFn fn,
|
||||
gnc_numeric gnc_ui_account_get_balance_as_of_date (Account *account,
|
||||
time64 date,
|
||||
gboolean include_children);
|
||||
gnc_numeric
|
||||
gnc_ui_account_get_reconciled_balance_as_of_date (Account *account,
|
||||
time64 date,
|
||||
gboolean include_children);
|
||||
|
||||
/********************************************************************
|
||||
* Balance calculations related to owners
|
||||
|
||||
@@ -97,5 +97,6 @@ set(test-real-data-env
|
||||
add_test(NAME test-real-data
|
||||
COMMAND ${CMAKE_COMMAND} -E env
|
||||
${SHELL} ${CMAKE_CURRENT_SOURCE_DIR}/test-real-data.sh
|
||||
CONFIGURATIONS Debug;Release
|
||||
)
|
||||
set_tests_properties(test-real-data PROPERTIES ENVIRONMENT "${test-real-data-env}")
|
||||
|
||||
@@ -3409,56 +3409,27 @@ GetBalanceAsOfDate (Account *acc, time64 date, gboolean ignclosing)
|
||||
* xaccAccountForEachTransaction by using gpointer return
|
||||
* values rather than gints.
|
||||
*/
|
||||
AccountPrivate *priv;
|
||||
GList *lp;
|
||||
gboolean found = FALSE;
|
||||
gnc_numeric balance;
|
||||
Split *latest = nullptr;
|
||||
|
||||
g_return_val_if_fail(GNC_IS_ACCOUNT(acc), gnc_numeric_zero());
|
||||
|
||||
xaccAccountSortSplits (acc, TRUE); /* just in case, normally a noop */
|
||||
xaccAccountRecomputeBalance (acc); /* just in case, normally a noop */
|
||||
|
||||
priv = GET_PRIVATE(acc);
|
||||
for (GList *lp = GET_PRIVATE(acc)->splits; lp; lp = lp->next)
|
||||
{
|
||||
if (xaccTransGetDate (xaccSplitGetParent ((Split *)lp->data)) >= date)
|
||||
break;
|
||||
latest = (Split *)lp->data;
|
||||
}
|
||||
|
||||
if (!latest)
|
||||
return gnc_numeric_zero();
|
||||
|
||||
if (ignclosing)
|
||||
balance = priv->noclosing_balance;
|
||||
return xaccSplitGetNoclosingBalance (latest);
|
||||
else
|
||||
balance = priv->balance;
|
||||
|
||||
lp = priv->splits;
|
||||
while ( lp && !found )
|
||||
{
|
||||
time64 trans_time = xaccTransRetDatePosted( xaccSplitGetParent( (Split *)lp->data ));
|
||||
if ( trans_time >= date )
|
||||
found = TRUE;
|
||||
else
|
||||
lp = lp->next;
|
||||
}
|
||||
|
||||
if ( lp )
|
||||
{
|
||||
if ( lp->prev )
|
||||
{
|
||||
/* Since lp is now pointing to a split which was past the reconcile
|
||||
* date, get the running balance of the previous split.
|
||||
*/
|
||||
if (ignclosing)
|
||||
balance = xaccSplitGetNoclosingBalance( (Split *)lp->prev->data );
|
||||
else
|
||||
balance = xaccSplitGetBalance( (Split *)lp->prev->data );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* AsOf date must be before any entries, return zero. */
|
||||
balance = gnc_numeric_zero();
|
||||
}
|
||||
}
|
||||
|
||||
/* Otherwise there were no splits posted after the given date,
|
||||
* so the latest account balance should be good enough.
|
||||
*/
|
||||
|
||||
return( balance );
|
||||
return xaccSplitGetBalance (latest);
|
||||
}
|
||||
|
||||
gnc_numeric
|
||||
@@ -3473,34 +3444,34 @@ xaccAccountGetNoclosingBalanceAsOfDate (Account *acc, time64 date)
|
||||
return GetBalanceAsOfDate (acc, date, TRUE);
|
||||
}
|
||||
|
||||
gnc_numeric
|
||||
xaccAccountGetReconciledBalanceAsOfDate (Account *acc, time64 date)
|
||||
{
|
||||
gnc_numeric balance = gnc_numeric_zero();
|
||||
|
||||
g_return_val_if_fail(GNC_IS_ACCOUNT(acc), gnc_numeric_zero());
|
||||
|
||||
for (GList *node = GET_PRIVATE(acc)->splits; node; node = node->next)
|
||||
{
|
||||
Split *split = (Split*) node->data;
|
||||
if ((xaccSplitGetReconcile (split) == YREC) &&
|
||||
(xaccSplitGetDateReconciled (split) <= date))
|
||||
balance = gnc_numeric_add_fixed (balance, xaccSplitGetAmount (split));
|
||||
};
|
||||
|
||||
return balance;
|
||||
}
|
||||
|
||||
/*
|
||||
* Originally gsr_account_present_balance in gnc-split-reg.c
|
||||
*
|
||||
* How does this routine compare to xaccAccountGetBalanceAsOfDate just
|
||||
* above? These two routines should eventually be collapsed into one.
|
||||
* Perhaps the startup logic from that one, and the logic from this
|
||||
* one that walks from the tail of the split list.
|
||||
*/
|
||||
gnc_numeric
|
||||
xaccAccountGetPresentBalance (const Account *acc)
|
||||
{
|
||||
AccountPrivate *priv;
|
||||
GList *node;
|
||||
time64 today;
|
||||
|
||||
g_return_val_if_fail(GNC_IS_ACCOUNT(acc), gnc_numeric_zero());
|
||||
|
||||
priv = GET_PRIVATE(acc);
|
||||
today = gnc_time64_get_today_end();
|
||||
for (node = g_list_last(priv->splits); node; node = node->prev)
|
||||
{
|
||||
Split *split = static_cast<Split*>(node->data);
|
||||
|
||||
if (xaccTransGetDate (xaccSplitGetParent (split)) <= today)
|
||||
return xaccSplitGetBalance (split);
|
||||
}
|
||||
|
||||
return gnc_numeric_zero ();
|
||||
return xaccAccountGetBalanceAsOfDate (GNC_ACCOUNT (acc),
|
||||
gnc_time64_get_today_end ());
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -558,6 +558,9 @@ gnc_numeric xaccAccountGetProjectedMinimumBalance (const Account *account);
|
||||
gnc_numeric xaccAccountGetBalanceAsOfDate (Account *account,
|
||||
time64 date);
|
||||
|
||||
/** Get the reconciled balance of the account as of the date specified */
|
||||
gnc_numeric xaccAccountGetReconciledBalanceAsOfDate (Account *account, time64 date);
|
||||
|
||||
/* These two functions convert a given balance from one commodity to
|
||||
another. The account argument is only used to get the Book, and
|
||||
may have nothing to do with the supplied balance. Likewise, the
|
||||
|
||||
@@ -174,6 +174,28 @@ nth_weekday_compare(const GDate *start, const GDate *next, PeriodType pt)
|
||||
}
|
||||
|
||||
|
||||
static void adjust_for_weekend(PeriodType pt, WeekendAdjust wadj, GDate *date)
|
||||
{
|
||||
if (pt == PERIOD_YEAR || pt == PERIOD_MONTH || pt == PERIOD_END_OF_MONTH)
|
||||
{
|
||||
if (g_date_get_weekday(date) == G_DATE_SATURDAY || g_date_get_weekday(date) == G_DATE_SUNDAY)
|
||||
{
|
||||
switch (wadj)
|
||||
{
|
||||
case WEEKEND_ADJ_BACK:
|
||||
g_date_subtract_days(date, g_date_get_weekday(date) == G_DATE_SATURDAY ? 1 : 2);
|
||||
break;
|
||||
case WEEKEND_ADJ_FORWARD:
|
||||
g_date_add_days(date, g_date_get_weekday(date) == G_DATE_SATURDAY ? 2 : 1);
|
||||
break;
|
||||
case WEEKEND_ADJ_NONE:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* This is the only real algorithm related to recurrences. It goes:
|
||||
Step 1) Go forward one period from the reference date.
|
||||
Step 2) Back up to align to the phase of the start date.
|
||||
@@ -183,6 +205,7 @@ recurrenceNextInstance(const Recurrence *r, const GDate *ref, GDate *next)
|
||||
{
|
||||
PeriodType pt;
|
||||
const GDate *start;
|
||||
GDate adjusted_start;
|
||||
guint mult;
|
||||
WeekendAdjust wadj;
|
||||
|
||||
@@ -191,20 +214,23 @@ recurrenceNextInstance(const Recurrence *r, const GDate *ref, GDate *next)
|
||||
g_return_if_fail(g_date_valid(&r->start));
|
||||
g_return_if_fail(g_date_valid(ref));
|
||||
|
||||
/* If the ref date comes before the start date then the next
|
||||
occurrence is always the start date, and we're done. */
|
||||
start = &r->start;
|
||||
if (g_date_compare(ref, start) < 0)
|
||||
mult = r->mult;
|
||||
pt = r->ptype;
|
||||
wadj = r->wadj;
|
||||
/* If the ref date comes before the start date then the next
|
||||
occurrence is always the start date, and we're done. */
|
||||
// However, it's possible for the start date to fall on an exception (a weekend), in that case, it needs to be corrected.
|
||||
adjusted_start = *start;
|
||||
adjust_for_weekend(pt,wadj,&adjusted_start);
|
||||
if (g_date_compare(ref, &adjusted_start) < 0)
|
||||
{
|
||||
g_date_set_julian(next, g_date_get_julian(start));
|
||||
g_date_set_julian(next, g_date_get_julian(&adjusted_start));
|
||||
return;
|
||||
}
|
||||
g_date_set_julian(next, g_date_get_julian(ref)); /* start at refDate */
|
||||
|
||||
/* Step 1: move FORWARD one period, passing exactly one occurrence. */
|
||||
mult = r->mult;
|
||||
pt = r->ptype;
|
||||
wadj = r->wadj;
|
||||
switch (pt)
|
||||
{
|
||||
case PERIOD_YEAR:
|
||||
@@ -342,25 +368,7 @@ recurrenceNextInstance(const Recurrence *r, const GDate *ref, GDate *next)
|
||||
g_date_set_day(next, g_date_get_day(start)); /*same day as start*/
|
||||
|
||||
/* Adjust for dates on the weekend. */
|
||||
if (pt == PERIOD_YEAR || pt == PERIOD_MONTH || pt == PERIOD_END_OF_MONTH)
|
||||
{
|
||||
if (g_date_get_weekday(next) == G_DATE_SATURDAY || g_date_get_weekday(next) == G_DATE_SUNDAY)
|
||||
{
|
||||
switch (wadj)
|
||||
{
|
||||
case WEEKEND_ADJ_BACK:
|
||||
g_date_subtract_days(next, g_date_get_weekday(next) == G_DATE_SATURDAY ? 1 : 2);
|
||||
break;
|
||||
case WEEKEND_ADJ_FORWARD:
|
||||
g_date_add_days(next, g_date_get_weekday(next) == G_DATE_SATURDAY ? 2 : 1);
|
||||
break;
|
||||
case WEEKEND_ADJ_NONE:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
adjust_for_weekend(pt,wadj,next);
|
||||
}
|
||||
break;
|
||||
case PERIOD_WEEK:
|
||||
|
||||
@@ -7,7 +7,6 @@ set(libgncmod_test_engine_SOURCES
|
||||
add_library(gncmod-test-engine STATIC ${libgncmod_test_engine_SOURCES})
|
||||
|
||||
target_include_directories(gncmod-test-engine PRIVATE
|
||||
${CMAKE_PREFIX_PATH}/include
|
||||
${GMODULE_INCLUDE_DIRS}
|
||||
${CMAKE_SOURCE_DIR}/libgnucash/gnc-module
|
||||
${CMAKE_BINARY_DIR}/common # for config.h
|
||||
|
||||
@@ -19,7 +19,7 @@ endmacro()
|
||||
|
||||
add_executable(test-link EXCLUDE_FROM_ALL test-link.c)
|
||||
target_link_libraries(test-link gnc-core-utils)
|
||||
add_test(NAME test-link COMMAND test-link)
|
||||
add_test(NAME test-link COMMAND test-link CONFIGURATIONS Debug;Release)
|
||||
add_dependencies(check test-link)
|
||||
|
||||
#################################################
|
||||
|
||||
@@ -385,7 +385,8 @@ TEST(gnc_datetime_constructors, test_gncdate_neutral_constructor)
|
||||
{
|
||||
const ymd aymd = { 2017, 04, 20 };
|
||||
GncDateTime atime(GncDate(aymd.year, aymd.month, aymd.day), DayPart::neutral);
|
||||
GncDateTime gncdt(1492685940); /* 20 Apr 2017 10:59:00 Z */
|
||||
time64 date{1492685940};
|
||||
GncDateTime gncdt(date); /* 20 Apr 2017 10:59:00 Z */
|
||||
/* The ymd constructor sets the time of day at 10:59:00 for
|
||||
* timezones between UTC-10 and UTC+13. For other timezones the
|
||||
* time of day is adjusted to ensure a consistent date and the
|
||||
@@ -397,9 +398,48 @@ TEST(gnc_datetime_constructors, test_gncdate_neutral_constructor)
|
||||
gncdt.offset() <= max_eastern_offset)
|
||||
{
|
||||
EXPECT_EQ(atime.format("%d-%m-%Y %H:%M:%S %Z"), "20-04-2017 10:59:00 UTC");
|
||||
// EXPECT_EQ(atime, gncdt);
|
||||
EXPECT_EQ(date, static_cast<time64>(gncdt));
|
||||
EXPECT_EQ(date, static_cast<time64>(atime));
|
||||
}
|
||||
}
|
||||
|
||||
TEST(gnc_datetime_constructors, test_neutral_across_timezones)
|
||||
{
|
||||
const ymd begins = {2018, 03, 05};
|
||||
const ymd ends = {2018, 03, 15};
|
||||
const time64 ten_days = 864000;
|
||||
#ifdef __MINGW32__
|
||||
TimeZoneProvider tzp_lon{"GMT Standard Time"};
|
||||
TimeZoneProvider tzp_perth{"W. Australia Standard Time"};
|
||||
TimeZoneProvider tzp_la{"Pacific Standard Time"};
|
||||
#else
|
||||
TimeZoneProvider tzp_lon("Europe/London");
|
||||
TimeZoneProvider tzp_perth("Australia/Perth");
|
||||
TimeZoneProvider tzp_la("America/Los_Angeles");
|
||||
#endif
|
||||
_set_tzp(tzp_lon);
|
||||
GncDateTime btime_lon(GncDate(begins.year, begins.month, begins.day), DayPart::neutral);
|
||||
GncDateTime etime_lon(GncDate(ends.year, ends.month, ends.day), DayPart::neutral);
|
||||
_reset_tzp();
|
||||
_set_tzp(tzp_perth);
|
||||
GncDateTime btime_perth(GncDate(begins.year, begins.month, begins.day), DayPart::neutral);
|
||||
GncDateTime etime_perth(GncDate(ends.year, ends.month, ends.day), DayPart::neutral);
|
||||
_reset_tzp();
|
||||
_set_tzp(tzp_la);
|
||||
GncDateTime btime_la(GncDate(begins.year, begins.month, begins.day), DayPart::neutral);
|
||||
GncDateTime etime_la(GncDate(ends.year, ends.month, ends.day), DayPart::neutral);
|
||||
_reset_tzp();
|
||||
|
||||
EXPECT_EQ(static_cast<time64>(btime_lon), static_cast<time64>(btime_perth));
|
||||
EXPECT_EQ(static_cast<time64>(btime_lon), static_cast<time64>(btime_la));
|
||||
EXPECT_EQ(static_cast<time64>(etime_lon), static_cast<time64>(etime_perth));
|
||||
EXPECT_EQ(static_cast<time64>(etime_lon), static_cast<time64>(etime_la));
|
||||
EXPECT_EQ(ten_days, static_cast<time64>(etime_lon) - static_cast<time64>(btime_lon));
|
||||
EXPECT_EQ(ten_days, static_cast<time64>(etime_perth) - static_cast<time64>(btime_perth));
|
||||
EXPECT_EQ(ten_days, static_cast<time64>(etime_la) - static_cast<time64>(btime_la));
|
||||
}
|
||||
|
||||
TEST(gnc_datetime_functions, test_format)
|
||||
{
|
||||
GncDateTime atime(2394187200); //2045-11-13 12:00:00 Z
|
||||
|
||||
@@ -30,13 +30,13 @@
|
||||
|
||||
static QofBook *book;
|
||||
|
||||
static void check_valid(GDate *next, GDate *ref, GDate *start,
|
||||
static gboolean check_valid(GDate *next, GDate *ref, GDate *start,
|
||||
guint16 mult, PeriodType pt, WeekendAdjust wadj)
|
||||
{
|
||||
gboolean valid;
|
||||
GDate adj_date;
|
||||
gint startToNext;
|
||||
/* FIXME: The WeekendAdjust argument is completely ignored for
|
||||
now. */
|
||||
gboolean ret_val = TRUE;
|
||||
|
||||
valid = g_date_valid(next);
|
||||
if (pt == PERIOD_ONCE && g_date_compare(start, ref) <= 0)
|
||||
@@ -44,7 +44,7 @@ static void check_valid(GDate *next, GDate *ref, GDate *start,
|
||||
else
|
||||
do_test(valid, "incorrectly invalid");
|
||||
|
||||
if (!valid) return;
|
||||
if (!valid) return valid;
|
||||
|
||||
do_test(g_date_compare(ref, next) < 0,
|
||||
"next date not strictly later than ref date");
|
||||
@@ -54,13 +54,41 @@ static void check_valid(GDate *next, GDate *ref, GDate *start,
|
||||
switch (pt)
|
||||
{
|
||||
case PERIOD_YEAR:
|
||||
do_test((g_date_get_year(next) - g_date_get_year(start)) % mult == 0,
|
||||
ret_val &= do_test((g_date_get_year(next) - g_date_get_year(start)) % mult == 0,
|
||||
"year period phase wrong"); // redundant
|
||||
mult *= 12;
|
||||
// fall through
|
||||
case PERIOD_END_OF_MONTH:
|
||||
if (pt == PERIOD_END_OF_MONTH)
|
||||
do_test(g_date_is_last_of_month(next), "end of month phase wrong");
|
||||
{
|
||||
if(wadj == WEEKEND_ADJ_NONE)
|
||||
ret_val &= do_test(g_date_is_last_of_month(next), "end of month phase wrong");
|
||||
else
|
||||
{
|
||||
gboolean result;
|
||||
if(!g_date_is_last_of_month(next))
|
||||
{
|
||||
adj_date = *next;
|
||||
if(wadj == WEEKEND_ADJ_BACK)
|
||||
{
|
||||
// If adjusting back, one of the next two days to be end of month
|
||||
g_date_add_days(&adj_date,1);
|
||||
result = g_date_is_last_of_month(&adj_date);
|
||||
g_date_add_days(&adj_date,1);
|
||||
result |= g_date_is_last_of_month(&adj_date);
|
||||
}
|
||||
if(wadj == WEEKEND_ADJ_FORWARD)
|
||||
{
|
||||
// If adjusting forward, one of the two previous days has to be end of month
|
||||
g_date_subtract_days(&adj_date,1);
|
||||
result = g_date_is_last_of_month(&adj_date);
|
||||
g_date_subtract_days(&adj_date,1);
|
||||
result |= g_date_is_last_of_month(&adj_date);
|
||||
}
|
||||
ret_val &= do_test(result, "end of month phase wrong");
|
||||
}
|
||||
}
|
||||
}
|
||||
// fall through
|
||||
case PERIOD_LAST_WEEKDAY:
|
||||
case PERIOD_NTH_WEEKDAY:
|
||||
@@ -71,13 +99,14 @@ static void check_valid(GDate *next, GDate *ref, GDate *start,
|
||||
|
||||
monthdiff = (g_date_get_month(next) - g_date_get_month(start)) +
|
||||
12 * (g_date_get_year(next) - g_date_get_year(start));
|
||||
do_test(monthdiff % mult == 0, "month or year phase wrong");
|
||||
monthdiff %= mult;
|
||||
ret_val &= do_test(monthdiff == 0 || (monthdiff == -1 && wadj == WEEKEND_ADJ_BACK) || (monthdiff == 1 && wadj == WEEKEND_ADJ_FORWARD), "month or year phase wrong");
|
||||
|
||||
if (pt == PERIOD_NTH_WEEKDAY || pt == PERIOD_LAST_WEEKDAY)
|
||||
{
|
||||
guint sweek, nweek;
|
||||
|
||||
do_test(g_date_get_weekday(next) == g_date_get_weekday(start),
|
||||
ret_val &= do_test(g_date_get_weekday(next) == g_date_get_weekday(start),
|
||||
"weekday phase wrong");
|
||||
sweek = (g_date_get_day(start) - 1) / 7;
|
||||
nweek = (g_date_get_day(next) - 1) / 7;
|
||||
@@ -87,7 +116,7 @@ static void check_valid(GDate *next, GDate *ref, GDate *start,
|
||||
4th, OR 'start' didn't have 5 of the weekday that
|
||||
'next' does and we want the LAST weekday, so it's the
|
||||
5th of that weekday */
|
||||
do_test(sweek == nweek ||
|
||||
ret_val &= do_test(sweek == nweek ||
|
||||
(sweek == 4 && nweek == 3 && (g_date_get_day(next) + 7) >
|
||||
g_date_get_days_in_month(
|
||||
g_date_get_month(next), g_date_get_year(next))) ||
|
||||
@@ -97,16 +126,61 @@ static void check_valid(GDate *next, GDate *ref, GDate *start,
|
||||
}
|
||||
else
|
||||
{
|
||||
GDateWeekday week_day;
|
||||
GDateWeekday week_day_1;
|
||||
GDateWeekday week_day_2;
|
||||
day_start = g_date_get_day(start);
|
||||
day_next = g_date_get_day(next);
|
||||
if (day_start < 28)
|
||||
do_test(day_start == day_next, "dom don't match");
|
||||
else if (pt != PERIOD_END_OF_MONTH)
|
||||
{
|
||||
gboolean result;
|
||||
week_day = g_date_get_weekday (next);
|
||||
switch (wadj) {
|
||||
case WEEKEND_ADJ_NONE:
|
||||
ret_val &= do_test(day_start == day_next, "dom don't match");
|
||||
break;
|
||||
case WEEKEND_ADJ_BACK:
|
||||
// Week_day cannot be a weekend.
|
||||
result = (week_day != G_DATE_SATURDAY && week_day != G_DATE_SUNDAY);
|
||||
if(day_start != day_next)
|
||||
{
|
||||
// If the dom don't match day must be a Friday
|
||||
result &= (week_day == G_DATE_FRIDAY);
|
||||
// Either day_next+1 or day_next+2 matches day_start
|
||||
g_date_add_days(next,1);
|
||||
week_day_1 = g_date_get_day(next);
|
||||
g_date_add_days(next,1);
|
||||
week_day_2 = g_date_get_day(next);
|
||||
result &= week_day_1 == day_start || week_day_2 == day_start;
|
||||
}
|
||||
ret_val &= do_test(result, "dom don't match");
|
||||
break;
|
||||
case WEEKEND_ADJ_FORWARD:
|
||||
// Week_day cannot be a weekend.
|
||||
result = (week_day != G_DATE_SATURDAY && week_day != G_DATE_SUNDAY);
|
||||
if(day_start != day_next)
|
||||
{
|
||||
// If the dom don't match day must be a Monday
|
||||
result &= (week_day == G_DATE_MONDAY);
|
||||
// Either day_next-1 or day_next-2 matches day_start
|
||||
g_date_subtract_days(next,1);
|
||||
week_day_1 = g_date_get_day(next);
|
||||
g_date_subtract_days(next,1);
|
||||
week_day_2 = g_date_get_day(next);
|
||||
result &= week_day_1 == day_start || week_day_2 == day_start;
|
||||
}
|
||||
ret_val &= do_test(result, "dom don't match");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (pt != PERIOD_END_OF_MONTH && wadj == WEEKEND_ADJ_NONE)
|
||||
{
|
||||
// the end of month case was already checked above. near
|
||||
// the end of the month, the days should still agree,
|
||||
// unless they can't because of a short month.
|
||||
do_test(day_start == day_next || g_date_is_last_of_month(next),
|
||||
ret_val &= do_test(day_start == day_next || g_date_is_last_of_month(next),
|
||||
"dom don't match and next is not eom");
|
||||
}
|
||||
}
|
||||
@@ -116,16 +190,16 @@ static void check_valid(GDate *next, GDate *ref, GDate *start,
|
||||
mult *= 7;
|
||||
// fall through
|
||||
case PERIOD_DAY:
|
||||
do_test((startToNext % mult) == 0, "week or day period phase wrong");
|
||||
ret_val &= do_test((startToNext % mult) == 0, "week or day period phase wrong");
|
||||
break;
|
||||
case PERIOD_ONCE:
|
||||
do_test(startToNext == 0, "period once not on start date");
|
||||
ret_val &= do_test(startToNext == 0, "period once not on start date");
|
||||
break;
|
||||
default:
|
||||
do_test(FALSE, "invalid PeriodType");
|
||||
ret_val &=do_test(FALSE, "invalid PeriodType");
|
||||
break;
|
||||
}
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
#define NUM_DATES_TO_TEST 300
|
||||
@@ -168,9 +242,9 @@ static void test_all()
|
||||
wadj_reg = recurrenceGetWeekendAdjust(&r);
|
||||
|
||||
recurrenceNextInstance(&r, &d_ref, &d_next);
|
||||
check_valid(&d_next, &d_ref, &d_start_reg,
|
||||
mult_reg, pt_reg, wadj_reg);
|
||||
|
||||
if (!check_valid(&d_next, &d_ref, &d_start_reg,
|
||||
mult_reg, pt_reg, wadj_reg))
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
4086
po/en_GB.po
4086
po/en_GB.po
File diff suppressed because it is too large
Load Diff
4068
po/es_NI.po
4068
po/es_NI.po
File diff suppressed because it is too large
Load Diff
@@ -1,3 +1,7 @@
|
||||
# Notes:
|
||||
# ar.po was never translated.
|
||||
# de_CH got abandoned as a separate gnucash language.
|
||||
# So we do not distribute them in the tarball.
|
||||
|
||||
set_dist_list(po_glossary_DIST CMakeLists.txt bg.po ca.po da.po de.po el.po es_NI-policy.txt es.po fr.po gnc-glossary.txt he.po
|
||||
hr.po hu.po it.po nb.po nl.po pl.po pt_BR.po pt.po ru.po rw.po sk.po sv.po txt-to-pot.sh vi.po zh_CN.po zh_TW.po)
|
||||
@@ -5,7 +5,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: GnuCash 2.6.8\n"
|
||||
"POT-Creation-Date: 2017-10-20 19:04+0200\n"
|
||||
"POT-Creation-Date: 2020-03-27 21:58+0100\n"
|
||||
"PO-Revision-Date: \n"
|
||||
"Last-Translator: Frank H. Ellenberger <frank.h.ellenberger@gmail.com>\n"
|
||||
"Language-Team: None\n"
|
||||
@@ -22,7 +22,7 @@ msgstr ""
|
||||
msgid "account"
|
||||
msgstr ""
|
||||
|
||||
#. "-"
|
||||
#. "An alphanumerical key of an account in GnuCash, not at the bank, can be used to sort. Some templates provide them or the user can enter them."
|
||||
msgid "account code"
|
||||
msgstr ""
|
||||
|
||||
@@ -186,6 +186,10 @@ msgstr ""
|
||||
msgid "action: withdraw"
|
||||
msgstr ""
|
||||
|
||||
#. "As in: payable aging, or: receivable aging. The aging report categorizes payables or receivables based on time buckets. This gives an overview of which bills or invoices are overdue at which time in the future. "
|
||||
msgid "aging"
|
||||
msgstr ""
|
||||
|
||||
#. "A sum of money"
|
||||
msgid "amount"
|
||||
msgstr ""
|
||||
@@ -198,6 +202,14 @@ msgstr ""
|
||||
msgid "balance (noun)"
|
||||
msgstr ""
|
||||
|
||||
#. "Balance brought forward - usually the first entry of an account statement containing the 'balance c/f' of the previous billing period or page"
|
||||
msgid "balance b/f"
|
||||
msgstr ""
|
||||
|
||||
#. "Balance carried forward - usually the last entry of an account statement to be used as 'balance b/f' on the next billing period or page"
|
||||
msgid "balance c/f"
|
||||
msgstr ""
|
||||
|
||||
#. "A written record of money received and paid out, showing the difference between the two total amounts"
|
||||
msgid "balance sheet"
|
||||
msgstr ""
|
||||
|
||||
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnucash 2.2.5\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-10-20 19:04+0200\n"
|
||||
"POT-Creation-Date: 2020-03-27 21:58+0100\n"
|
||||
"PO-Revision-Date: 2011-10-25 13:18+0200\n"
|
||||
"Last-Translator: Rosi Dimova <pocu@bk.ru>\n"
|
||||
"Language-Team: BG <bg@li.org>\n"
|
||||
@@ -27,7 +27,7 @@ msgstr "Срок"
|
||||
msgid "account"
|
||||
msgstr "сметка"
|
||||
|
||||
#. "-"
|
||||
#. "An alphanumerical key of an account in GnuCash, not at the bank, can be used to sort. Some templates provide them or the user can enter them."
|
||||
msgid "account code"
|
||||
msgstr "код на сметка"
|
||||
|
||||
@@ -196,6 +196,10 @@ msgstr "action: пощенски превод"
|
||||
msgid "action: withdraw"
|
||||
msgstr "action: теглене"
|
||||
|
||||
#. "As in: payable aging, or: receivable aging. The aging report categorizes payables or receivables based on time buckets. This gives an overview of which bills or invoices are overdue at which time in the future. "
|
||||
msgid "aging"
|
||||
msgstr ""
|
||||
|
||||
#. "A sum of money"
|
||||
msgid "amount"
|
||||
msgstr "сума"
|
||||
@@ -208,6 +212,16 @@ msgstr "средно"
|
||||
msgid "balance (noun)"
|
||||
msgstr "салдо"
|
||||
|
||||
#. "Balance brought forward - usually the first entry of an account statement containing the 'balance c/f' of the previous billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance b/f"
|
||||
msgstr "изравняване"
|
||||
|
||||
#. "Balance carried forward - usually the last entry of an account statement to be used as 'balance b/f' on the next billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance c/f"
|
||||
msgstr "изравняване"
|
||||
|
||||
#. "A written record of money received and paid out, showing the difference between the two total amounts"
|
||||
msgid "balance sheet"
|
||||
msgstr "баланс"
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnucash-glossary 2.2\n"
|
||||
"POT-Creation-Date: 2017-10-20 19:04+0200\n"
|
||||
"POT-Creation-Date: 2020-03-27 21:58+0100\n"
|
||||
"PO-Revision-Date: 2008-08-03 16:43+0200\n"
|
||||
"Last-Translator: David Planella Molas <david.planella@gmail.com>\n"
|
||||
"Language-Team: Catalan <ca@li.org>\n"
|
||||
@@ -23,7 +23,7 @@ msgstr "Termini"
|
||||
msgid "account"
|
||||
msgstr "compte"
|
||||
|
||||
#. "-"
|
||||
#. "An alphanumerical key of an account in GnuCash, not at the bank, can be used to sort. Some templates provide them or the user can enter them."
|
||||
msgid "account code"
|
||||
msgstr "codi de compte"
|
||||
|
||||
@@ -192,6 +192,10 @@ msgstr "transferència"
|
||||
msgid "action: withdraw"
|
||||
msgstr "reintegrament"
|
||||
|
||||
#. "As in: payable aging, or: receivable aging. The aging report categorizes payables or receivables based on time buckets. This gives an overview of which bills or invoices are overdue at which time in the future. "
|
||||
msgid "aging"
|
||||
msgstr ""
|
||||
|
||||
#. "A sum of money"
|
||||
msgid "amount"
|
||||
msgstr "import"
|
||||
@@ -204,6 +208,16 @@ msgstr "promig"
|
||||
msgid "balance (noun)"
|
||||
msgstr "saldo"
|
||||
|
||||
#. "Balance brought forward - usually the first entry of an account statement containing the 'balance c/f' of the previous billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance b/f"
|
||||
msgstr "saldar"
|
||||
|
||||
#. "Balance carried forward - usually the last entry of an account statement to be used as 'balance b/f' on the next billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance c/f"
|
||||
msgstr "saldar"
|
||||
|
||||
#. "A written record of money received and paid out, showing the difference between the two total amounts"
|
||||
msgid "balance sheet"
|
||||
msgstr "balanç de situació"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnucash-glossary 2.3.5\n"
|
||||
"POT-Creation-Date: 2017-10-20 19:04+0200\n"
|
||||
"POT-Creation-Date: 2020-03-27 21:58+0100\n"
|
||||
"PO-Revision-Date: 2009-09-04 22:41+0200\n"
|
||||
"Last-Translator: Joe Hansen <joedalton2@yahoo.dk>\n"
|
||||
"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
|
||||
@@ -24,7 +24,7 @@ msgstr ""
|
||||
msgid "account"
|
||||
msgstr "konto"
|
||||
|
||||
#. "-"
|
||||
#. "An alphanumerical key of an account in GnuCash, not at the bank, can be used to sort. Some templates provide them or the user can enter them."
|
||||
msgid "account code"
|
||||
msgstr "kontonummer"
|
||||
|
||||
@@ -194,6 +194,10 @@ msgstr "hændelse: elektronisk overførsel"
|
||||
msgid "action: withdraw"
|
||||
msgstr "hændelse: hævning"
|
||||
|
||||
#. "As in: payable aging, or: receivable aging. The aging report categorizes payables or receivables based on time buckets. This gives an overview of which bills or invoices are overdue at which time in the future. "
|
||||
msgid "aging"
|
||||
msgstr ""
|
||||
|
||||
#. "A sum of money"
|
||||
msgid "amount"
|
||||
msgstr "beløb"
|
||||
@@ -206,6 +210,16 @@ msgstr "gennemsnit"
|
||||
msgid "balance (noun)"
|
||||
msgstr "saldo (navneord)"
|
||||
|
||||
#. "Balance brought forward - usually the first entry of an account statement containing the 'balance c/f' of the previous billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance b/f"
|
||||
msgstr "afstemme, at"
|
||||
|
||||
#. "Balance carried forward - usually the last entry of an account statement to be used as 'balance b/f' on the next billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance c/f"
|
||||
msgstr "afstemme, at"
|
||||
|
||||
#. "A written record of money received and paid out, showing the difference between the two total amounts"
|
||||
msgid "balance sheet"
|
||||
msgstr "kontoudtog"
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnucash 2.6.18\n"
|
||||
"POT-Creation-Date: 2019-12-29 22:22+0100\n"
|
||||
"POT-Creation-Date: 2020-03-27 21:58+0100\n"
|
||||
"PO-Revision-Date: 2019-12-29 22:15+0100\n"
|
||||
"Last-Translator: Frank H. Ellenberger <frank.h.ellenberger@gmail.com>\n"
|
||||
"Language-Team: German <gnucash-de@gnucash.org>\n"
|
||||
@@ -207,6 +207,14 @@ msgstr "Durchschnitt/Durchschnittlich"
|
||||
msgid "balance (noun)"
|
||||
msgstr "Saldo (Bestand, Kontostand?)"
|
||||
|
||||
#. "Balance brought forward - usually the first entry of an account statement containing the 'balance c/f' of the previous billing period or page"
|
||||
msgid "balance b/f"
|
||||
msgstr "Voriger Saldo"
|
||||
|
||||
#. "Balance carried forward - usually the last entry of an account statement to be used as 'balance b/f' on the next billing period or page"
|
||||
msgid "balance c/f"
|
||||
msgstr "Saldo"
|
||||
|
||||
#. "A written record of money received and paid out, showing the difference between the two total amounts"
|
||||
msgid "balance sheet"
|
||||
msgstr "Bilanz"
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnucash 1.7\n"
|
||||
"POT-Creation-Date: 2017-10-20 19:04+0200\n"
|
||||
"POT-Creation-Date: 2020-03-27 21:58+0100\n"
|
||||
"PO-Revision-Date: 2008-03-03 00:47+0100\n"
|
||||
"Last-Translator: Raffael Luthiger <r.luthiger@huanga.com>\n"
|
||||
"Language-Team: DE\n"
|
||||
@@ -22,7 +22,7 @@ msgstr "Begriff"
|
||||
msgid "account"
|
||||
msgstr "Konto"
|
||||
|
||||
#. "-"
|
||||
#. "An alphanumerical key of an account in GnuCash, not at the bank, can be used to sort. Some templates provide them or the user can enter them."
|
||||
msgid "account code"
|
||||
msgstr "Kontonummer (intern)"
|
||||
|
||||
@@ -191,6 +191,10 @@ msgstr "Überweisung"
|
||||
msgid "action: withdraw"
|
||||
msgstr "Abhebung"
|
||||
|
||||
#. "As in: payable aging, or: receivable aging. The aging report categorizes payables or receivables based on time buckets. This gives an overview of which bills or invoices are overdue at which time in the future. "
|
||||
msgid "aging"
|
||||
msgstr ""
|
||||
|
||||
#. "A sum of money"
|
||||
msgid "amount"
|
||||
msgstr "Betrag"
|
||||
@@ -203,6 +207,16 @@ msgstr "Durchschnitt/Durchschnittlich"
|
||||
msgid "balance (noun)"
|
||||
msgstr "Saldo (Bestand, Kontostand?)"
|
||||
|
||||
#. "Balance brought forward - usually the first entry of an account statement containing the 'balance c/f' of the previous billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance b/f"
|
||||
msgstr "Ausgleichen "
|
||||
|
||||
#. "Balance carried forward - usually the last entry of an account statement to be used as 'balance b/f' on the next billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance c/f"
|
||||
msgstr "Ausgleichen "
|
||||
|
||||
#. "A written record of money received and paid out, showing the difference between the two total amounts"
|
||||
msgid "balance sheet"
|
||||
msgstr "Bilanz"
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnucash-glossary 1.0\n"
|
||||
"POT-Creation-Date: 2017-10-20 19:04+0200\n"
|
||||
"POT-Creation-Date: 2020-03-27 21:58+0100\n"
|
||||
"PO-Revision-Date: 2001-12-28 00:17+0000\n"
|
||||
"Last-Translator: Simos Xenitellis <simos@hellug.gr>\n"
|
||||
"Language-Team: Greek <nls@tux.hellug.gr>\n"
|
||||
@@ -22,7 +22,7 @@ msgstr ""
|
||||
msgid "account"
|
||||
msgstr "λογαριασμός"
|
||||
|
||||
#. "-"
|
||||
#. "An alphanumerical key of an account in GnuCash, not at the bank, can be used to sort. Some templates provide them or the user can enter them."
|
||||
#, fuzzy
|
||||
msgid "account code"
|
||||
msgstr "Λογαριασμός %d"
|
||||
@@ -215,6 +215,10 @@ msgstr "Ώρα δημιουργίας"
|
||||
msgid "action: withdraw"
|
||||
msgstr ""
|
||||
|
||||
#. "As in: payable aging, or: receivable aging. The aging report categorizes payables or receivables based on time buckets. This gives an overview of which bills or invoices are overdue at which time in the future. "
|
||||
msgid "aging"
|
||||
msgstr ""
|
||||
|
||||
#. "A sum of money"
|
||||
#, fuzzy
|
||||
msgid "amount"
|
||||
@@ -229,6 +233,16 @@ msgstr "Μέσος"
|
||||
msgid "balance (noun)"
|
||||
msgstr ""
|
||||
|
||||
#. "Balance brought forward - usually the first entry of an account statement containing the 'balance c/f' of the previous billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance b/f"
|
||||
msgstr "Ισορροπία"
|
||||
|
||||
#. "Balance carried forward - usually the last entry of an account statement to be used as 'balance b/f' on the next billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance c/f"
|
||||
msgstr "Ισορροπία"
|
||||
|
||||
#. "A written record of money received and paid out, showing the difference between the two total amounts"
|
||||
#, fuzzy
|
||||
msgid "balance sheet"
|
||||
|
||||
@@ -9,7 +9,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnucash-glossary 1.8.9\n"
|
||||
"Report-Msgid-Bugs-To: Eneko Lacunza <enlar@enlar.net>\n"
|
||||
"POT-Creation-Date: 2017-10-20 19:04+0200\n"
|
||||
"POT-Creation-Date: 2020-03-27 21:58+0100\n"
|
||||
"PO-Revision-Date: 2004-11-23 22:19+0100\n"
|
||||
"Last-Translator: Eneko Lacunza <enlar@enlar.net>\n"
|
||||
"Language-Team: Spanish <es@li.org>\n"
|
||||
@@ -26,7 +26,7 @@ msgstr ""
|
||||
msgid "account"
|
||||
msgstr "cuenta"
|
||||
|
||||
#. "-"
|
||||
#. "An alphanumerical key of an account in GnuCash, not at the bank, can be used to sort. Some templates provide them or the user can enter them."
|
||||
msgid "account code"
|
||||
msgstr "código de cuenta"
|
||||
|
||||
@@ -195,6 +195,10 @@ msgstr ""
|
||||
msgid "action: withdraw"
|
||||
msgstr "acción: reintegro"
|
||||
|
||||
#. "As in: payable aging, or: receivable aging. The aging report categorizes payables or receivables based on time buckets. This gives an overview of which bills or invoices are overdue at which time in the future. "
|
||||
msgid "aging"
|
||||
msgstr ""
|
||||
|
||||
#. "A sum of money"
|
||||
msgid "amount"
|
||||
msgstr "cantidad"
|
||||
@@ -207,6 +211,16 @@ msgstr "promedio"
|
||||
msgid "balance (noun)"
|
||||
msgstr "saldo"
|
||||
|
||||
#. "Balance brought forward - usually the first entry of an account statement containing the 'balance c/f' of the previous billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance b/f"
|
||||
msgstr "saldar"
|
||||
|
||||
#. "Balance carried forward - usually the last entry of an account statement to be used as 'balance b/f' on the next billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance c/f"
|
||||
msgstr "saldar"
|
||||
|
||||
#. "A written record of money received and paid out, showing the difference between the two total amounts"
|
||||
msgid "balance sheet"
|
||||
msgstr "hoja de balance"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnucash 2.0\n"
|
||||
"POT-Creation-Date: 2017-10-20 19:04+0200\n"
|
||||
"POT-Creation-Date: 2020-03-27 21:58+0100\n"
|
||||
"PO-Revision-Date: 2018-10-25 12:30+0200\n"
|
||||
"Last-Translator: La Boussole <yoann@laboussole.coop>\n"
|
||||
"Language-Team: français <yoann@laboussole.coop>\n"
|
||||
@@ -28,7 +28,7 @@ msgstr ""
|
||||
msgid "account"
|
||||
msgstr "compte"
|
||||
|
||||
#. "-"
|
||||
#. "An alphanumerical key of an account in GnuCash, not at the bank, can be used to sort. Some templates provide them or the user can enter them."
|
||||
msgid "account code"
|
||||
msgstr "code du compte"
|
||||
|
||||
@@ -196,6 +196,10 @@ msgstr "action : virement électronique (TIP)"
|
||||
msgid "action: withdraw"
|
||||
msgstr "action : retrait"
|
||||
|
||||
#. "As in: payable aging, or: receivable aging. The aging report categorizes payables or receivables based on time buckets. This gives an overview of which bills or invoices are overdue at which time in the future. "
|
||||
msgid "aging"
|
||||
msgstr ""
|
||||
|
||||
#. "A sum of money"
|
||||
msgid "amount"
|
||||
msgstr "montant brut"
|
||||
@@ -208,6 +212,16 @@ msgstr "moyenne"
|
||||
msgid "balance (noun)"
|
||||
msgstr "bilan"
|
||||
|
||||
#. "Balance brought forward - usually the first entry of an account statement containing the 'balance c/f' of the previous billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance b/f"
|
||||
msgstr "bilan, pour"
|
||||
|
||||
#. "Balance carried forward - usually the last entry of an account statement to be used as 'balance b/f' on the next billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance c/f"
|
||||
msgstr "bilan, pour"
|
||||
|
||||
#. "A written record of money received and paid out, showing the difference between the two total amounts"
|
||||
msgid "balance sheet"
|
||||
msgstr "bilan graphique"
|
||||
|
||||
@@ -45,6 +45,8 @@
|
||||
"amount" "A sum of money"
|
||||
"average" "The result of adding several amounts together and then dividing this total by the number of amounts"
|
||||
"balance (noun)" "The amount of money that is in one's account"
|
||||
"balance b/f" "Balance brought forward - usually the first entry of an account statement containing the 'balance c/f' of the previous billing period or page"
|
||||
"balance c/f" "Balance carried forward - usually the last entry of an account statement to be used as 'balance b/f' on the next billing period or page"
|
||||
"balance sheet" "A written record of money received and paid out, showing the difference between the two total amounts"
|
||||
"balance, to" "To arrange for income and spending to be equal"
|
||||
"bank" "-"
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnucash 3.6\n"
|
||||
"POT-Creation-Date: 2019-08-12 17:40+0300\n"
|
||||
"POT-Creation-Date: 2020-03-27 21:58+0100\n"
|
||||
"PO-Revision-Date: 2019-08-12 17:55+0300\n"
|
||||
"Last-Translator: Avi Markovitz <avi.markovitz@gmail.com>\n"
|
||||
"Language-Team: HE\n"
|
||||
@@ -24,7 +24,7 @@ msgstr "מונח"
|
||||
msgid "account"
|
||||
msgstr "חשבון"
|
||||
|
||||
#. "-"
|
||||
#. "An alphanumerical key of an account in GnuCash, not at the bank, can be used to sort. Some templates provide them or the user can enter them."
|
||||
msgid "account code"
|
||||
msgstr "קוד חשבון"
|
||||
|
||||
@@ -188,6 +188,10 @@ msgstr "פעולה: מברק"
|
||||
msgid "action: withdraw"
|
||||
msgstr "פעולה: משיכה"
|
||||
|
||||
#. "As in: payable aging, or: receivable aging. The aging report categorizes payables or receivables based on time buckets. This gives an overview of which bills or invoices are overdue at which time in the future. "
|
||||
msgid "aging"
|
||||
msgstr ""
|
||||
|
||||
#. "A sum of money"
|
||||
msgid "amount"
|
||||
msgstr "סכום"
|
||||
@@ -200,6 +204,16 @@ msgstr "ממוצע"
|
||||
msgid "balance (noun)"
|
||||
msgstr "מאזן (שם עצם)"
|
||||
|
||||
#. "Balance brought forward - usually the first entry of an account statement containing the 'balance c/f' of the previous billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance b/f"
|
||||
msgstr "לאזן, ל"
|
||||
|
||||
#. "Balance carried forward - usually the last entry of an account statement to be used as 'balance b/f' on the next billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance c/f"
|
||||
msgstr "לאזן, ל"
|
||||
|
||||
#. "A written record of money received and paid out, showing the difference between the two total amounts"
|
||||
msgid "balance sheet"
|
||||
msgstr "מאזן"
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: GnuCash 3.4\n"
|
||||
"POT-Creation-Date: 2017-10-20 19:04+0200\n"
|
||||
"POT-Creation-Date: 2020-03-27 21:58+0100\n"
|
||||
"PO-Revision-Date: 2019-03-24 11:37+0100\n"
|
||||
"Last-Translator: Milo Ivir <mail@milotype.de>\n"
|
||||
"Language-Team: \n"
|
||||
@@ -20,14 +20,14 @@ msgstr ""
|
||||
#. "English Definition (Dear translator: This file will never be visible to the user! It should only serve as a tool for you, the translator. Nothing more.)"
|
||||
msgid "Term (Dear translator: This file will never be visible to the user!)"
|
||||
msgstr ""
|
||||
"Izraz (Dragi prevoditelji: ova datoteka nikada neće biti prikazana "
|
||||
"korisniku programa!)"
|
||||
"Izraz (Dragi prevoditelji: ova datoteka nikada neće biti prikazana korisniku "
|
||||
"programa!)"
|
||||
|
||||
#. "A detailed record of money spent and received"
|
||||
msgid "account"
|
||||
msgstr "konto"
|
||||
|
||||
#. "-"
|
||||
#. "An alphanumerical key of an account in GnuCash, not at the bank, can be used to sort. Some templates provide them or the user can enter them."
|
||||
msgid "account code"
|
||||
msgstr "šifra konta"
|
||||
|
||||
@@ -191,6 +191,10 @@ msgstr "radnja: prijenos"
|
||||
msgid "action: withdraw"
|
||||
msgstr "radnja: isplata"
|
||||
|
||||
#. "As in: payable aging, or: receivable aging. The aging report categorizes payables or receivables based on time buckets. This gives an overview of which bills or invoices are overdue at which time in the future. "
|
||||
msgid "aging"
|
||||
msgstr ""
|
||||
|
||||
#. "A sum of money"
|
||||
msgid "amount"
|
||||
msgstr "iznos"
|
||||
@@ -203,6 +207,16 @@ msgstr "prosjek"
|
||||
msgid "balance (noun)"
|
||||
msgstr "saldo"
|
||||
|
||||
#. "Balance brought forward - usually the first entry of an account statement containing the 'balance c/f' of the previous billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance b/f"
|
||||
msgstr "bilanciraj"
|
||||
|
||||
#. "Balance carried forward - usually the last entry of an account statement to be used as 'balance b/f' on the next billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance c/f"
|
||||
msgstr "bilanciraj"
|
||||
|
||||
#. "A written record of money received and paid out, showing the difference between the two total amounts"
|
||||
msgid "balance sheet"
|
||||
msgstr "bilanca"
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: @gnucash@\n"
|
||||
"POT-Creation-Date: 2017-10-20 19:04+0200\n"
|
||||
"POT-Creation-Date: 2020-03-27 21:58+0100\n"
|
||||
"PO-Revision-Date: 2007-07-31 22:59+0200\n"
|
||||
"Last-Translator: Kornel Tako <takokornel@gmail.com>\n"
|
||||
"Language-Team: Hungarian <gnucash-devel-request@gnucash.org>\n"
|
||||
@@ -25,7 +25,7 @@ msgstr ""
|
||||
msgid "account"
|
||||
msgstr "Számla "
|
||||
|
||||
#. "-"
|
||||
#. "An alphanumerical key of an account in GnuCash, not at the bank, can be used to sort. Some templates provide them or the user can enter them."
|
||||
msgid "account code"
|
||||
msgstr "Számla kód"
|
||||
|
||||
@@ -194,6 +194,10 @@ msgstr "Átutalás"
|
||||
msgid "action: withdraw"
|
||||
msgstr "Végrehajtás: kivét"
|
||||
|
||||
#. "As in: payable aging, or: receivable aging. The aging report categorizes payables or receivables based on time buckets. This gives an overview of which bills or invoices are overdue at which time in the future. "
|
||||
msgid "aging"
|
||||
msgstr ""
|
||||
|
||||
#. "A sum of money"
|
||||
msgid "amount"
|
||||
msgstr "Összeg"
|
||||
@@ -206,6 +210,16 @@ msgstr "Átlag"
|
||||
msgid "balance (noun)"
|
||||
msgstr "Egyenleg "
|
||||
|
||||
#. "Balance brought forward - usually the first entry of an account statement containing the 'balance c/f' of the previous billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance b/f"
|
||||
msgstr "Kiegyenlítés..."
|
||||
|
||||
#. "Balance carried forward - usually the last entry of an account statement to be used as 'balance b/f' on the next billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance c/f"
|
||||
msgstr "Kiegyenlítés..."
|
||||
|
||||
#. "A written record of money received and paid out, showing the difference between the two total amounts"
|
||||
msgid "balance sheet"
|
||||
msgstr "Mérleg"
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnucash-glossary 1.7.4\n"
|
||||
"POT-Creation-Date: 2017-10-20 19:04+0200\n"
|
||||
"POT-Creation-Date: 2020-03-27 21:58+0100\n"
|
||||
"PO-Revision-Date: 2004-01-31 15:33+0100\n"
|
||||
"Last-Translator: Lorenzo Cappelletti <lorenzo.cappelletti@email.it>\n"
|
||||
"Language-Team: Italian <tp@lists.linux.it>\n"
|
||||
@@ -29,7 +29,7 @@ msgstr ""
|
||||
msgid "account"
|
||||
msgstr "conto"
|
||||
|
||||
#. "-"
|
||||
#. "An alphanumerical key of an account in GnuCash, not at the bank, can be used to sort. Some templates provide them or the user can enter them."
|
||||
msgid "account code"
|
||||
msgstr "numero conto"
|
||||
|
||||
@@ -200,6 +200,10 @@ msgstr "operazione:"
|
||||
msgid "action: withdraw"
|
||||
msgstr "operazione: prelievo"
|
||||
|
||||
#. "As in: payable aging, or: receivable aging. The aging report categorizes payables or receivables based on time buckets. This gives an overview of which bills or invoices are overdue at which time in the future. "
|
||||
msgid "aging"
|
||||
msgstr ""
|
||||
|
||||
#. "A sum of money"
|
||||
msgid "amount"
|
||||
msgstr "importo, ammontare, totale, competenze"
|
||||
@@ -212,6 +216,16 @@ msgstr "media"
|
||||
msgid "balance (noun)"
|
||||
msgstr "saldo, pareggio"
|
||||
|
||||
#. "Balance brought forward - usually the first entry of an account statement containing the 'balance c/f' of the previous billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance b/f"
|
||||
msgstr "essere in pareggio, pareggiare, saldare, chiudere i conti, quadrare"
|
||||
|
||||
#. "Balance carried forward - usually the last entry of an account statement to be used as 'balance b/f' on the next billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance c/f"
|
||||
msgstr "essere in pareggio, pareggiare, saldare, chiudere i conti, quadrare"
|
||||
|
||||
#. "A written record of money received and paid out, showing the difference between the two total amounts"
|
||||
msgid "balance sheet"
|
||||
msgstr "bilancio"
|
||||
|
||||
@@ -5,7 +5,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: lt\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-10-20 19:04+0200\n"
|
||||
"POT-Creation-Date: 2020-03-27 21:58+0100\n"
|
||||
"PO-Revision-Date: 2011-08-28 20:55+0300\n"
|
||||
"Last-Translator: Aurimas Fišeras <aurimas@members.fsf.org>\n"
|
||||
"Language-Team: komp_lt@konf.lt\n"
|
||||
@@ -26,7 +26,7 @@ msgstr ""
|
||||
msgid "account"
|
||||
msgstr "sąskaita"
|
||||
|
||||
#. "-"
|
||||
#. "An alphanumerical key of an account in GnuCash, not at the bank, can be used to sort. Some templates provide them or the user can enter them."
|
||||
msgid "account code"
|
||||
msgstr "sąskaitos kodas"
|
||||
|
||||
@@ -194,6 +194,10 @@ msgstr "veiksmas: elektroninis"
|
||||
msgid "action: withdraw"
|
||||
msgstr "veiksmas: išimti"
|
||||
|
||||
#. "As in: payable aging, or: receivable aging. The aging report categorizes payables or receivables based on time buckets. This gives an overview of which bills or invoices are overdue at which time in the future. "
|
||||
msgid "aging"
|
||||
msgstr ""
|
||||
|
||||
#. "A sum of money"
|
||||
msgid "amount"
|
||||
msgstr "suma"
|
||||
@@ -206,6 +210,16 @@ msgstr "vidurkis"
|
||||
msgid "balance (noun)"
|
||||
msgstr "balansas (daiktavardis)"
|
||||
|
||||
#. "Balance brought forward - usually the first entry of an account statement containing the 'balance c/f' of the previous billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance b/f"
|
||||
msgstr "balansuoti"
|
||||
|
||||
#. "Balance carried forward - usually the last entry of an account statement to be used as 'balance b/f' on the next billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance c/f"
|
||||
msgstr "balansuoti"
|
||||
|
||||
#. "A written record of money received and paid out, showing the difference between the two total amounts"
|
||||
msgid "balance sheet"
|
||||
msgstr "balansas"
|
||||
|
||||
@@ -10,7 +10,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnucash-glossary 0.1\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-10-20 19:04+0200\n"
|
||||
"POT-Creation-Date: 2020-03-27 21:58+0100\n"
|
||||
"PO-Revision-Date: 2018-02-16 15:32+0100\n"
|
||||
"Last-Translator: John Erling Blad <jeblad@gmail.com>\n"
|
||||
"Language-Team: Norwegian/Bokmaal <i18n-nb@lister.ping.uio.no>\n"
|
||||
@@ -28,7 +28,7 @@ msgstr ""
|
||||
msgid "account"
|
||||
msgstr "konto"
|
||||
|
||||
#. "-"
|
||||
#. "An alphanumerical key of an account in GnuCash, not at the bank, can be used to sort. Some templates provide them or the user can enter them."
|
||||
msgid "account code"
|
||||
msgstr "kontokode"
|
||||
|
||||
@@ -192,6 +192,10 @@ msgstr ""
|
||||
msgid "action: withdraw"
|
||||
msgstr "handling: bankuttak"
|
||||
|
||||
#. "As in: payable aging, or: receivable aging. The aging report categorizes payables or receivables based on time buckets. This gives an overview of which bills or invoices are overdue at which time in the future. "
|
||||
msgid "aging"
|
||||
msgstr ""
|
||||
|
||||
#. "A sum of money"
|
||||
msgid "amount"
|
||||
msgstr "beløp"
|
||||
@@ -204,6 +208,16 @@ msgstr "gjennomsnitt"
|
||||
msgid "balance (noun)"
|
||||
msgstr "saldo (substantiv)"
|
||||
|
||||
#. "Balance brought forward - usually the first entry of an account statement containing the 'balance c/f' of the previous billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance b/f"
|
||||
msgstr "balanser, til"
|
||||
|
||||
#. "Balance carried forward - usually the last entry of an account statement to be used as 'balance b/f' on the next billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance c/f"
|
||||
msgstr "balanser, til"
|
||||
|
||||
#. "A written record of money received and paid out, showing the difference between the two total amounts"
|
||||
msgid "balance sheet"
|
||||
msgstr "balanse regnskap"
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: GNUCasg 1.9.4 svn\n"
|
||||
"POT-Creation-Date: 2017-10-20 19:04+0200\n"
|
||||
"POT-Creation-Date: 2020-03-27 21:58+0100\n"
|
||||
"PO-Revision-Date: 2006-04-16 20:08+0200\n"
|
||||
"Last-Translator: Bernard Meens <meensb@xs4all.nl>\n"
|
||||
"Language-Team: NONE\n"
|
||||
@@ -22,7 +22,7 @@ msgstr "Begrip"
|
||||
msgid "account"
|
||||
msgstr "dagboek"
|
||||
|
||||
#. "-"
|
||||
#. "An alphanumerical key of an account in GnuCash, not at the bank, can be used to sort. Some templates provide them or the user can enter them."
|
||||
msgid "account code"
|
||||
msgstr "dagboekcode"
|
||||
|
||||
@@ -191,6 +191,10 @@ msgstr "overboeking"
|
||||
msgid "action: withdraw"
|
||||
msgstr "opname"
|
||||
|
||||
#. "As in: payable aging, or: receivable aging. The aging report categorizes payables or receivables based on time buckets. This gives an overview of which bills or invoices are overdue at which time in the future. "
|
||||
msgid "aging"
|
||||
msgstr ""
|
||||
|
||||
#. "A sum of money"
|
||||
msgid "amount"
|
||||
msgstr "bedrag"
|
||||
@@ -203,6 +207,16 @@ msgstr "gemiddelde"
|
||||
msgid "balance (noun)"
|
||||
msgstr "saldo"
|
||||
|
||||
#. "Balance brought forward - usually the first entry of an account statement containing the 'balance c/f' of the previous billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance b/f"
|
||||
msgstr "balanceren"
|
||||
|
||||
#. "Balance carried forward - usually the last entry of an account statement to be used as 'balance b/f' on the next billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance c/f"
|
||||
msgstr "balanceren"
|
||||
|
||||
#. "A written record of money received and paid out, showing the difference between the two total amounts"
|
||||
msgid "balance sheet"
|
||||
msgstr "balans"
|
||||
|
||||
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: GnuCash 2.2.x\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2017-10-20 19:04+0200\n"
|
||||
"POT-Creation-Date: 2020-03-27 21:58+0100\n"
|
||||
"PO-Revision-Date: 2010-09-06 12:20+0200\n"
|
||||
"Last-Translator: Radzisław Galler <rgaller@gazeta.pl>\n"
|
||||
"Language-Team: Polish <translators@gnomepl.org>\n"
|
||||
@@ -24,7 +24,7 @@ msgstr ""
|
||||
msgid "account"
|
||||
msgstr "konto"
|
||||
|
||||
#. "-"
|
||||
#. "An alphanumerical key of an account in GnuCash, not at the bank, can be used to sort. Some templates provide them or the user can enter them."
|
||||
msgid "account code"
|
||||
msgstr "kod konta"
|
||||
|
||||
@@ -193,6 +193,10 @@ msgstr "akcja: powiąż"
|
||||
msgid "action: withdraw"
|
||||
msgstr "akcja: wypłać"
|
||||
|
||||
#. "As in: payable aging, or: receivable aging. The aging report categorizes payables or receivables based on time buckets. This gives an overview of which bills or invoices are overdue at which time in the future. "
|
||||
msgid "aging"
|
||||
msgstr ""
|
||||
|
||||
#. "A sum of money"
|
||||
msgid "amount"
|
||||
msgstr "kwota"
|
||||
@@ -205,6 +209,16 @@ msgstr "średnia"
|
||||
msgid "balance (noun)"
|
||||
msgstr "saldo"
|
||||
|
||||
#. "Balance brought forward - usually the first entry of an account statement containing the 'balance c/f' of the previous billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance b/f"
|
||||
msgstr "zbilansuj"
|
||||
|
||||
#. "Balance carried forward - usually the last entry of an account statement to be used as 'balance b/f' on the next billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance c/f"
|
||||
msgstr "zbilansuj"
|
||||
|
||||
#. "A written record of money received and paid out, showing the difference between the two total amounts"
|
||||
msgid "balance sheet"
|
||||
msgstr "bilans"
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnucash-2.4\n"
|
||||
"POT-Creation-Date: 2017-10-20 19:04+0200\n"
|
||||
"POT-Creation-Date: 2020-03-27 21:58+0100\n"
|
||||
"PO-Revision-Date: 2018-10-09 09:47+0100\n"
|
||||
"Last-Translator: Tiago Neiva <tneiva@gmail.com>\n"
|
||||
"Language-Team: Portuguese <translation-team-pt@lists.sourceforge.net>\n"
|
||||
@@ -27,7 +27,7 @@ msgstr "Termo"
|
||||
msgid "account"
|
||||
msgstr "conta"
|
||||
|
||||
#. "-"
|
||||
#. "An alphanumerical key of an account in GnuCash, not at the bank, can be used to sort. Some templates provide them or the user can enter them."
|
||||
msgid "account code"
|
||||
msgstr "código de conta"
|
||||
|
||||
@@ -191,6 +191,10 @@ msgstr "transferência electrónica"
|
||||
msgid "action: withdraw"
|
||||
msgstr "levantamento"
|
||||
|
||||
#. "As in: payable aging, or: receivable aging. The aging report categorizes payables or receivables based on time buckets. This gives an overview of which bills or invoices are overdue at which time in the future. "
|
||||
msgid "aging"
|
||||
msgstr ""
|
||||
|
||||
#. "A sum of money"
|
||||
msgid "amount"
|
||||
msgstr "montante"
|
||||
@@ -203,6 +207,16 @@ msgstr "média"
|
||||
msgid "balance (noun)"
|
||||
msgstr "saldo"
|
||||
|
||||
#. "Balance brought forward - usually the first entry of an account statement containing the 'balance c/f' of the previous billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance b/f"
|
||||
msgstr "reconciliar"
|
||||
|
||||
#. "Balance carried forward - usually the last entry of an account statement to be used as 'balance b/f' on the next billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance c/f"
|
||||
msgstr "reconciliar"
|
||||
|
||||
#. "A written record of money received and paid out, showing the difference between the two total amounts"
|
||||
msgid "balance sheet"
|
||||
msgstr "balanço"
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: 1.8\n"
|
||||
"POT-Creation-Date: 2017-10-20 19:04+0200\n"
|
||||
"POT-Creation-Date: 2020-03-27 21:58+0100\n"
|
||||
"PO-Revision-Date: 2007-07-08 00:44-0300\n"
|
||||
"Last-Translator: Leonardo Ferreira Fontenelle <leo.fontenelle@gmail.com>\n"
|
||||
"Language-Team: none\n"
|
||||
@@ -27,7 +27,7 @@ msgstr "Termo (Só para completar a estatística)"
|
||||
msgid "account"
|
||||
msgstr "conta"
|
||||
|
||||
#. "-"
|
||||
#. "An alphanumerical key of an account in GnuCash, not at the bank, can be used to sort. Some templates provide them or the user can enter them."
|
||||
msgid "account code"
|
||||
msgstr "código de conta"
|
||||
|
||||
@@ -196,6 +196,10 @@ msgstr "transferência eletrônica"
|
||||
msgid "action: withdraw"
|
||||
msgstr "saque"
|
||||
|
||||
#. "As in: payable aging, or: receivable aging. The aging report categorizes payables or receivables based on time buckets. This gives an overview of which bills or invoices are overdue at which time in the future. "
|
||||
msgid "aging"
|
||||
msgstr ""
|
||||
|
||||
#. "A sum of money"
|
||||
msgid "amount"
|
||||
msgstr "quantia"
|
||||
@@ -208,6 +212,16 @@ msgstr "média"
|
||||
msgid "balance (noun)"
|
||||
msgstr "saldo"
|
||||
|
||||
#. "Balance brought forward - usually the first entry of an account statement containing the 'balance c/f' of the previous billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance b/f"
|
||||
msgstr "equilibrar"
|
||||
|
||||
#. "Balance carried forward - usually the last entry of an account statement to be used as 'balance b/f' on the next billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance c/f"
|
||||
msgstr "equilibrar"
|
||||
|
||||
#. "A written record of money received and paid out, showing the difference between the two total amounts"
|
||||
msgid "balance sheet"
|
||||
msgstr "folha de balanço"
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: ru\n"
|
||||
"POT-Creation-Date: 2017-10-20 19:04+0200\n"
|
||||
"POT-Creation-Date: 2020-03-27 21:58+0100\n"
|
||||
"PO-Revision-Date: 2008-01-30 00:10+0300\n"
|
||||
"Last-Translator: Sergey Belyashov <Sergey.Belyashov@gmail.com>\n"
|
||||
"Language-Team: russian <ru@li.org>\n"
|
||||
@@ -27,7 +27,7 @@ msgstr ""
|
||||
msgid "account"
|
||||
msgstr "счет"
|
||||
|
||||
#. "-"
|
||||
#. "An alphanumerical key of an account in GnuCash, not at the bank, can be used to sort. Some templates provide them or the user can enter them."
|
||||
msgid "account code"
|
||||
msgstr "код счета"
|
||||
|
||||
@@ -196,6 +196,10 @@ msgstr ""
|
||||
msgid "action: withdraw"
|
||||
msgstr "action: отзыв"
|
||||
|
||||
#. "As in: payable aging, or: receivable aging. The aging report categorizes payables or receivables based on time buckets. This gives an overview of which bills or invoices are overdue at which time in the future. "
|
||||
msgid "aging"
|
||||
msgstr ""
|
||||
|
||||
#. "A sum of money"
|
||||
msgid "amount"
|
||||
msgstr "сумма"
|
||||
@@ -208,6 +212,16 @@ msgstr "среднее"
|
||||
msgid "balance (noun)"
|
||||
msgstr "остаток"
|
||||
|
||||
#. "Balance brought forward - usually the first entry of an account statement containing the 'balance c/f' of the previous billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance b/f"
|
||||
msgstr "свести баланс"
|
||||
|
||||
#. "Balance carried forward - usually the last entry of an account statement to be used as 'balance b/f' on the next billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance c/f"
|
||||
msgstr "свести баланс"
|
||||
|
||||
#. "A written record of money received and paid out, showing the difference between the two total amounts"
|
||||
msgid "balance sheet"
|
||||
msgstr "балансовая ведомость"
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnucash-glossary 1.8.9\n"
|
||||
"POT-Creation-Date: 2017-10-20 19:04+0200\n"
|
||||
"POT-Creation-Date: 2020-03-27 21:58+0100\n"
|
||||
"PO-Revision-Date: 2005-04-04 10:55-0700\n"
|
||||
"Last-Translator: Steven Michael Murphy <murf@e-tools.com>\n"
|
||||
"Language-Team: Kinyarwanda <translation-team-rw@lists.sourceforge.net>\n"
|
||||
@@ -33,7 +33,7 @@ msgstr ""
|
||||
msgid "account"
|
||||
msgstr "Aderesi"
|
||||
|
||||
#. "-"
|
||||
#. "An alphanumerical key of an account in GnuCash, not at the bank, can be used to sort. Some templates provide them or the user can enter them."
|
||||
#, fuzzy
|
||||
msgid "account code"
|
||||
msgstr "Aderesi ITEGEKONGENGA"
|
||||
@@ -239,6 +239,10 @@ msgstr "Igikorwa"
|
||||
msgid "action: withdraw"
|
||||
msgstr "Igikorwa"
|
||||
|
||||
#. "As in: payable aging, or: receivable aging. The aging report categorizes payables or receivables based on time buckets. This gives an overview of which bills or invoices are overdue at which time in the future. "
|
||||
msgid "aging"
|
||||
msgstr ""
|
||||
|
||||
# sw/source\ui\table\insrc.src:DLG_INS_ROW_COL.FT_COUNT.text
|
||||
#. "A sum of money"
|
||||
#, fuzzy
|
||||
@@ -256,6 +260,16 @@ msgstr "Impuzandengo"
|
||||
msgid "balance (noun)"
|
||||
msgstr "Izina"
|
||||
|
||||
#. "Balance brought forward - usually the first entry of an account statement containing the 'balance c/f' of the previous billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance b/f"
|
||||
msgstr "Kuri"
|
||||
|
||||
#. "Balance carried forward - usually the last entry of an account statement to be used as 'balance b/f' on the next billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance c/f"
|
||||
msgstr "Kuri"
|
||||
|
||||
#. "A written record of money received and paid out, showing the difference between the two total amounts"
|
||||
#, fuzzy
|
||||
msgid "balance sheet"
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnucash-glossary\n"
|
||||
"POT-Creation-Date: 2017-10-20 19:04+0200\n"
|
||||
"POT-Creation-Date: 2020-03-27 21:58+0100\n"
|
||||
"PO-Revision-Date: 2008-11-14 21:02+0100\n"
|
||||
"Last-Translator: Zdenko Podobny <zdenop@gmail.com>\n"
|
||||
"Language-Team: Slovak <sk-i18n@lists.linux.sk>\n"
|
||||
@@ -26,7 +26,7 @@ msgstr "Termín"
|
||||
msgid "account"
|
||||
msgstr "účet"
|
||||
|
||||
#. "-"
|
||||
#. "An alphanumerical key of an account in GnuCash, not at the bank, can be used to sort. Some templates provide them or the user can enter them."
|
||||
msgid "account code"
|
||||
msgstr "účtovný kód"
|
||||
|
||||
@@ -195,6 +195,10 @@ msgstr "action: linka"
|
||||
msgid "action: withdraw"
|
||||
msgstr "action: výber"
|
||||
|
||||
#. "As in: payable aging, or: receivable aging. The aging report categorizes payables or receivables based on time buckets. This gives an overview of which bills or invoices are overdue at which time in the future. "
|
||||
msgid "aging"
|
||||
msgstr ""
|
||||
|
||||
#. "A sum of money"
|
||||
msgid "amount"
|
||||
msgstr "čiastka"
|
||||
@@ -207,6 +211,16 @@ msgstr "priemer"
|
||||
msgid "balance (noun)"
|
||||
msgstr "zostatok (podstatné meno)"
|
||||
|
||||
#. "Balance brought forward - usually the first entry of an account statement containing the 'balance c/f' of the previous billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance b/f"
|
||||
msgstr "vyrovnať"
|
||||
|
||||
#. "Balance carried forward - usually the last entry of an account statement to be used as 'balance b/f' on the next billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance c/f"
|
||||
msgstr "vyrovnať"
|
||||
|
||||
#. "A written record of money received and paid out, showing the difference between the two total amounts"
|
||||
msgid "balance sheet"
|
||||
msgstr "súvaha"
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnucash-glossary 1.9.1\n"
|
||||
"POT-Creation-Date: 2017-10-20 19:04+0200\n"
|
||||
"POT-Creation-Date: 2020-03-27 21:58+0100\n"
|
||||
"PO-Revision-Date: 2006-05-04 07:47+0200\n"
|
||||
"Last-Translator: Jonas Norling <norling@lysator.liu.se>\n"
|
||||
"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
|
||||
@@ -25,7 +25,7 @@ msgstr ""
|
||||
msgid "account"
|
||||
msgstr "konto"
|
||||
|
||||
#. "-"
|
||||
#. "An alphanumerical key of an account in GnuCash, not at the bank, can be used to sort. Some templates provide them or the user can enter them."
|
||||
msgid "account code"
|
||||
msgstr "kontokod"
|
||||
|
||||
@@ -195,6 +195,10 @@ msgstr "händelse: överför elektroniskt"
|
||||
msgid "action: withdraw"
|
||||
msgstr "händelse: uttag"
|
||||
|
||||
#. "As in: payable aging, or: receivable aging. The aging report categorizes payables or receivables based on time buckets. This gives an overview of which bills or invoices are overdue at which time in the future. "
|
||||
msgid "aging"
|
||||
msgstr ""
|
||||
|
||||
#. "A sum of money"
|
||||
msgid "amount"
|
||||
msgstr "summa"
|
||||
@@ -207,6 +211,16 @@ msgstr "medelvärde"
|
||||
msgid "balance (noun)"
|
||||
msgstr "saldo (substantiv)"
|
||||
|
||||
#. "Balance brought forward - usually the first entry of an account statement containing the 'balance c/f' of the previous billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance b/f"
|
||||
msgstr "balansera, att"
|
||||
|
||||
#. "Balance carried forward - usually the last entry of an account statement to be used as 'balance b/f' on the next billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance c/f"
|
||||
msgstr "balansera, att"
|
||||
|
||||
#. "A written record of money received and paid out, showing the difference between the two total amounts"
|
||||
msgid "balance sheet"
|
||||
msgstr "balansräkning"
|
||||
|
||||
@@ -6,7 +6,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnucash-glossary-1.9.1\n"
|
||||
"Report-Msgid-Bugs-To: bug-gnucash@gnu.org\n"
|
||||
"POT-Creation-Date: 2017-10-20 19:04+0200\n"
|
||||
"POT-Creation-Date: 2020-03-27 21:58+0100\n"
|
||||
"PO-Revision-Date: 2006-03-09 22:30+1030\n"
|
||||
"Last-Translator: Clytie Siddall <clytie@riverland.net.au>\n"
|
||||
"Language-Team: Vietnamese <gnomevi-list@lists.sourceforge.net>\n"
|
||||
@@ -25,7 +25,7 @@ msgstr "Thuật ngữ"
|
||||
msgid "account"
|
||||
msgstr "tài khoản"
|
||||
|
||||
#. "-"
|
||||
#. "An alphanumerical key of an account in GnuCash, not at the bank, can be used to sort. Some templates provide them or the user can enter them."
|
||||
msgid "account code"
|
||||
msgstr "mã tài khoản"
|
||||
|
||||
@@ -194,6 +194,10 @@ msgstr "hành động: đánh điện tiền"
|
||||
msgid "action: withdraw"
|
||||
msgstr "hành động: rút tiền"
|
||||
|
||||
#. "As in: payable aging, or: receivable aging. The aging report categorizes payables or receivables based on time buckets. This gives an overview of which bills or invoices are overdue at which time in the future. "
|
||||
msgid "aging"
|
||||
msgstr ""
|
||||
|
||||
#. "A sum of money"
|
||||
msgid "amount"
|
||||
msgstr "số tiền"
|
||||
@@ -206,6 +210,16 @@ msgstr "số trung bình"
|
||||
msgid "balance (noun)"
|
||||
msgstr "số tiền còn lại"
|
||||
|
||||
#. "Balance brought forward - usually the first entry of an account statement containing the 'balance c/f' of the previous billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance b/f"
|
||||
msgstr "cân đối"
|
||||
|
||||
#. "Balance carried forward - usually the last entry of an account statement to be used as 'balance b/f' on the next billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance c/f"
|
||||
msgstr "cân đối"
|
||||
|
||||
#. "A written record of money received and paid out, showing the difference between the two total amounts"
|
||||
msgid "balance sheet"
|
||||
msgstr "bảng cân đối tài sản"
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnucash-glossary\n"
|
||||
"POT-Creation-Date: 2017-10-20 19:04+0200\n"
|
||||
"POT-Creation-Date: 2020-03-27 21:58+0100\n"
|
||||
"PO-Revision-Date: 2010-05-05 13:47+1000\n"
|
||||
"Last-Translator: Tao Wang <dancefire@gmail.com>\n"
|
||||
"Language-Team: Simplified Chinese <LL@li.org>\n"
|
||||
@@ -25,7 +25,7 @@ msgstr "术语 (翻译人员好,这个文件将不会被最终用户所看到)
|
||||
msgid "account"
|
||||
msgstr "会计科目"
|
||||
|
||||
#. "-"
|
||||
#. "An alphanumerical key of an account in GnuCash, not at the bank, can be used to sort. Some templates provide them or the user can enter them."
|
||||
msgid "account code"
|
||||
msgstr "科目编号"
|
||||
|
||||
@@ -216,6 +216,10 @@ msgstr "操作:电报"
|
||||
msgid "action: withdraw"
|
||||
msgstr "操作:取款"
|
||||
|
||||
#. "As in: payable aging, or: receivable aging. The aging report categorizes payables or receivables based on time buckets. This gives an overview of which bills or invoices are overdue at which time in the future. "
|
||||
msgid "aging"
|
||||
msgstr ""
|
||||
|
||||
#. "A sum of money"
|
||||
msgid "amount"
|
||||
msgstr "金额"
|
||||
@@ -229,6 +233,18 @@ msgstr "平均"
|
||||
msgid "balance (noun)"
|
||||
msgstr "余额 (名词)"
|
||||
|
||||
# 安排收入与支出相等
|
||||
#. "Balance brought forward - usually the first entry of an account statement containing the 'balance c/f' of the previous billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance b/f"
|
||||
msgstr "平衡,于"
|
||||
|
||||
# 安排收入与支出相等
|
||||
#. "Balance carried forward - usually the last entry of an account statement to be used as 'balance b/f' on the next billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance c/f"
|
||||
msgstr "平衡,于"
|
||||
|
||||
# 一种记录资金收到与支付的书面记录,显示两者之间的总差额。
|
||||
#. "A written record of money received and paid out, showing the difference between the two total amounts"
|
||||
msgid "balance sheet"
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: gnucash-glossary\n"
|
||||
"POT-Creation-Date: 2017-10-20 19:04+0200\n"
|
||||
"POT-Creation-Date: 2020-03-27 21:58+0100\n"
|
||||
"PO-Revision-Date: 2011-03-10 22:11+0800\n"
|
||||
"Last-Translator: Kuang-che Wu <kcwu@csie.org>\n"
|
||||
"Language-Team: traditional Chinese <zh-l10n@linux.org.tw>\n"
|
||||
@@ -23,7 +23,7 @@ msgstr "術語"
|
||||
msgid "account"
|
||||
msgstr "科目"
|
||||
|
||||
#. "-"
|
||||
#. "An alphanumerical key of an account in GnuCash, not at the bank, can be used to sort. Some templates provide them or the user can enter them."
|
||||
msgid "account code"
|
||||
msgstr "科目代碼"
|
||||
|
||||
@@ -192,6 +192,10 @@ msgstr "動作:電報"
|
||||
msgid "action: withdraw"
|
||||
msgstr "動作:提款"
|
||||
|
||||
#. "As in: payable aging, or: receivable aging. The aging report categorizes payables or receivables based on time buckets. This gives an overview of which bills or invoices are overdue at which time in the future. "
|
||||
msgid "aging"
|
||||
msgstr ""
|
||||
|
||||
#. "A sum of money"
|
||||
msgid "amount"
|
||||
msgstr "總額"
|
||||
@@ -204,6 +208,16 @@ msgstr "平均"
|
||||
msgid "balance (noun)"
|
||||
msgstr "結餘"
|
||||
|
||||
#. "Balance brought forward - usually the first entry of an account statement containing the 'balance c/f' of the previous billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance b/f"
|
||||
msgstr "使收支平衡"
|
||||
|
||||
#. "Balance carried forward - usually the last entry of an account statement to be used as 'balance b/f' on the next billing period or page"
|
||||
#, fuzzy
|
||||
msgid "balance c/f"
|
||||
msgstr "使收支平衡"
|
||||
|
||||
#. "A written record of money received and paid out, showing the difference between the two total amounts"
|
||||
msgid "balance sheet"
|
||||
msgstr "資產負債表"
|
||||
|
||||
4144
po/kok@latin.po
4144
po/kok@latin.po
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user