/** * add the given transaction to its payee in the counters * if the transaction has no payee, add it to the blank payee * * \param transaction_number the transaction we want to work with * * \return * */ void gsb_data_payee_add_transaction_to_payee ( gint transaction_number ) { struct_payee *payee; payee = gsb_data_payee_get_structure ( gsb_data_transaction_get_party_number (transaction_number)); /* if no payee in that transaction, and it's neither a split, neither a transfer, * we work with empty_payee */ /* should not happen, this is if the transaction has a payee wich doesn't exists * we show a debug warning and get without payee */ if (!payee) { gchar *tmpstr; tmpstr = g_strdup_printf ( _("The transaction %d has a payee n°%d but it doesn't exist."), transaction_number, gsb_data_transaction_get_party_number (transaction_number)); warning_debug (tmpstr); g_free (tmpstr); payee = empty_payee; } payee -> payee_nb_transactions ++; if ( ! gsb_data_transaction_get_split_of_transaction ( transaction_number ) ) payee -> payee_balance = gsb_real_add ( payee -> payee_balance, gsb_data_transaction_get_adjusted_amount_for_currency ( transaction_number, payee_tree_currency (), -1)); }
/** * Add the given transaction to a budget in the counters if no budget * is specified, add it to the blank budget. * * \param transaction_number Transaction we want to work with. * \param budget_id Budget to add transaction into total. * \param sub_budget_id Sub-budget to add transaction into total. */ void gsb_data_budget_add_transaction_to_budget ( gint transaction_number, gint budget_id, gint sub_budget_id ) { struct_budget *budget; struct_sub_budget *sub_budget; budget = gsb_data_budget_get_structure ( budget_id ); sub_budget = gsb_data_budget_get_sub_budget_structure ( budget_id , sub_budget_id ); /* should not happen, this is if the transaction has a budget wich doesn't exist * we show a debug warning and get without budget */ if (!budget) { gchar *tmpstr; tmpstr = g_strdup_printf ( _("The transaction %d has a budget n°%d and sub-budget n°%d but they don't exist."), transaction_number, budget_id, sub_budget_id ); warning_debug (tmpstr); g_free (tmpstr); budget = empty_budget; } /* now budget is on the budget structure or on empty_budget */ if ( budget ) { budget -> budget_nb_transactions ++; if ( ! gsb_data_transaction_get_split_of_transaction ( transaction_number ) ) budget -> budget_balance = gsb_real_add ( budget -> budget_balance, gsb_data_transaction_get_adjusted_amount_for_currency ( transaction_number, budgetary_line_tree_currency (), -1)); } /* if we are on empty_budget, no sub-budget */ if (budget == empty_budget) return; if ( sub_budget ) { sub_budget -> sub_budget_nb_transactions ++; if ( ! gsb_data_transaction_get_split_of_transaction ( transaction_number ) ) sub_budget -> sub_budget_balance = gsb_real_add ( sub_budget -> sub_budget_balance, gsb_data_transaction_get_adjusted_amount_for_currency ( transaction_number, budgetary_line_tree_currency (), -1)); } else { budget -> budget_nb_direct_transactions ++; if ( ! gsb_data_transaction_get_split_of_transaction ( transaction_number ) ) budget -> budget_direct_balance = gsb_real_add ( budget -> budget_direct_balance, gsb_data_transaction_get_adjusted_amount_for_currency ( transaction_number, budgetary_line_tree_currency (), -1)); } }
/** * find the right function to sort the list and sort the 2 iters given * * \param model * \param iter_1 * \param iter_2 * \param no_sort permit to find the right function * * \return -1 if iter_1 is above iter_2 * */ gint gsb_transactions_list_sort_by_no_sort ( gint transaction_number_1, gint transaction_number_2, gint element_number ) { gchar* tmpstr; switch (element_number) { case ELEMENT_DATE: /* = 1 */ return ( gsb_transactions_list_sort_by_date ( transaction_number_1, transaction_number_2)); break; case ELEMENT_VALUE_DATE: return ( gsb_transactions_list_sort_by_value_date ( transaction_number_1, transaction_number_2)); break; case ELEMENT_PARTY: return ( gsb_transactions_list_sort_by_party ( transaction_number_1, transaction_number_2)); break; case ELEMENT_BUDGET: return ( gsb_transactions_list_sort_by_budget ( transaction_number_1, transaction_number_2)); break; case ELEMENT_CREDIT: return ( gsb_transactions_list_sort_by_credit ( transaction_number_1, transaction_number_2)); break; case ELEMENT_DEBIT: return ( gsb_transactions_list_sort_by_debit ( transaction_number_1, transaction_number_2)); break; case ELEMENT_BALANCE: /* balance, normally, shouldn't be here... in case, give back the date */ return ( gsb_transactions_list_sort_by_date ( transaction_number_1, transaction_number_2)); break; case ELEMENT_AMOUNT: return ( gsb_transactions_list_sort_by_amount ( transaction_number_1, transaction_number_2)); break; case ELEMENT_PAYMENT_TYPE: return ( gsb_transactions_list_sort_by_type ( transaction_number_1, transaction_number_2)); break; case ELEMENT_RECONCILE_NB: return ( gsb_transactions_list_sort_by_reconcile_nb ( transaction_number_1, transaction_number_2)); break; case ELEMENT_EXERCICE: return ( gsb_transactions_list_sort_by_financial_year ( transaction_number_1, transaction_number_2)); break; case ELEMENT_CATEGORY: return ( gsb_transactions_list_sort_by_category ( transaction_number_1, transaction_number_2)); break; case ELEMENT_MARK: return ( gsb_transactions_list_sort_by_mark ( transaction_number_1, transaction_number_2)); break; case ELEMENT_VOUCHER: return ( gsb_transactions_list_sort_by_voucher ( transaction_number_1, transaction_number_2)); break; case ELEMENT_NOTES: return ( gsb_transactions_list_sort_by_notes ( transaction_number_1, transaction_number_2)); break; case ELEMENT_BANK: return ( gsb_transactions_list_sort_by_bank ( transaction_number_1, transaction_number_2)); break; case ELEMENT_NO: return ( gsb_transactions_list_sort_by_no ( transaction_number_1, transaction_number_2)); break; case ELEMENT_CHQ: return ( gsb_transactions_list_sort_by_chq ( transaction_number_1, transaction_number_2)); break; default : tmpstr = g_strdup_printf ( _("ask for the sort number %d which doesn't exist... return by date"), element_number ); warning_debug (tmpstr); g_free(tmpstr); return ( gsb_transactions_list_sort_by_date ( transaction_number_1, transaction_number_2)); } }
/** * create the scheduled part : that widgets are created at the beginning * and normally never destroyed, they are showed only for * scheduled transactions * Cela ne fonctionne pas : tous les widgets sont détruits par la * fonction gsb_form_create_widgets ( ) * * \param table a GtkTable with the dimension SCHEDULED_HEIGHT*SCHEDULED_WIDTH to be filled * * \return FALSE * */ gboolean gsb_form_scheduler_create ( GtkWidget *table ) { gint row, column; struct_element *element; devel_debug (NULL); if (!table) return FALSE; /* just in case... be sure that not created */ if (scheduled_element_list) gsb_form_scheduler_free_list ( ); /* check the dimensions, * if problem give a warning message but continue the program with changing the values */ g_object_get ( G_OBJECT (table), "n-columns", &column, "n-rows", &row, NULL ); if ( column != SCHEDULED_WIDTH || row != SCHEDULED_HEIGHT ) { warning_debug ( _("gsb_form_scheduler_create is called with a bad table,\n" "the number of rows or columns is not good.\n" "The function will resize the table to the correct values but " "should check that warning.")); gtk_table_resize ( GTK_TABLE (table), SCHEDULED_HEIGHT, SCHEDULED_WIDTH ); } /* ok, now fill the form * we play with height and width, but for now it's fix : 6 columns and 1 line */ for ( row=0 ; row < SCHEDULED_HEIGHT ; row++ ) for ( column=0 ; column < SCHEDULED_WIDTH ; column++ ) { gint element_number; GtkWidget *widget = NULL; const gchar *tooltip_text = NULL; gchar *text_auto [] = { _("Manual"), _("Automatic"), NULL }; gchar *text_frequency [] = { _("Once"), _("Weekly"), _("Monthly"), _("Bimonthly"), _("Quarterly"), _("Yearly"), _("Custom"), NULL }; gchar *text_frequency_user [] = { _("Days"), _("Weeks"), _("Months"), _("Years"), NULL }; element_number = row*SCHEDULED_WIDTH + column; switch ( element_number ) { case SCHEDULED_FORM_ACCOUNT: widget = gsb_account_create_combo_list ( G_CALLBACK ( gsb_form_scheduler_change_account ), NULL, FALSE); gtk_combo_box_set_active ( GTK_COMBO_BOX (widget), 0 ); tooltip_text = _("Choose the account"); break; case SCHEDULED_FORM_AUTO: widget = gsb_combo_box_new_with_index ( text_auto, NULL, NULL ); tooltip_text = _("Automatic/manual scheduled transaction"); break; case SCHEDULED_FORM_FREQUENCY_BUTTON: widget = gsb_combo_box_new_with_index ( text_frequency, G_CALLBACK (gsb_form_scheduler_frequency_button_changed), NULL ); tooltip_text = _("Frequency"); break; case SCHEDULED_FORM_LIMIT_DATE: widget = gsb_calendar_entry_new (FALSE); g_signal_connect ( G_OBJECT (widget), "button-press-event", G_CALLBACK (gsb_form_scheduler_button_press_event), GINT_TO_POINTER (element_number)); g_signal_connect ( G_OBJECT (widget), "focus-in-event", G_CALLBACK (gsb_form_entry_get_focus), GINT_TO_POINTER (element_number)); g_signal_connect_after ( G_OBJECT (widget), "focus-out-event", G_CALLBACK (gsb_form_scheduler_entry_lose_focus), GINT_TO_POINTER (element_number)); tooltip_text = _("Limit date"); break; case SCHEDULED_FORM_FREQUENCY_USER_ENTRY: widget = gtk_entry_new (); g_signal_connect ( G_OBJECT (widget), "focus-in-event", G_CALLBACK (gsb_form_entry_get_focus), GINT_TO_POINTER (element_number)); g_signal_connect_after ( G_OBJECT (widget), "focus-out-event", G_CALLBACK (gsb_form_scheduler_entry_lose_focus), GINT_TO_POINTER (element_number)); tooltip_text = _("Own frequency"); break; case SCHEDULED_FORM_FREQUENCY_USER_BUTTON: widget = gsb_combo_box_new_with_index ( text_frequency_user, NULL, NULL ); tooltip_text = _("Custom frequency"); break; } if (!widget) continue; if (tooltip_text) gtk_widget_set_tooltip_text ( GTK_WIDGET (widget), tooltip_text); /* save the element */ element = g_malloc0 (sizeof (struct_element)); element -> element_number = element_number; element -> element_widget = widget; scheduled_element_list = g_slist_append ( scheduled_element_list, element ); /* set in the form */ gtk_table_attach ( GTK_TABLE (table), widget, column, column+1, row, row+1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 0); } gsb_form_scheduler_clean ( ); return FALSE; }