/** used to compare 2 iters and sort the by reconcile number first, and
 * by date and no transaction after
 * always put the white line below
 * \param model the GtkTreeModel
 * \param iter_1
 * \param iter_2
 * \return -1 if iter_1 is above iter_2
 * */
gint gsb_transactions_list_sort_by_reconcile_nb ( gint transaction_number_1,
                        gint transaction_number_2 )
{
    gint return_value;

    if ( gsb_data_transaction_get_reconcile_number ( transaction_number_1) == gsb_data_transaction_get_reconcile_number ( transaction_number_2))
		return gsb_transactions_list_sort_by_date_and_no ( transaction_number_1, transaction_number_2 );
    else
    {
	const gchar *temp_1;
	const gchar *temp_2;

	temp_1 = gsb_data_reconcile_get_name ( gsb_data_transaction_get_reconcile_number ( transaction_number_1));
	temp_2 = gsb_data_reconcile_get_name ( gsb_data_transaction_get_reconcile_number ( transaction_number_2));

	/* g_utf8_collate is said not very fast, must try with big big account to check
	 * if it's enough, for me it's ok (cedric), eventually, change with gsb_strcasecmp */
	return_value = g_utf8_collate ( g_utf8_casefold ( temp_1 ? temp_1 : "",
							  -1 ),
					g_utf8_casefold ( temp_2 ? temp_2 : "",
							  -1 ));
    }

    if ( return_value )
    	return return_value;
    else
		return gsb_transactions_list_sort_by_date_and_no ( transaction_number_1, transaction_number_2 );
}
/** used to compare 2 iters and sort the by type first, and
 * by date and no transaction after
 * always put the white line below
 * \param model the GtkTreeModel
 * \param iter_1
 * \param iter_2
 * \return -1 if iter_1 is above iter_2
 * */
gint gsb_transactions_list_sort_by_type ( gint transaction_number_1,
                        gint transaction_number_2 )
{
    gint return_value;

    /* if it's the same type, we sort by the content of the types */

    if ( gsb_data_transaction_get_method_of_payment_number ( transaction_number_1) == gsb_data_transaction_get_method_of_payment_number ( transaction_number_2))
    {
	return_value = g_utf8_collate ( g_utf8_casefold ( gsb_data_transaction_get_method_of_payment_content ( transaction_number_1) ? gsb_data_transaction_get_method_of_payment_content ( transaction_number_1) : "",
							  -1 ),
					g_utf8_casefold ( gsb_data_transaction_get_method_of_payment_content ( transaction_number_2) ? gsb_data_transaction_get_method_of_payment_content ( transaction_number_2) : "",
							  -1 ));

	if ( !return_value )
	    return gsb_transactions_list_sort_by_date_and_no ( transaction_number_1, transaction_number_2 );
    }
    else
    {
	const gchar *temp_1;
	const gchar *temp_2;

	temp_1 = gsb_data_payment_get_name (gsb_data_transaction_get_method_of_payment_number (transaction_number_1));
	temp_2 = gsb_data_payment_get_name (gsb_data_transaction_get_method_of_payment_number (transaction_number_2));

	/* g_utf8_collate is said not very fast, must try with big big account to check
	 * if it's enough, for me it's ok (cedric), eventually, change with gsb_strcasecmp */
	return_value = g_utf8_collate ( g_utf8_casefold ( temp_1 ? temp_1 : "",
							  -1 ),
					g_utf8_casefold ( temp_2 ? temp_2 : "",
							  -1 ));
    }

    if ( return_value )
	return return_value;
    else
    {
	/* 	it seems that the 2 types are different no but same spell... */

	return_value = g_utf8_collate ( g_utf8_casefold ( gsb_data_transaction_get_method_of_payment_content ( transaction_number_1)? gsb_data_transaction_get_method_of_payment_content ( transaction_number_1): "",
							  -1 ),
					g_utf8_casefold ( gsb_data_transaction_get_method_of_payment_content ( transaction_number_2)? gsb_data_transaction_get_method_of_payment_content ( transaction_number_2): "",
							  -1 ));

	if ( !return_value )
		return gsb_transactions_list_sort_by_date_and_no ( transaction_number_1, transaction_number_2 );
    }
    return return_value;
}
/** used to compare 2 iters and sort the by category first, and
 * by date and no transaction after
 * always put the white line below
 * \param model the GtkTreeModel
 * \param iter_1
 * \param iter_2
 * \return -1 if iter_1 is above iter_2
 * */
