Merge branch 'maint'

This commit is contained in:
John Ralls
2020-03-29 11:54:52 -07:00
126 changed files with 120133 additions and 119856 deletions

View File

@@ -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

File diff suppressed because it is too large Load Diff

168
NEWS
View File

@@ -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.

View File

@@ -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})

View File

@@ -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(" ");
}

View File

@@ -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);

View File

@@ -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);
/*

View File

@@ -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>

View File

@@ -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));

View File

@@ -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>

View File

@@ -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,

View File

@@ -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
/** @} */

View File

@@ -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);

View File

@@ -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

View File

@@ -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);

View File

@@ -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:

View File

@@ -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)

View File

@@ -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)
{

View File

@@ -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;

View File

@@ -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
/**@}*/

View File

@@ -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)

View File

@@ -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)

View 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));
}

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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,

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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)))

View File

@@ -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)))))

View File

@@ -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

View File

@@ -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

View File

@@ -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}")

View File

@@ -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 ());
}

View File

@@ -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

View File

@@ -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:

View File

@@ -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

View File

@@ -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)
#################################################

View File

@@ -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

View File

@@ -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

4149
po/ar.po

File diff suppressed because it is too large Load Diff

4136
po/as.po

File diff suppressed because it is too large Load Diff

4010
po/az.po

File diff suppressed because it is too large Load Diff

4161
po/bg.po

File diff suppressed because it is too large Load Diff

4133
po/brx.po

File diff suppressed because it is too large Load Diff

4161
po/ca.po

File diff suppressed because it is too large Load Diff

4081
po/cs.po

File diff suppressed because it is too large Load Diff

4078
po/da.po

File diff suppressed because it is too large Load Diff

3995
po/de.po

File diff suppressed because it is too large Load Diff

4157
po/doi.po

File diff suppressed because it is too large Load Diff

4070
po/el.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

4156
po/es.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

4072
po/eu.po

File diff suppressed because it is too large Load Diff

4090
po/fa.po

File diff suppressed because it is too large Load Diff

4039
po/fi.po

File diff suppressed because it is too large Load Diff

4236
po/fr.po

File diff suppressed because it is too large Load Diff

View File

@@ -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)

View File

@@ -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 ""

View File

@@ -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 "баланс"

View File

@@ -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ó"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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" "-"

View File

@@ -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 "מאזן"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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 "балансовая ведомость"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"

View File

@@ -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 "資產負債表"

4153
po/gu.po

File diff suppressed because it is too large Load Diff

4147
po/he.po

File diff suppressed because it is too large Load Diff

4150
po/hi.po

File diff suppressed because it is too large Load Diff

3930
po/hr.po

File diff suppressed because it is too large Load Diff

4070
po/hu.po

File diff suppressed because it is too large Load Diff

4122
po/it.po

File diff suppressed because it is too large Load Diff

4156
po/ja.po

File diff suppressed because it is too large Load Diff

4133
po/kn.po

File diff suppressed because it is too large Load Diff

4068
po/ko.po

File diff suppressed because it is too large Load Diff

4136
po/kok.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

4134
po/ks.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