static void gnc_ui_to_employee (EmployeeWindow *ew, GncEmployee *employee) { GncAddress *addr; addr = gncEmployeeGetAddr (employee); gnc_suspend_gui_refresh (); gncEmployeeBeginEdit (employee); if (ew->dialog_type == NEW_EMPLOYEE) qof_event_gen(QOF_INSTANCE(employee), QOF_EVENT_ADD, NULL); gncEmployeeSetID (employee, gtk_editable_get_chars (GTK_EDITABLE (ew->id_entry), 0, -1)); gncEmployeeSetUsername (employee, gtk_editable_get_chars (GTK_EDITABLE (ew->username_entry), 0, -1)); gncAddressSetName (addr, gtk_editable_get_chars (GTK_EDITABLE (ew->name_entry), 0, -1)); gncAddressSetAddr1 (addr, gtk_editable_get_chars (GTK_EDITABLE (ew->addr1_entry), 0, -1)); gncAddressSetAddr2 (addr, gtk_editable_get_chars (GTK_EDITABLE (ew->addr2_entry), 0, -1)); gncAddressSetAddr3 (addr, gtk_editable_get_chars (GTK_EDITABLE (ew->addr3_entry), 0, -1)); gncAddressSetAddr4 (addr, gtk_editable_get_chars (GTK_EDITABLE (ew->addr4_entry), 0, -1)); gncAddressSetPhone (addr, gtk_editable_get_chars (GTK_EDITABLE (ew->phone_entry), 0, -1)); gncAddressSetFax (addr, gtk_editable_get_chars (GTK_EDITABLE (ew->fax_entry), 0, -1)); gncAddressSetEmail (addr, gtk_editable_get_chars (GTK_EDITABLE (ew->email_entry), 0, -1)); gncEmployeeSetActive (employee, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ew->active_check))); gncEmployeeSetLanguage (employee, gtk_editable_get_chars (GTK_EDITABLE (ew->language_entry), 0, -1)); /* Parse and set the workday and rate amounts */ gncEmployeeSetWorkday (employee, gnc_amount_edit_get_amount (GNC_AMOUNT_EDIT (ew->workday_amount))); gncEmployeeSetRate (employee, gnc_amount_edit_get_amount (GNC_AMOUNT_EDIT (ew->rate_amount))); gncEmployeeSetCurrency (employee, gnc_currency_edit_get_currency (GNC_CURRENCY_EDIT (ew->currency_edit))); /* Fill in the CCard Acct */ gncEmployeeSetCCard (employee, (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ew->ccard_acct_check)) ? gnc_account_sel_get_account (GNC_ACCOUNT_SEL (ew->ccard_acct_sel)) : NULL)); gncEmployeeCommitEdit (employee); gnc_resume_gui_refresh (); }
void gnc_payment_leave_amount_cb (GtkWidget *widget, GdkEventFocus *event, PaymentWindow *pw) { gnc_numeric amount_deb, amount_cred, amount_tot; if (! pw->amount_credit_edit || ! pw->amount_debit_edit) return; /* If both credit and debit amount are entered, simplify it to either one */ amount_deb = gnc_amount_edit_get_amount (GNC_AMOUNT_EDIT (pw->amount_debit_edit)); amount_cred = gnc_amount_edit_get_amount (GNC_AMOUNT_EDIT (pw->amount_credit_edit)); amount_tot = gnc_numeric_sub (amount_cred, amount_deb, gnc_commodity_get_fraction (xaccAccountGetCommodity (pw->post_acct)), GNC_HOW_RND_ROUND_HALF_UP); gnc_ui_payment_window_set_amount (pw, amount_tot); /* Reflect if the payment could complete now */ gnc_payment_window_check_payment (pw); }
/* Copy the values in the GUI to the financial_info structure */ static void gui_to_fi(FinCalcDialog *fcd) { GtkToggleButton *toggle; gnc_numeric npp; int i; if (fcd == NULL) return; npp = gnc_amount_edit_get_amount(GNC_AMOUNT_EDIT(fcd->amounts[PAYMENT_PERIODS])); fcd->financial_info.npp = npp.num; fcd->financial_info.ir = gnc_amount_edit_get_damount(GNC_AMOUNT_EDIT(fcd->amounts[INTEREST_RATE])); fcd->financial_info.pv = gnc_amount_edit_get_damount(GNC_AMOUNT_EDIT(fcd->amounts[PRESENT_VALUE])); fcd->financial_info.pmt = gnc_amount_edit_get_damount(GNC_AMOUNT_EDIT(fcd->amounts[PERIODIC_PAYMENT])); fcd->financial_info.fv = gnc_amount_edit_get_damount(GNC_AMOUNT_EDIT(fcd->amounts[FUTURE_VALUE])); fcd->financial_info.fv = -fcd->financial_info.fv; i = gtk_combo_box_get_active(GTK_COMBO_BOX(fcd->compounding_combo)); fcd->financial_info.CF = periods[i]; i = gtk_combo_box_get_active(GTK_COMBO_BOX(fcd->payment_combo)); fcd->financial_info.PF = periods[i]; toggle = GTK_TOGGLE_BUTTON(fcd->end_of_period_radio); fcd->financial_info.bep = !gtk_toggle_button_get_active(toggle); toggle = GTK_TOGGLE_BUTTON(fcd->discrete_compounding_radio); fcd->financial_info.disc = gtk_toggle_button_get_active(toggle); fcd->financial_info.prec = gnc_locale_decimal_places (); }
static gboolean check_edit_amount (GtkWidget *dialog, GtkWidget *amount, gnc_numeric *min, gnc_numeric *max, const char * error_message) { if (!gnc_amount_edit_evaluate (GNC_AMOUNT_EDIT (amount))) { if (error_message) gnc_error_dialog (dialog, "%s", error_message); return TRUE; } /* We've got a valid-looking number; check mix/max */ if (min || max) { gnc_numeric val = gnc_amount_edit_get_amount (GNC_AMOUNT_EDIT (amount)); if ((min && gnc_numeric_compare (*min, val) > 0) || (max && gnc_numeric_compare (val, *max) > 0)) { if (error_message) gnc_error_dialog (dialog, "%s", error_message); return TRUE; } } return FALSE; }
void gnc_stock_split_assistant_finish (GtkAssistant *assistant, gpointer user_data) { StockSplitInfo *info = user_data; GList *account_commits; GList *node; gnc_numeric amount; Transaction *trans; Account *account; Split *split; time64 date; account = info->acct; g_return_if_fail (account != NULL); amount = gnc_amount_edit_get_amount (GNC_AMOUNT_EDIT (info->distribution_edit)); g_return_if_fail (!gnc_numeric_zero_p (amount)); gnc_suspend_gui_refresh (); trans = xaccMallocTransaction (gnc_get_current_book ()); xaccTransBeginEdit (trans); xaccTransSetCurrency (trans, gnc_default_currency ()); date = gnc_date_edit_get_date (GNC_DATE_EDIT (info->date_edit)); xaccTransSetDatePostedSecsNormalized (trans, date); { const char *description; description = gtk_entry_get_text (GTK_ENTRY (info->description_entry)); xaccTransSetDescription (trans, description); } split = xaccMallocSplit (gnc_get_current_book ()); xaccAccountBeginEdit (account); account_commits = g_list_prepend (NULL, account); xaccTransAppendSplit (trans, split); xaccAccountInsertSplit (account, split); xaccSplitSetAmount (split, amount); xaccSplitMakeStockSplit (split); /* Set split-action with gnc_set_num_action which is the same as * xaccSplitSetAction with these arguments */ /* Translators: This string has a disambiguation prefix */ gnc_set_num_action (NULL, split, NULL, Q_("Action Column|Split")); amount = gnc_amount_edit_get_amount (GNC_AMOUNT_EDIT (info->price_edit)); if (gnc_numeric_positive_p (amount)) { QofBook *book; GNCPrice *price; GNCPriceDB *pdb; GNCCurrencyEdit *ce; Timespec ts; ce = GNC_CURRENCY_EDIT (info->price_currency_edit); ts.tv_sec = date; ts.tv_nsec = 0; price = gnc_price_create (gnc_get_current_book ()); gnc_price_begin_edit (price); gnc_price_set_commodity (price, xaccAccountGetCommodity (account)); gnc_price_set_currency (price, gnc_currency_edit_get_currency (ce)); gnc_price_set_time (price, ts); gnc_price_set_source (price, PRICE_SOURCE_STOCK_SPLIT); gnc_price_set_typestr (price, PRICE_TYPE_UNK); gnc_price_set_value (price, amount); gnc_price_commit_edit (price); book = gnc_get_current_book (); pdb = gnc_pricedb_get_db (book); if (!gnc_pricedb_add_price (pdb, price)) gnc_error_dialog (info->window, "%s", _("Error adding price.")); } amount = gnc_amount_edit_get_amount (GNC_AMOUNT_EDIT (info->cash_edit)); if (gnc_numeric_positive_p (amount)) { const char *memo; memo = gtk_entry_get_text (GTK_ENTRY (info->memo_entry)); /* asset split */ account = gnc_tree_view_account_get_selected_account (GNC_TREE_VIEW_ACCOUNT(info->asset_tree)); split = xaccMallocSplit (gnc_get_current_book ()); xaccAccountBeginEdit (account); account_commits = g_list_prepend (account_commits, account); xaccAccountInsertSplit (account, split); xaccTransAppendSplit (trans, split); xaccSplitSetAmount (split, amount); xaccSplitSetValue (split, amount); xaccSplitSetMemo (split, memo); /* income split */ account = gnc_tree_view_account_get_selected_account (GNC_TREE_VIEW_ACCOUNT(info->income_tree)); split = xaccMallocSplit (gnc_get_current_book ()); xaccAccountBeginEdit (account); account_commits = g_list_prepend (account_commits, account); xaccAccountInsertSplit (account, split); xaccTransAppendSplit (trans, split); xaccSplitSetAmount (split, gnc_numeric_neg (amount)); xaccSplitSetValue (split, gnc_numeric_neg (amount)); xaccSplitSetMemo (split, memo); } xaccTransCommitEdit (trans); for (node = account_commits; node; node = node->next) xaccAccountCommitEdit (node->data); g_list_free (account_commits); gnc_resume_gui_refresh (); gnc_close_gui_component_by_data (ASSISTANT_STOCK_SPLIT_CM_CLASS, info); }
static void gnc_ui_to_customer (CustomerWindow *cw, GncCustomer *cust) { GtkTextBuffer* text_buffer; GtkTextIter start, end; gchar *text; GncAddress *addr, *shipaddr; addr = gncCustomerGetAddr (cust); shipaddr = gncCustomerGetShipAddr (cust); gnc_suspend_gui_refresh (); gncCustomerBeginEdit (cust); if (cw->dialog_type == NEW_CUSTOMER) qof_event_gen(QOF_INSTANCE(cust), QOF_EVENT_ADD, NULL); gncCustomerSetID (cust, gtk_editable_get_chars (GTK_EDITABLE (cw->id_entry), 0, -1)); gncCustomerSetName (cust, gtk_editable_get_chars (GTK_EDITABLE (cw->company_entry), 0, -1)); gncAddressSetName (addr, gtk_editable_get_chars (GTK_EDITABLE (cw->name_entry), 0, -1)); gncAddressSetAddr1 (addr, gtk_editable_get_chars (GTK_EDITABLE (cw->addr1_entry), 0, -1)); gncAddressSetAddr2 (addr, gtk_editable_get_chars (GTK_EDITABLE (cw->addr2_entry), 0, -1)); gncAddressSetAddr3 (addr, gtk_editable_get_chars (GTK_EDITABLE (cw->addr3_entry), 0, -1)); gncAddressSetAddr4 (addr, gtk_editable_get_chars (GTK_EDITABLE (cw->addr4_entry), 0, -1)); gncAddressSetPhone (addr, gtk_editable_get_chars (GTK_EDITABLE (cw->phone_entry), 0, -1)); gncAddressSetFax (addr, gtk_editable_get_chars (GTK_EDITABLE (cw->fax_entry), 0, -1)); gncAddressSetEmail (addr, gtk_editable_get_chars (GTK_EDITABLE (cw->email_entry), 0, -1)); gncAddressSetName (shipaddr, gtk_editable_get_chars (GTK_EDITABLE (cw->shipname_entry), 0, -1)); gncAddressSetAddr1 (shipaddr, gtk_editable_get_chars (GTK_EDITABLE (cw->shipaddr1_entry), 0, -1)); gncAddressSetAddr2 (shipaddr, gtk_editable_get_chars (GTK_EDITABLE (cw->shipaddr2_entry), 0, -1)); gncAddressSetAddr3 (shipaddr, gtk_editable_get_chars (GTK_EDITABLE (cw->shipaddr3_entry), 0, -1)); gncAddressSetAddr4 (shipaddr, gtk_editable_get_chars (GTK_EDITABLE (cw->shipaddr4_entry), 0, -1)); gncAddressSetPhone (shipaddr, gtk_editable_get_chars (GTK_EDITABLE (cw->shipphone_entry), 0, -1)); gncAddressSetFax (shipaddr, gtk_editable_get_chars (GTK_EDITABLE (cw->shipfax_entry), 0, -1)); gncAddressSetEmail (shipaddr, gtk_editable_get_chars (GTK_EDITABLE (cw->shipemail_entry), 0, -1)); gncCustomerSetActive (cust, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (cw->active_check))); gncCustomerSetTaxIncluded (cust, cw->taxincluded); text_buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW(cw->notes_text)); gtk_text_buffer_get_bounds (text_buffer, &start, &end); text = gtk_text_buffer_get_text (text_buffer, &start, &end, FALSE); gncCustomerSetNotes (cust, text); /* Parse and set the currency, terms, discount, and credit amounts */ gncCustomerSetCurrency (cust, gnc_currency_edit_get_currency (GNC_CURRENCY_EDIT (cw->currency_edit))); gncCustomerSetTerms (cust, cw->terms); gncCustomerSetDiscount (cust, gnc_amount_edit_get_amount (GNC_AMOUNT_EDIT (cw->discount_amount))); gncCustomerSetCredit (cust, gnc_amount_edit_get_amount (GNC_AMOUNT_EDIT (cw->credit_amount))); gncCustomerSetTaxTableOverride (cust, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (cw->taxtable_check))); gncCustomerSetTaxTable (cust, cw->taxtable); gncCustomerCommitEdit (cust); gnc_resume_gui_refresh (); }
static gboolean gnc_payment_window_check_payment (PaymentWindow *pw) { const char *conflict_msg = NULL; Account *post, *acc; gnc_numeric amount_deb, amount_cred; gboolean enable_xfer_acct = TRUE; GtkTreeSelection *selection; if (!pw) return FALSE; /* Verify the "post" account */ if (!pw->post_acct) { conflict_msg = _("You must enter a valid account name for posting."); goto update_cleanup; } /* Verify the user has selected an owner */ gnc_owner_get_owner (pw->owner_choice, &(pw->owner)); if (!gncOwnerIsValid(&pw->owner)) { conflict_msg = _("You must select a company for payment processing."); goto update_cleanup; } /* Test the total amount */ amount_deb = gnc_amount_edit_get_amount (GNC_AMOUNT_EDIT (pw->amount_debit_edit)); amount_cred = gnc_amount_edit_get_amount (GNC_AMOUNT_EDIT (pw->amount_credit_edit)); pw->amount_tot = gnc_numeric_sub (amount_cred, amount_deb, gnc_commodity_get_fraction (xaccAccountGetCommodity (pw->post_acct)), GNC_HOW_RND_ROUND_HALF_UP); if (gnc_numeric_check (pw->amount_tot) || gnc_numeric_zero_p (pw->amount_tot)) { enable_xfer_acct = FALSE; } else { /* Verify the user has selected a transfer account */ pw->xfer_acct = gnc_tree_view_account_get_selected_account (GNC_TREE_VIEW_ACCOUNT(pw->acct_tree)); if (!pw->xfer_acct) { conflict_msg = _("You must select a transfer account from the account tree."); } } update_cleanup: gtk_widget_set_sensitive (pw->acct_tree, enable_xfer_acct); /* Check if there are issues preventing a successful payment */ gtk_widget_set_tooltip_text (pw->payment_warning, conflict_msg); if (conflict_msg) { gtk_widget_show (pw->payment_warning); gtk_widget_set_sensitive (pw->ok_button, FALSE); return FALSE; } else { gtk_widget_hide (pw->payment_warning); gtk_widget_set_sensitive (pw->ok_button, TRUE); } return TRUE; }
void dat_add_templ_cb(GtkButton *button, gpointer user_data) { GncABTransDialog *td = user_data; GtkBuilder *builder; GtkWidget *dialog; GtkWidget *entry; gint retval; const gchar *name; GncABTransTempl *templ; struct _FindTemplData data; GtkTreeSelection *selection; GtkTreeIter cur_iter; GtkTreeIter new_iter; g_return_if_fail(td); ENTER("td=%p", td); builder = gtk_builder_new(); gnc_builder_add_from_file (builder, "dialog-ab.glade", "Template Name Dialog"); dialog = GTK_WIDGET(gtk_builder_get_object (builder, "Template Name Dialog")); entry = GTK_WIDGET(gtk_builder_get_object (builder, "template_name")); /* Suggest recipient name as name of the template */ gtk_entry_set_text(GTK_ENTRY(entry), gtk_entry_get_text(GTK_ENTRY(td->recp_name_entry))); do { retval = gtk_dialog_run(GTK_DIALOG(dialog)); if (retval != GTK_RESPONSE_OK) break; name = gtk_entry_get_text(GTK_ENTRY(entry)); if (!*name) break; data.name = name; data.pointer = NULL; gtk_tree_model_foreach(GTK_TREE_MODEL(td->template_list_store), find_templ_helper, &data); if (data.pointer) { gnc_error_dialog(dialog, "%s", _("A template with the given name already exists. " "Please enter another name.")); continue; } /* Create a new template */ templ = gnc_ab_trans_templ_new_full( name, gtk_entry_get_text(GTK_ENTRY(td->recp_name_entry)), gtk_entry_get_text(GTK_ENTRY(td->recp_account_entry)), gtk_entry_get_text(GTK_ENTRY(td->recp_bankcode_entry)), gnc_amount_edit_get_amount(GNC_AMOUNT_EDIT(td->amount_edit)), gtk_entry_get_text(GTK_ENTRY(td->purpose_entry)), gtk_entry_get_text (GTK_ENTRY(td->purpose_cont_entry))); /* Insert it, either after the selected one or at the end */ selection = gtk_tree_view_get_selection(td->template_gtktreeview); if (gtk_tree_selection_get_selected(selection, NULL, &cur_iter)) { gtk_list_store_insert_after(td->template_list_store, &new_iter, &cur_iter); } else { gtk_list_store_append(td->template_list_store, &new_iter); } gtk_list_store_set(td->template_list_store, &new_iter, TEMPLATE_NAME, name, TEMPLATE_POINTER, templ, -1); td->templ_changed = TRUE; DEBUG("Added template with name %s", name); break; } while (TRUE); g_object_unref(G_OBJECT(builder)); gtk_widget_destroy(dialog); LEAVE(" "); }
void templ_list_row_activated_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *column, gpointer user_data) { GncABTransDialog *td = user_data; GtkTreeModel *model; GtkTreeIter iter; GncABTransTempl *templ; const gchar *old_name, *new_name; const gchar *old_account, *new_account; const gchar *old_bankcode, *new_bankcode; const gchar *old_purpose, *new_purpose; const gchar *old_purpose_cont, *new_purpose_cont; GtkWidget *amount_widget; const gchar *old_amount_text; gnc_numeric old_amount, new_amount; g_return_if_fail(td); ENTER("td=%p", td); if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(td->template_list_store), &iter, path)) { LEAVE("Could not get iter"); return; } gtk_tree_model_get(GTK_TREE_MODEL(td->template_list_store), &iter, TEMPLATE_POINTER, &templ, -1); /* Get old values */ old_name = gtk_entry_get_text(GTK_ENTRY(td->recp_name_entry)); old_account = gtk_entry_get_text(GTK_ENTRY(td->recp_account_entry)); old_bankcode = gtk_entry_get_text(GTK_ENTRY(td->recp_bankcode_entry)); old_purpose = gtk_entry_get_text(GTK_ENTRY(td->purpose_entry)); old_purpose_cont = gtk_entry_get_text(GTK_ENTRY(td->purpose_cont_entry)); amount_widget = gnc_amount_edit_gtk_entry(GNC_AMOUNT_EDIT(td->amount_edit)); old_amount_text = gtk_entry_get_text(GTK_ENTRY(amount_widget)); old_amount = gnc_amount_edit_get_amount(GNC_AMOUNT_EDIT(td->amount_edit)); /* Get new values */ new_name = gnc_ab_trans_templ_get_recp_name(templ); new_account = gnc_ab_trans_templ_get_recp_account(templ); new_bankcode = gnc_ab_trans_templ_get_recp_bankcode(templ); new_purpose = gnc_ab_trans_templ_get_purpose(templ); new_purpose_cont = gnc_ab_trans_templ_get_purpose_cont(templ); new_amount = gnc_ab_trans_templ_get_amount(templ); if (!new_name) new_name = ""; if (!new_account) new_account = ""; if (!new_bankcode) new_bankcode = ""; if (!new_purpose) new_purpose = ""; if (!new_purpose_cont) new_purpose_cont = ""; /* Check for differences to avoid overwriting entered text */ if ((*old_name && strcmp(old_name, new_name)) || (*old_account && strcmp(old_account, new_account)) || (*old_bankcode && strcmp(old_bankcode, new_bankcode)) || (*old_purpose && strcmp(old_purpose, new_purpose)) || (*old_purpose_cont && strcmp(old_purpose_cont, new_purpose_cont)) || (*old_amount_text && !gnc_numeric_equal(old_amount, new_amount))) { if (!gnc_verify_dialog( td->parent, FALSE, _("Do you really want to overwrite your changes with the " "contents of the template \"%s\"?"), gnc_ab_trans_templ_get_name(templ))) { LEAVE("aborted"); return; } } /* Fill in */ gtk_entry_set_text(GTK_ENTRY(td->recp_name_entry), new_name); gtk_entry_set_text(GTK_ENTRY(td->recp_account_entry), new_account); gtk_entry_set_text(GTK_ENTRY(td->recp_bankcode_entry), new_bankcode); gtk_entry_set_text(GTK_ENTRY(td->purpose_entry), new_purpose); gtk_entry_set_text(GTK_ENTRY(td->purpose_cont_entry), new_purpose_cont); gnc_amount_edit_set_amount(GNC_AMOUNT_EDIT(td->amount_edit), new_amount); LEAVE(" "); }
static gboolean new_tax_table_ok_cb (NewTaxTable *ntt) { TaxTableWindow *ttw; const char *name = NULL; char *message; Account *acc; gnc_numeric amount; g_return_val_if_fail (ntt, FALSE); ttw = ntt->ttw; /* Verify that we've got real, valid data */ /* verify the name, maybe */ if (ntt->new_table) { name = gtk_entry_get_text (GTK_ENTRY (ntt->name_entry)); if (name == NULL || *name == '\0') { message = _("You must provide a name for this Tax Table."); gnc_error_dialog (ntt->dialog, "%s", message); return FALSE; } if (gncTaxTableLookupByName (ttw->book, name)) { message = g_strdup_printf(_( "You must provide a unique name for this Tax Table. " "Your choice \"%s\" is already in use."), name); gnc_error_dialog (ntt->dialog, "%s", message); g_free (message); return FALSE; } } /* verify the amount. Note that negative values are allowed (required for European tax rules) */ amount = gnc_amount_edit_get_amount (GNC_AMOUNT_EDIT (ntt->amount_entry)); if (ntt->type == GNC_AMT_TYPE_PERCENT && gnc_numeric_compare (gnc_numeric_abs (amount), gnc_numeric_create (100, 1)) > 0) { message = _("Percentage amount must be between -100 and 100."); gnc_error_dialog (ntt->dialog, "%s", message); return FALSE; } /* verify the account */ acc = gnc_tree_view_account_get_selected_account (GNC_TREE_VIEW_ACCOUNT(ntt->acct_tree)); if (acc == NULL) { message = _("You must choose a Tax Account."); gnc_error_dialog (ntt->dialog, "%s", message); return FALSE; } gnc_suspend_gui_refresh (); /* Ok, it's all valid, now either change to add this thing */ if (ntt->new_table) { GncTaxTable *table = gncTaxTableCreate (ttw->book); gncTaxTableBeginEdit (table); gncTaxTableSetName (table, name); /* Reset the current table */ ttw->current_table = table; ntt->created_table = table; } else gncTaxTableBeginEdit (ttw->current_table); /* Create/edit the entry */ { GncTaxTableEntry *entry; if (ntt->entry) { entry = ntt->entry; } else { entry = gncTaxTableEntryCreate (); gncTaxTableAddEntry (ttw->current_table, entry); ttw->current_entry = entry; } gncTaxTableEntrySetAccount (entry, acc); gncTaxTableEntrySetType (entry, ntt->type); gncTaxTableEntrySetAmount (entry, amount); } /* Mark the table as changed and commit it */ gncTaxTableChanged (ttw->current_table); gncTaxTableCommitEdit (ttw->current_table); gnc_resume_gui_refresh(); return TRUE; }
void gnc_autoclear_window_ok_cb (GtkWidget *widget, AutoClearWindow *data) { GList *node, *nc_list = 0, *toclear_list = 0; gnc_numeric toclear_value; GHashTable *sack; gtk_label_set_text(data->status_label, _("Searching for splits to clear ...")); /* Value we have to reach */ toclear_value = gnc_amount_edit_get_amount(data->end_value); toclear_value = gnc_numeric_convert(toclear_value, xaccAccountGetCommoditySCU(data->account), GNC_HOW_RND_NEVER); /* Extract which splits are not cleared and compute the amount we have to clear */ for (node = xaccAccountGetSplitList(data->account); node; node = node->next) { Split *split = (Split *)node->data; char recn; gnc_numeric value; recn = xaccSplitGetReconcile (split); value = xaccSplitGetAmount (split); if (recn == NREC) nc_list = g_list_append(nc_list, split); else toclear_value = gnc_numeric_sub_fixed(toclear_value, value); } /* Pretty print information */ PINFO("Amount to clear: %s\n", gnc_numeric_to_string(toclear_value)); PINFO("Available splits:\n"); for (node = nc_list; node; node = node->next) { Split *split = (Split *)node->data; gnc_numeric value = xaccSplitGetAmount (split); PINFO(" %s\n", gnc_numeric_to_string(value)); } /* Run knapsack */ /* Entries in the hash table are: * - key = amount to which we know how to clear (freed by GHashTable) * - value = last split we used to clear this amount (not managed by GHashTable) */ PINFO("Knapsacking ...\n"); sack = g_hash_table_new_full (ght_gnc_numeric_hash, ght_gnc_numeric_equal, g_free, NULL); for (node = nc_list; node; node = node->next) { Split *split = (Split *)node->data; gnc_numeric split_value = xaccSplitGetAmount(split); GList *node; struct _sack_foreach_data_t data[1]; data->split_value = split_value; data->reachable_list = 0; PINFO(" Split value: %s\n", gnc_numeric_to_string(split_value)); /* For each value in the sack, compute a new reachable value */ g_hash_table_foreach (sack, sack_foreach_func, data); /* Add the value of the split itself to the reachable_list */ data->reachable_list = g_list_append(data->reachable_list, g_memdup(&split_value, sizeof(gnc_numeric))); /* Add everything to the sack, looking out for duplicates */ for (node = data->reachable_list; node; node = node->next) { gnc_numeric *reachable_value = node->data; Split *toinsert_split = split; PINFO(" Reachable value: %s ", gnc_numeric_to_string(*reachable_value)); /* Check if it already exists */ if (g_hash_table_lookup_extended(sack, reachable_value, NULL, NULL)) { /* If yes, we are in trouble, we reached an amount using two solutions */ toinsert_split = NULL; PINFO("dup"); } g_hash_table_insert (sack, reachable_value, toinsert_split); PINFO("\n"); } g_list_free(data->reachable_list); } /* Check solution */ PINFO("Rebuilding solution ...\n"); while (!gnc_numeric_zero_p(toclear_value)) { gpointer psplit = NULL; PINFO(" Left to clear: %s\n", gnc_numeric_to_string(toclear_value)); if (g_hash_table_lookup_extended(sack, &toclear_value, NULL, &psplit)) { if (psplit != NULL) { /* Cast the gpointer to the kind of pointer we actually need */ Split *split = (Split *)psplit; toclear_list = g_list_prepend(toclear_list, split); toclear_value = gnc_numeric_sub_fixed(toclear_value, xaccSplitGetAmount(split)); PINFO(" Cleared: %s -> %s\n", gnc_numeric_to_string(xaccSplitGetAmount(split)), gnc_numeric_to_string(toclear_value)); } else { /* We couldn't reconstruct the solution */ PINFO(" Solution not unique.\n"); gtk_label_set_text(data->status_label, _("Cannot uniquely clear splits. Found multiple possibilities.")); return; } } else { PINFO(" No solution found.\n"); gtk_label_set_text(data->status_label, _("The selected amount cannot be cleared.")); return; } } g_hash_table_destroy (sack); /* Show solution */ PINFO("Clearing splits:\n"); for (node = toclear_list; node; node = node->next) { Split *split = node->data; char recn; gnc_numeric value; recn = xaccSplitGetReconcile (split); value = xaccSplitGetAmount (split); PINFO(" %c %s\n", recn, gnc_numeric_to_string(value)); xaccSplitSetReconcile (split, CREC); } if (toclear_list == 0) PINFO(" None\n"); /* Free lists */ g_list_free(nc_list); g_list_free(toclear_list); /* Close window */ gtk_widget_destroy(data->window); g_free(data); }
/* Determine whether the value can be calculated. If it can, return * NULL. Otherwise, return a string describing the reason and the offending * entry in error_item. */ static const char * can_calc_value(FinCalcDialog *fcd, FinCalcValue value, int *error_item) { const char *missing = _("This program can only calculate one value at a time. " "You must enter values for all but one quantity."); const char *bad_exp = _("GnuCash cannot determine the value in one of the fields. " "You must enter a valid expression."); const char *string; gnc_numeric nvalue; unsigned int i; if (fcd == NULL) return NULL; /* Check for missing values */ for (i = 0; i < NUM_FIN_CALC_VALUES; i++) if (i != value) { string = gtk_entry_get_text(GTK_ENTRY(fcd->amounts[i])); if ((string == NULL) || (*string == '\0')) { *error_item = i; return missing; } if (!gnc_amount_edit_evaluate (GNC_AMOUNT_EDIT (fcd->amounts[i]))) { *error_item = i; return bad_exp; } } /* Check for zero interest */ switch (value) { case PAYMENT_PERIODS: case PRESENT_VALUE: case PERIODIC_PAYMENT: case FUTURE_VALUE: nvalue = gnc_amount_edit_get_amount (GNC_AMOUNT_EDIT (fcd->amounts[INTEREST_RATE])); if (gnc_numeric_zero_p (nvalue)) { *error_item = INTEREST_RATE; return _("The interest rate cannot be zero."); } break; default: break; } /* Check for zero payment periods */ switch (value) { case INTEREST_RATE: case PRESENT_VALUE: case PERIODIC_PAYMENT: case FUTURE_VALUE: nvalue = gnc_amount_edit_get_amount (GNC_AMOUNT_EDIT(fcd->amounts[PAYMENT_PERIODS])); if (gnc_numeric_zero_p (nvalue)) { *error_item = PAYMENT_PERIODS; return _("The number of payments cannot be zero."); } if (gnc_numeric_negative_p (nvalue)) { *error_item = PAYMENT_PERIODS; return _("The number of payments cannot be negative."); } break; default: break; } return NULL; }