gint gsb_transactions_list_sort_by_category ( gint transaction_number_1,
                        gint transaction_number_2 )
{
    gint return_value;
    gchar *temp_1;
    gchar *temp_2;

    /** we want to take the name of the categ, so, either
     * split of transaction
     * transfer : ...
     * categ : under-categ
     * and after, we sort by str
     * */

    temp_1 = gsb_transactions_get_category_real_name ( transaction_number_1);
    temp_2 = gsb_transactions_get_category_real_name ( transaction_number_2);

    /* g_utf8_collate is said not very fast, must try with big big account to check
     * if it's enough, for me it's ok (cedric), eventually, change with gsb_strcasecmp */
    return_value = g_utf8_collate ( g_utf8_casefold ( temp_1 ? temp_1 : "",
						      -1 ),
				    g_utf8_casefold ( temp_2 ? temp_2 : "",
						      -1 ));

    g_free (temp_1);
    g_free (temp_2);

    if ( return_value )
	    return return_value;
    else
	    return gsb_transactions_list_sort_by_date_and_no ( transaction_number_1, transaction_number_2 );
}
/** used to compare 2 iters and sort the by budgetary first, and
 * by date and no transaction after
 * always put the white line below
 * \param model the GtkTreeModel
 * \param iter_1
 * \param iter_2
 * \return -1 if iter_1 is above iter_2
 * */
gint gsb_transactions_list_sort_by_budget ( gint transaction_number_1,
                        gint transaction_number_2 )
{
    gint return_value;
    gint budgetary_number_1;
    gint budgetary_number_2;
    gint sub_budgetary_number_1;
    gint sub_budgetary_number_2;

    budgetary_number_1 = gsb_data_transaction_get_budgetary_number ( transaction_number_1 );
    budgetary_number_2 = gsb_data_transaction_get_budgetary_number ( transaction_number_2 );
    sub_budgetary_number_1 = gsb_data_transaction_get_sub_budgetary_number ( transaction_number_1 );
    sub_budgetary_number_2 = gsb_data_transaction_get_sub_budgetary_number ( transaction_number_2 );

    if ( budgetary_number_1 == budgetary_number_2
	 &&
	 sub_budgetary_number_1 == sub_budgetary_number_2 )
	    return gsb_transactions_list_sort_by_date_and_no ( transaction_number_1, transaction_number_2 );
    else
    {
        const gchar *temp_1;
        const gchar *temp_2;

        temp_1 = gsb_data_budget_get_name ( budgetary_number_1,
                            sub_budgetary_number_1,
                            NULL );
        if ( temp_1 == NULL )
            return -1;

        temp_2 = gsb_data_budget_get_name ( budgetary_number_2,
                            sub_budgetary_number_2,
                            NULL);
        if ( temp_2 == NULL )
            return 1;

        /* g_utf8_collate is said not very fast, must try with big big account to check
         * if it's enough, for me it's ok (cedric), eventually, change with gsb_strcasecmp */
        return_value = g_utf8_collate ( g_utf8_casefold ( temp_1 ? temp_1 : "", -1 ),
                        g_utf8_casefold ( temp_2 ? temp_2 : "", -1 ) );
    }

    if ( return_value )
	    return return_value;
    else
	    return gsb_transactions_list_sort_by_date_and_no ( transaction_number_1, transaction_number_2 );
}
/**
 * used to compare 2 iters and sort the by date first, and no
 * or amount transaction after
 * always put the white line below
 * \param model the GtkTreeModel
 * \param iter_1
 * \param iter_2
 * \return -1 if iter_1 is above iter_2
 * */
gint gsb_transactions_list_sort_by_date ( gint transaction_number_1,
                        gint transaction_number_2 )
{
    if ( conf.transactions_list_secondary_sorting == 1 )
        return gsb_transactions_list_sort_by_date_and_amount (
                        transaction_number_1, transaction_number_2 );
    else if ( conf.transactions_list_secondary_sorting == 2 )
        return gsb_transactions_list_sort_by_date_and_party (
                        transaction_number_1, transaction_number_2 );
    else
        return gsb_transactions_list_sort_by_date_and_no ( transaction_number_1, transaction_number_2 );
}
/** used to compare 2 iters and sort the by financial_year first, and no
 * transaction after
 * always put the white line below
 * \param model the GtkTreeModel
 * \param iter_1
 * \param iter_2
 * \return -1 if iter_1 is above iter_2
 * */
