mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
Merge branch 'maint'
This commit is contained in:
commit
14ea5d9751
@ -1,6 +1,6 @@
|
|||||||
from unittest import main
|
from unittest import main
|
||||||
|
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timezone, timedelta
|
||||||
|
|
||||||
from gnucash import Account, \
|
from gnucash import Account, \
|
||||||
ACCT_TYPE_RECEIVABLE, ACCT_TYPE_INCOME, ACCT_TYPE_BANK, \
|
ACCT_TYPE_RECEIVABLE, ACCT_TYPE_INCOME, ACCT_TYPE_BANK, \
|
||||||
@ -56,8 +56,15 @@ class TestBusiness(BusinessSession):
|
|||||||
self.assertEqual( NAME, self.employee.GetUsername() )
|
self.assertEqual( NAME, self.employee.GetUsername() )
|
||||||
|
|
||||||
def test_post(self):
|
def test_post(self):
|
||||||
self.assertEqual(self.today - timedelta(0, 0, self.today.microsecond),
|
utc_offset = datetime.now().astimezone().utcoffset()
|
||||||
self.invoice.GetDatePosted())
|
now = datetime.now().astimezone()
|
||||||
|
neutral_time = (now + utc_offset).astimezone(timezone.utc).replace(hour=10, minute=59, second=0, microsecond=0)
|
||||||
|
if utc_offset > timedelta(hours=13):
|
||||||
|
neutral_time -= utc_offset - timedelta(hours=13);
|
||||||
|
if utc_offset < timedelta(hours=-10):
|
||||||
|
neutral_time += timedelta(hours=-10) - utc_offset
|
||||||
|
self.assertEqual(neutral_time,
|
||||||
|
self.invoice.GetDatePosted().astimezone(timezone.utc))
|
||||||
self.assertTrue( self.invoice.IsPosted() )
|
self.assertTrue( self.invoice.IsPosted() )
|
||||||
|
|
||||||
def test_owner(self):
|
def test_owner(self):
|
||||||
|
@ -237,10 +237,10 @@ function(gnc_add_scheme_targets _TARGET)
|
|||||||
file(TO_CMAKE_PATH "$ENV{PATH}" fpath)
|
file(TO_CMAKE_PATH "$ENV{PATH}" fpath)
|
||||||
set(LIBRARY_PATH "PATH=${BINDIR_BUILD};${fpath}")
|
set(LIBRARY_PATH "PATH=${BINDIR_BUILD};${fpath}")
|
||||||
else()
|
else()
|
||||||
set (LIBRARY_PATH "LD_LIBRARY_PATH=${LIBDIR_BUILD}:${LIBDIR_BUILD}/gnucash")
|
set (LIBRARY_PATH "LD_LIBRARY_PATH=${LIBDIR_BUILD}:${LIBDIR_BUILD}/gnucash:$ENV{LD_LIBRARY_PATH}")
|
||||||
endif()
|
endif()
|
||||||
if (APPLE)
|
if (APPLE)
|
||||||
set (LIBRARY_PATH "DYLD_LIBRARY_PATH=${LIBDIR_BUILD}:${LIBDIR_BUILD}/gnucash")
|
set (LIBRARY_PATH "DYLD_LIBRARY_PATH=${LIBDIR_BUILD}:${LIBDIR_BUILD}/gnucash:$ENV{DYLD_LIBRARY_PATH}")
|
||||||
endif()
|
endif()
|
||||||
set(_GNC_MODULE_PATH "")
|
set(_GNC_MODULE_PATH "")
|
||||||
if(MINGW64)
|
if(MINGW64)
|
||||||
|
@ -9,10 +9,10 @@ function(get_guile_env)
|
|||||||
list(APPEND env "GNC_UNINSTALLED=yes")
|
list(APPEND env "GNC_UNINSTALLED=yes")
|
||||||
list(APPEND env "GNC_BUILDDIR=${CMAKE_BINARY_DIR}")
|
list(APPEND env "GNC_BUILDDIR=${CMAKE_BINARY_DIR}")
|
||||||
if (APPLE)
|
if (APPLE)
|
||||||
list(APPEND env "DYLD_LIBRARY_PATH=${_GNC_MODULE_PATH}")
|
list(APPEND env "DYLD_LIBRARY_PATH=${_GNC_MODULE_PATH}:$ENV{LD_LIBRARY_PATH}")
|
||||||
endif()
|
endif()
|
||||||
if (UNIX)
|
if (UNIX)
|
||||||
list(APPEND env LD_LIBRARY_PATH=${_GNC_MODULE_PATH})
|
list(APPEND env "LD_LIBRARY_PATH=${_GNC_MODULE_PATH}:$ENV{DYLD_LIBRARY_PATH}")
|
||||||
endif()
|
endif()
|
||||||
if (MINGW64)
|
if (MINGW64)
|
||||||
set(fpath "")
|
set(fpath "")
|
||||||
|
@ -1,6 +1,11 @@
|
|||||||
N_( "1The GnuCash online manual has lots of helpful information. \
|
N_( "1The GnuCash online manual has lots of helpful information. \
|
||||||
You can access the manual under the Help menu.")
|
You can access the manual under the Help menu.")
|
||||||
|
|
||||||
|
/* Translators: You can replace the link, if a transated page exists. */
|
||||||
|
N_( "Mailing lists are the preferred form of communication in the \
|
||||||
|
GnuCash community. For announcements of new releases, user groups etc. \
|
||||||
|
see the table at https://wiki.gnucash.org/wiki/Mailing_Lists")
|
||||||
|
|
||||||
N_( "The GnuCash developers are easy to contact. As well \
|
N_( "The GnuCash developers are easy to contact. As well \
|
||||||
as several mailing lists, you can chat to them live on IRC! \
|
as several mailing lists, you can chat to them live on IRC! \
|
||||||
Join them on #gnucash at irc.gnome.org")
|
Join them on #gnucash at irc.gnome.org")
|
||||||
|
@ -1514,7 +1514,7 @@ create_transaction(XferDialog *xferData, time64 time,
|
|||||||
xaccTransBeginEdit(trans);
|
xaccTransBeginEdit(trans);
|
||||||
|
|
||||||
xaccTransSetCurrency(trans, xferData->from_commodity);
|
xaccTransSetCurrency(trans, xferData->from_commodity);
|
||||||
xaccTransSetDatePostedSecs(trans, time);
|
xaccTransSetDatePostedSecsNormalized(trans, time);
|
||||||
|
|
||||||
/* Trans-Num or Split-Action set with gnc_set_num_action below per book
|
/* Trans-Num or Split-Action set with gnc_set_num_action below per book
|
||||||
* option */
|
* option */
|
||||||
|
@ -2450,7 +2450,7 @@ gtv_sr_begin_edit (GncTreeViewSplitReg *view, Transaction *trans)
|
|||||||
//is a new transaction and set the time to current time to show current
|
//is a new transaction and set the time to current time to show current
|
||||||
//date on new transactions
|
//date on new transactions
|
||||||
time = gnc_time (NULL);
|
time = gnc_time (NULL);
|
||||||
xaccTransSetDatePostedSecs (trans, time);
|
xaccTransSetDatePostedSecsNormalized (trans, time);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
LEAVE(" ");
|
LEAVE(" ");
|
||||||
|
@ -483,42 +483,8 @@ gnc_reconcile_view_class_init (GNCReconcileViewClass *klass)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
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
|
static void
|
||||||
gnc_reconcile_view_rec_or_unrec_split (GNCReconcileView *view, Split *split, gboolean reconcile)
|
gnc_reconcile_view_toggle_split (GNCReconcileView *view, Split *split)
|
||||||
{
|
{
|
||||||
Split *current;
|
Split *current;
|
||||||
|
|
||||||
@ -527,103 +493,20 @@ gnc_reconcile_view_rec_or_unrec_split (GNCReconcileView *view, Split *split, gbo
|
|||||||
|
|
||||||
current = g_hash_table_lookup (view->reconciled, split);
|
current = g_hash_table_lookup (view->reconciled, split);
|
||||||
|
|
||||||
if (current == NULL && reconcile)
|
if (current == NULL)
|
||||||
g_hash_table_insert (view->reconciled, split, split);
|
g_hash_table_insert (view->reconciled, split, split);
|
||||||
if ((current != NULL) && (!reconcile))
|
else
|
||||||
g_hash_table_remove (view->reconciled, split);
|
g_hash_table_remove (view->reconciled, split);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
gnc_reconcile_view_toggle_children (Account *account, GNCReconcileView *view, Split *split, gboolean reconcile)
|
|
||||||
{
|
|
||||||
GList *child_accounts, *node;
|
|
||||||
Transaction *transaction;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Need to get all splits in this transaction and identify any that are
|
|
||||||
* in the same hierarchy as the account being reconciled (not necessarily
|
|
||||||
* the account this split is from.)
|
|
||||||
*
|
|
||||||
* 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);
|
|
||||||
transaction = xaccSplitGetParent (split);
|
|
||||||
for (node = xaccTransGetSplitList (transaction); node; node = node->next)
|
|
||||||
{
|
|
||||||
Split *other_split;
|
|
||||||
Account *other_account;
|
|
||||||
GNCReconcileView *current_view;
|
|
||||||
|
|
||||||
GtkTreeModel *model;
|
|
||||||
GtkTreeIter iter;
|
|
||||||
gboolean valid;
|
|
||||||
gpointer pointer;
|
|
||||||
|
|
||||||
other_split = node->data;
|
|
||||||
other_account = xaccSplitGetAccount (other_split);
|
|
||||||
if (other_split == split)
|
|
||||||
continue;
|
|
||||||
/* Check this 'other' account is in the same hierarchy */
|
|
||||||
if (!g_list_find (child_accounts, other_account))
|
|
||||||
continue;
|
|
||||||
/* Search our sibling view for this split first. We search the
|
|
||||||
* sibling list first because that it where it is most likely to be.
|
|
||||||
*/
|
|
||||||
current_view = view->sibling;
|
|
||||||
if (!gnc_query_view_item_in_view (GNC_QUERY_VIEW (current_view), other_split))
|
|
||||||
{
|
|
||||||
/* Not in the sibling view, try this view */
|
|
||||||
current_view = view;
|
|
||||||
if (!gnc_query_view_item_in_view (GNC_QUERY_VIEW (current_view), other_split))
|
|
||||||
/* We can't find it, nothing more I can do about it */
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Found the other split. Toggle the reconciled check mark in the view... */
|
|
||||||
model = gtk_tree_view_get_model (GTK_TREE_VIEW (current_view));
|
|
||||||
valid = gtk_tree_model_get_iter_first (model, &iter);
|
|
||||||
|
|
||||||
while (valid)
|
|
||||||
{
|
|
||||||
// Walk through the list, reading each row
|
|
||||||
gtk_tree_model_get (model, &iter, REC_POINTER, &pointer, -1);
|
|
||||||
|
|
||||||
if(pointer == other_split)
|
|
||||||
{
|
|
||||||
gboolean toggled;
|
|
||||||
gtk_tree_model_get (model, &iter, REC_RECN, &toggled, -1);
|
|
||||||
if (toggled != reconcile)
|
|
||||||
gtk_list_store_set (GTK_LIST_STORE (model), &iter, REC_RECN, reconcile, -1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
valid = gtk_tree_model_iter_next (model, &iter);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ...and toggle its reconciled state in the internal hash */
|
|
||||||
gnc_reconcile_view_rec_or_unrec_split (current_view, other_split, reconcile);
|
|
||||||
}
|
|
||||||
g_list_free (child_accounts);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gnc_reconcile_view_toggle (GNCReconcileView *view, Split *split)
|
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 (GNC_IS_RECONCILE_VIEW (view));
|
||||||
g_return_if_fail (view->reconciled != NULL);
|
g_return_if_fail (view->reconciled != NULL);
|
||||||
|
|
||||||
is_reconciled = gnc_reconcile_view_toggle_split (view, split);
|
gnc_reconcile_view_toggle_split (view, split);
|
||||||
|
|
||||||
include_children = xaccAccountGetReconcileChildrenStatus (view->account);
|
|
||||||
if (include_children)
|
|
||||||
gnc_reconcile_view_toggle_children (view->account, view, split, is_reconciled);
|
|
||||||
|
|
||||||
g_signal_emit (G_OBJECT (view),
|
g_signal_emit (G_OBJECT (view),
|
||||||
reconcile_view_signals[TOGGLE_RECONCILED], 0, split);
|
reconcile_view_signals[TOGGLE_RECONCILED], 0, split);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!-- Generated with glade 3.22.1 -->
|
<!-- Generated with glade 3.22.2 -->
|
||||||
<interface>
|
<interface>
|
||||||
<requires lib="gtk+" version="3.10"/>
|
<requires lib="gtk+" version="3.10"/>
|
||||||
<object class="GtkAdjustment" id="atm_fee_adj">
|
<object class="GtkAdjustment" id="atm_fee_adj">
|
||||||
@ -94,7 +94,7 @@
|
|||||||
<property name="default_height">400</property>
|
<property name="default_height">400</property>
|
||||||
<property name="type_hint">normal</property>
|
<property name="type_hint">normal</property>
|
||||||
<signal name="response" handler="gnc_preferences_response_cb" swapped="no"/>
|
<signal name="response" handler="gnc_preferences_response_cb" swapped="no"/>
|
||||||
<child>
|
<child type="titlebar">
|
||||||
<placeholder/>
|
<placeholder/>
|
||||||
</child>
|
</child>
|
||||||
<child internal-child="vbox">
|
<child internal-child="vbox">
|
||||||
@ -2985,6 +2985,7 @@ many months before the current month:</property>
|
|||||||
<property name="text" translatable="yes">1</property>
|
<property name="text" translatable="yes">1</property>
|
||||||
<property name="adjustment">default_zoom_adj</property>
|
<property name="adjustment">default_zoom_adj</property>
|
||||||
<property name="value">1</property>
|
<property name="value">1</property>
|
||||||
|
<property name="digits">1</property>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="expand">False</property>
|
<property name="expand">False</property>
|
||||||
|
@ -939,6 +939,7 @@ csv_export_assistant_create (CsvExportInfo *info)
|
|||||||
|
|
||||||
/* Start date info */
|
/* Start date info */
|
||||||
info->csvd.start_date = gnc_date_edit_new (gnc_time (NULL), FALSE, FALSE);
|
info->csvd.start_date = gnc_date_edit_new (gnc_time (NULL), FALSE, FALSE);
|
||||||
|
gtk_widget_set_sensitive (info->csvd.start_date, FALSE);
|
||||||
hbox = GTK_WIDGET(gtk_builder_get_object (builder, "start_date_hbox"));
|
hbox = GTK_WIDGET(gtk_builder_get_object (builder, "start_date_hbox"));
|
||||||
gtk_box_pack_start (GTK_BOX(hbox), info->csvd.start_date, TRUE, TRUE, 0);
|
gtk_box_pack_start (GTK_BOX(hbox), info->csvd.start_date, TRUE, TRUE, 0);
|
||||||
gtk_widget_show (info->csvd.start_date);
|
gtk_widget_show (info->csvd.start_date);
|
||||||
@ -948,6 +949,7 @@ csv_export_assistant_create (CsvExportInfo *info)
|
|||||||
|
|
||||||
/* End date info */
|
/* End date info */
|
||||||
info->csvd.end_date = gnc_date_edit_new (gnc_time (NULL), FALSE, FALSE);
|
info->csvd.end_date = gnc_date_edit_new (gnc_time (NULL), FALSE, FALSE);
|
||||||
|
gtk_widget_set_sensitive (info->csvd.end_date, FALSE);
|
||||||
hbox = GTK_WIDGET(gtk_builder_get_object (builder, "end_date_hbox"));
|
hbox = GTK_WIDGET(gtk_builder_get_object (builder, "end_date_hbox"));
|
||||||
gtk_box_pack_start (GTK_BOX(hbox), info->csvd.end_date, TRUE, TRUE, 0);
|
gtk_box_pack_start (GTK_BOX(hbox), info->csvd.end_date, TRUE, TRUE, 0);
|
||||||
gtk_widget_show (info->csvd.end_date);
|
gtk_widget_show (info->csvd.end_date);
|
||||||
|
@ -70,6 +70,7 @@ struct _main_matcher_info
|
|||||||
GtkWidget *show_account_column;
|
GtkWidget *show_account_column;
|
||||||
GtkWidget *show_matched_info;
|
GtkWidget *show_matched_info;
|
||||||
gboolean add_toggled; // flag to indicate that add has been toggled to stop selection
|
gboolean add_toggled; // flag to indicate that add has been toggled to stop selection
|
||||||
|
gint id;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum downloaded_cols
|
enum downloaded_cols
|
||||||
@ -174,6 +175,7 @@ void gnc_gen_trans_list_delete (GNCImportMainMatcher *info)
|
|||||||
{
|
{
|
||||||
gnc_save_window_size (GNC_PREFS_GROUP, GTK_WINDOW(info->main_widget));
|
gnc_save_window_size (GNC_PREFS_GROUP, GTK_WINDOW(info->main_widget));
|
||||||
gnc_import_Settings_delete (info->user_settings);
|
gnc_import_Settings_delete (info->user_settings);
|
||||||
|
gnc_unregister_gui_component (info->id);
|
||||||
gtk_widget_destroy (GTK_WIDGET (info->main_widget));
|
gtk_widget_destroy (GTK_WIDGET (info->main_widget));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -946,7 +948,6 @@ GNCImportMainMatcher *gnc_gen_trans_list_new (GtkWidget *parent,
|
|||||||
GtkStyleContext *stylectxt;
|
GtkStyleContext *stylectxt;
|
||||||
GdkRGBA color;
|
GdkRGBA color;
|
||||||
GtkWidget *button;
|
GtkWidget *button;
|
||||||
gint id;
|
|
||||||
|
|
||||||
info = g_new0 (GNCImportMainMatcher, 1);
|
info = g_new0 (GNCImportMainMatcher, 1);
|
||||||
info->pending_matches = gnc_import_PendingMatches_new();
|
info->pending_matches = gnc_import_PendingMatches_new();
|
||||||
@ -1007,12 +1008,12 @@ GNCImportMainMatcher *gnc_gen_trans_list_new (GtkWidget *parent,
|
|||||||
g_object_unref (G_OBJECT(builder));
|
g_object_unref (G_OBJECT(builder));
|
||||||
|
|
||||||
// Register this UI, it needs to be closed when the session is closed.
|
// Register this UI, it needs to be closed when the session is closed.
|
||||||
id = gnc_register_gui_component (IMPORT_MAIN_MATCHER_CM_CLASS,
|
info->id = gnc_register_gui_component (IMPORT_MAIN_MATCHER_CM_CLASS,
|
||||||
NULL, /* no refresh handler */
|
NULL, /* no refresh handler */
|
||||||
(GNCComponentCloseHandler)gnc_gen_trans_list_delete,
|
(GNCComponentCloseHandler)gnc_gen_trans_list_delete,
|
||||||
info);
|
info);
|
||||||
// This ensure this dialog is closed when the session is closed.
|
// This ensure this dialog is closed when the session is closed.
|
||||||
gnc_gui_component_set_session (id, gnc_get_current_session());
|
gnc_gui_component_set_session (info->id, gnc_get_current_session());
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -314,7 +314,7 @@ GncDateTimeImpl::GncDateTimeImpl(const GncDateImpl& date, DayPart part) :
|
|||||||
if (offset < hours(-10))
|
if (offset < hours(-10))
|
||||||
m_time -= hours(offset.hours() + 10);
|
m_time -= hours(offset.hours() + 10);
|
||||||
if (offset > hours(13))
|
if (offset > hours(13))
|
||||||
m_time -= hours(offset.hours() - 11);
|
m_time += hours(13 - offset.hours());
|
||||||
}
|
}
|
||||||
catch(boost::gregorian::bad_year&)
|
catch(boost::gregorian::bad_year&)
|
||||||
{
|
{
|
||||||
|
@ -1506,8 +1506,8 @@ Transaction * gncInvoicePostToAccount (GncInvoice *invoice, Account *acc,
|
|||||||
|
|
||||||
/* Entered and Posted at date */
|
/* Entered and Posted at date */
|
||||||
xaccTransSetDateEnteredSecs (txn, gnc_time (NULL));
|
xaccTransSetDateEnteredSecs (txn, gnc_time (NULL));
|
||||||
xaccTransSetDatePostedSecs (txn, post_date);
|
xaccTransSetDatePostedSecsNormalized (txn, post_date);
|
||||||
gncInvoiceSetDatePosted (invoice, post_date);
|
gncInvoiceSetDatePosted (invoice, xaccTransRetDatePosted(txn));
|
||||||
|
|
||||||
xaccTransSetDateDue (txn, due_date);
|
xaccTransSetDateDue (txn, due_date);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user