gint gsb_transactions_list_sort_by_financial_year ( gint transaction_number_1,
                        gint transaction_number_2 )
{
    gint return_value;

    if ( gsb_data_transaction_get_financial_year_number ( transaction_number_1)== gsb_data_transaction_get_financial_year_number ( transaction_number_2))
		return gsb_transactions_list_sort_by_date_and_no ( transaction_number_1, transaction_number_2 );
    else
    {
	GDate *date_1;
	GDate *date_2;

	date_1 = gsb_data_fyear_get_beginning_date (gsb_data_transaction_get_financial_year_number ( transaction_number_1));
	date_2 = gsb_data_fyear_get_beginning_date (gsb_data_transaction_get_financial_year_number ( transaction_number_2));

	if ( date_1 )
	{
	    if ( date_2 )
		return_value = g_date_compare ( date_1,
						date_2 );
	    else
		return_value = 1;
	}
	else
	{
	    if ( date_2 )
		return_value = -1;
	    else
		return_value = 0;
	}
    }

    if ( return_value )
	    return return_value;
    else
		return gsb_transactions_list_sort_by_date_and_no ( transaction_number_1, transaction_number_2 );

}
/** used to compare 2 iters and sort the by amount first, and
 * by date and no transaction after
 * always put the white line below
 * \param model the GtkTreeModel
 * \param iter_1
 * \param iter_2
 * \return -1 if iter_1 is above iter_2
 * */
gint gsb_transactions_list_sort_by_amount ( gint transaction_number_1,
                        gint transaction_number_2 )
{
    gint return_value;

    /* for the amounts, we have to check also the currency */
    return_value = gsb_real_cmp ( gsb_data_transaction_get_adjusted_amount ( transaction_number_2, -1),
				  gsb_data_transaction_get_adjusted_amount ( transaction_number_1, -1));

    if ( return_value )
	    return return_value;
    else
	    return gsb_transactions_list_sort_by_date_and_no (transaction_number_1, transaction_number_2);
}
/** used to compare 2 iters and sort the by party first, and
 * by date and no transaction after
 * always put the white line below
 * \param model the GtkTreeModel
 * \param iter_1
 * \param iter_2
 * \return -1 if iter_1 is above iter_2
 * */
gint gsb_transactions_list_sort_by_party ( gint transaction_number_1,
                        gint transaction_number_2 )
{
    gint return_value;
    gint party_number_1;
    gint party_number_2;

    party_number_1 = gsb_data_transaction_get_party_number ( transaction_number_1 );
    party_number_2 = gsb_data_transaction_get_party_number ( transaction_number_2 );

    if (  party_number_1 == party_number_2 )
	    return_value = gsb_transactions_list_sort_by_date_and_no ( transaction_number_1, transaction_number_2 );
    else
    {
        const gchar *temp_1;
        const gchar *temp_2;

        temp_1 = gsb_data_payee_get_name ( party_number_1, TRUE );
        if ( temp_1 == NULL )
            return -1;

        temp_2 = gsb_data_payee_get_name ( party_number_2, TRUE );
        if ( temp_2 == NULL )
            return 1;

        /* g_utf8_collate is said not very fast, must try with big big account to check
         * if it's enough, for me it's ok (cedric), eventually, change with gsb_strcasecmp */
        return_value = g_utf8_collate ( g_utf8_casefold ( temp_1, -1 ),
                        g_utf8_casefold ( temp_2, -1 ));
    }

    if ( return_value )
        return return_value;
    else
	    return gsb_transactions_list_sort_by_date_and_no ( transaction_number_1, transaction_number_2 );
}
/** used to compare 2 iters and sort the by mark first, and
 * by date and no transaction after
 * always put the white line below
 * \param model the GtkTreeModel
 * \param iter_1
 * \param iter_2
 * \return -1 if iter_1 is above iter_2
 * */
gint gsb_transactions_list_sort_by_mark ( gint transaction_number_1,
                        gint transaction_number_2 )
{
    gint return_value;

    return_value = gsb_data_transaction_get_marked_transaction (
                        transaction_number_1)-
                        gsb_data_transaction_get_marked_transaction (
                        transaction_number_2);


    if ( return_value )
	    return return_value;
    else
		return gsb_transactions_list_sort_by_date_and_no ( transaction_number_1, transaction_number_2 );
}