28 #include <glib/gi18n.h>
32 #include "assistant-loan.h"
35 #include "SX-ttinfo.h"
36 #include "assistant-utils.h"
37 #include "gnc-amount-edit.h"
38 #include "gnc-account-sel.h"
40 #include "gnc-exp-parser.h"
41 #include "gnc-component-manager.h"
42 #include "dialog-utils.h"
46 #include "gnc-gui-query.h"
48 #include "gnc-frequency.h"
54 # include <monetary.h>
56 #define DIALOG_LOAN_ASSISTANT_CM_CLASS "assistant-loan-setup"
91 gboolean throughEscrowP;
92 gboolean specSrcAcctP;
108 char *defaultTxnMemo;
109 gboolean escrowDefault;
110 gboolean specSrcAcctDefault;
116 { N_(
"Taxes"), N_(
"Tax Payment"), TRUE, FALSE },
117 { N_(
"Insurance"), N_(
"Insurance Payment"), TRUE, FALSE },
119 { N_(
"PMI"), N_(
"PMI Payment"), TRUE, FALSE },
120 { N_(
"Other Expense"), N_(
"Miscellaneous Payment"), FALSE, FALSE },
132 GtkCheckButton *optCb;
133 GtkCheckButton *escrowCb;
141 GNC_VARIABLE_3_1 = GNC_VARIABLE,
159 GNC_IRATE_APR_WEEKLY,
160 GNC_IRATE_APR_MONTHLY,
161 GNC_IRATE_APR_QUARTERLY,
162 GNC_IRATE_APR_ANNUALLY
186 GList *loan_schedule;
199 GList *repayment_schedule;
207 int revRepayOptToColMap[ (
sizeof(REPAY_DEFAULTS)
219 GtkWidget *assistant;
235 GtkSpinButton *prmIrateSpin;
236 GtkComboBox *prmType;
237 GtkFrame *prmVarFrame;
240 GtkSpinButton *prmLengthSpin;
241 GtkComboBox *prmLengthType;
242 GtkSpinButton *prmRemainSpin;
243 GtkComboBox *prmIrateType;
247 GtkCheckButton *optEscrowCb;
248 GtkHBox *optEscrowHBox;
252 GtkEntry *repTxnName;
254 GtkEntry *repAmtEntry;
258 GtkFrame *repFreqFrame;
262 GtkEntry *payTxnName;
263 GtkEntry *payAmtEntry;
269 GtkCheckButton *payUseEscrow;
270 GtkCheckButton *paySpecSrcAcct;
271 GtkLabel *payAcctFromLabel;
272 GtkLabel *payEscToLabel;
273 GtkLabel *payEscFromLabel;
274 GtkRadioButton *payTxnFreqPartRb;
275 GtkRadioButton *payTxnFreqUniqRb;
276 GtkAlignment *payFreqAlign;
280 GtkComboBox *revRangeOpt;
281 GtkFrame *revDateFrame;
285 GtkScrolledWindow *revScrollWin;
286 GtkTreeView *revView;
310 static void loan_assistant_window_destroy_cb( GtkObject *
object, gpointer user_data );
311 static void loan_assistant_close_handler( gpointer user_data );
314 static void loan_info_prep( GtkAssistant *assistant, gpointer user_data );
315 static void loan_info_prm_type_cb( GtkWidget *w, gpointer user_data );
316 static void loan_info_calc_update_cb( GtkWidget *widget, gpointer user_data );
317 void loan_info_page_valid_cb( GtkWidget *widget, gpointer user_data );
318 static gboolean loan_info_page_complete( GtkAssistant *assistant, gpointer user_data );
319 static void loan_info_page_save( GtkAssistant *assistant, gpointer user_data );
321 static void loan_opt_prep( GtkAssistant *assistant, gpointer user_data );
322 static void loan_opt_toggled_cb( GtkToggleButton *tb, gpointer user_data );
323 static void loan_opt_consistency_cb( GtkToggleButton *tb, gpointer user_data );
324 static void loan_opt_escrow_toggle_cb( GtkToggleButton *tb, gpointer user_data );
325 static void loan_opt_escrow_toggled_cb( GtkToggleButton *tb, gpointer user_data );
326 void loan_opt_page_valid_cb (GtkWidget *widget, gpointer user_data );
327 static gboolean loan_opt_page_complete( GtkAssistant *assistant, gpointer user_data );
329 static void loan_rep_prep ( GtkAssistant *assistant, gpointer user_data );
330 void loan_rep_page_valid_cb (GtkWidget *widget, gpointer user_data );
331 static gboolean loan_rep_page_complete( GtkAssistant *assistant, gpointer user_data );
332 static void loan_rep_page_save( GtkAssistant *assistant, gpointer user_data );
334 static void loan_pay_prep ( GtkAssistant *assistant, gpointer user_data );
336 static void loan_pay_use_esc_toggle_cb( GtkToggleButton *tb, gpointer user_data );
337 static void loan_pay_spec_src_setup(
LoanAssistantData *ldd, gboolean newState );
338 static void loan_pay_spec_src_toggle_cb( GtkToggleButton *tb, gpointer user_data );
339 static void loan_pay_freq_toggle_cb( GtkToggleButton *tb, gpointer user_data );
340 static void loan_pay_page_valid_cb (GtkWidget *widget, gpointer user_data );
341 static gboolean loan_pay_complete( GtkAssistant *assistant, gpointer user_data );
342 static gboolean loan_pay_all_opt_valid ( GtkAssistant *assistant, gpointer user_data );
343 static void loan_pay_back_button_cb( GtkButton *button, gpointer user_data );
344 static void loan_pay_next_button_cb( GtkButton *button, gpointer user_data );
346 static void loan_rev_prep ( GtkAssistant *assistant, gpointer user_data );
348 static void loan_rev_range_opt_changed_cb( GtkComboBox *combo, gpointer user_data );
349 static void loan_rev_range_changed_cb(
GNCDateEdit *gde, gpointer user_data );
350 static void loan_rev_get_loan_range(
LoanAssistantData *ldd, GDate *start, GDate *end );
351 static void loan_rev_get_dates(
LoanAssistantData *ldd, GDate *start, GDate *end );
352 static void loan_rev_update_view(
LoanAssistantData *ldd, GDate *start, GDate *end );
353 static void loan_rev_sched_list_free( gpointer data, gpointer user_data );
354 static void loan_rev_hash_to_list( gpointer key, gpointer val, gpointer user_data );
355 static void loan_rev_hash_free_date_keys( gpointer key, gpointer val, gpointer user_data );
360 static float loan_apr_to_simple_formula (
float rate,
float compounding_periods);
363 static gint loan_find_ttsplit_with_acct( gconstpointer elt, gconstpointer crit );
365 static void loan_tcSX_free( gpointer data, gpointer user_data );
367 void loan_assistant_prepare( GtkAssistant *assistant, GtkWidget *page, gpointer user_data );
368 void loan_assistant_finish( GtkAssistant *gtkassistant, gpointer user_data );
369 void loan_assistant_cancel( GtkAssistant *gtkassistant, gpointer user_data );
370 void loan_assistant_close( GtkAssistant *gtkassistant, gpointer user_data );
377 loan_assistant_close_handler( gpointer user_data )
380 gtk_widget_destroy( ldd->window );
386 loan_assistant_window_destroy_cb( GtkObject *
object, gpointer user_data )
392 gnc_unregister_gui_component_by_data (DIALOG_LOAN_ASSISTANT_CM_CLASS, ldd);
400 g_date_free( ldd->ld.startDate );
401 g_date_free( ldd->ld.varStartDate );
402 recurrenceListFree(&ldd->ld.loan_schedule);
404 if ( ldd->ld.repMemo )
405 g_free( ldd->ld.repMemo );
407 for ( i = 0; i < ldd->ld.repayOptCount; i++ )
413 g_free( rod->txnMemo );
415 if ( rod->startDate )
416 g_date_free( rod->startDate );
418 if (rod->schedule != NULL)
419 recurrenceListFree(&rod->schedule);
421 g_free( ldd->ld.repayOpts[i] );
422 g_free( ldd->repayOptsUI[i] );
424 g_free( ldd->ld.repayOpts );
425 g_free( ldd->repayOptsUI );
427 if ( ldd->ld.repAmount )
428 g_free( ldd->ld.repAmount );
430 g_date_free( ldd->ld.repStartDate );
435 if ( ldd->ld.revSchedule )
437 g_list_foreach( ldd->ld.revSchedule,
438 loan_rev_sched_list_free,
440 g_list_free( ldd->ld.revSchedule );
441 ldd->ld.revSchedule = NULL;
455 loan_assistant_data_init( ldd );
457 builder = gtk_builder_new();
459 gnc_builder_add_from_file (builder ,
"assistant-loan.glade",
"len_liststore");
460 gnc_builder_add_from_file (builder ,
"assistant-loan.glade",
"range_liststore");
461 gnc_builder_add_from_file (builder ,
"assistant-loan.glade",
"type_liststore");
462 gnc_builder_add_from_file (builder ,
"assistant-loan.glade",
"rate_liststore");
464 gnc_builder_add_from_file (builder ,
"assistant-loan.glade",
"Loan-Mortgage Assistant");
465 window = GTK_WIDGET(gtk_builder_get_object (builder,
"Loan-Mortgage Assistant"));
466 ldd->window = window;
470 gnc_assistant_set_colors (GTK_ASSISTANT (ldd->window));
473 gtk_assistant_set_page_complete (GTK_ASSISTANT (window),
474 GTK_WIDGET(gtk_builder_get_object(builder,
"loan_intro_page")),
476 gtk_assistant_set_page_complete (GTK_ASSISTANT (window),
477 GTK_WIDGET(gtk_builder_get_object(builder,
"loan_options_page")),
479 gtk_assistant_set_page_complete (GTK_ASSISTANT (window),
480 GTK_WIDGET(gtk_builder_get_object(builder,
"loan_review_page")),
485 ldd->prmTable = GTK_TABLE(gtk_builder_get_object(builder,
"param_table"));
486 ldd->prmVarFrame = GTK_FRAME(gtk_builder_get_object(builder,
"type_freq_frame"));
487 ldd->prmIrateSpin = GTK_SPIN_BUTTON (gtk_builder_get_object(builder,
"irate_spin"));
488 ldd->prmType = GTK_COMBO_BOX (gtk_builder_get_object(builder,
"type_combobox"));
489 gtk_combo_box_set_active( GTK_COMBO_BOX( ldd->prmType), 0 );
490 ldd->prmLengthSpin = GTK_SPIN_BUTTON (gtk_builder_get_object(builder,
"len_spin"));
491 ldd->prmLengthType = GTK_COMBO_BOX (gtk_builder_get_object(builder,
"len_opt"));
492 gtk_combo_box_set_active( GTK_COMBO_BOX( ldd->prmLengthType), 0 );
493 ldd->prmRemainSpin = GTK_SPIN_BUTTON (gtk_builder_get_object(builder,
"rem_spin"));
494 ldd->prmIrateType = GTK_COMBO_BOX (gtk_builder_get_object(builder,
"irate_type_combobox"));
495 gtk_combo_box_set_active( GTK_COMBO_BOX( ldd->prmIrateType), 0 );
500 ldd->repTable = GTK_TABLE(gtk_builder_get_object(builder,
"repay_table"));
501 ldd->repTxnName = GTK_ENTRY(gtk_builder_get_object(builder,
"txn_title"));
502 ldd->repAmtEntry = GTK_ENTRY(gtk_builder_get_object(builder,
"amount_ent"));
503 ldd->repFreqFrame = GTK_FRAME(gtk_builder_get_object(builder,
"freq_frame"));
507 ldd->optVBox = GTK_VBOX(gtk_builder_get_object(builder,
"loan_options_page"));
508 ldd->optEscrowCb = GTK_CHECK_BUTTON(gtk_builder_get_object(builder,
"opt_escrow_cb"));
509 ldd->optEscrowHBox = GTK_HBOX(gtk_builder_get_object(builder,
"opt_escrow_hbox"));
513 ldd->payTable = GTK_TABLE(gtk_builder_get_object(builder,
"pay_table"));
514 ldd->payTxnName = GTK_ENTRY(gtk_builder_get_object(builder,
"pay_txn_title"));
515 ldd->payAmtEntry = GTK_ENTRY(gtk_builder_get_object(builder,
"pay_amt_ent"));
516 ldd->payUseEscrow = GTK_CHECK_BUTTON(gtk_builder_get_object(builder,
"pay_use_escrow"));
517 ldd->paySpecSrcAcct = GTK_CHECK_BUTTON(gtk_builder_get_object(builder,
"pay_specify_source"));
518 ldd->payAcctFromLabel = GTK_LABEL(gtk_builder_get_object(builder,
"pay_from_account_label"));
519 ldd->payEscToLabel = GTK_LABEL(gtk_builder_get_object(builder,
"pay_escrow_to_label"));
520 ldd->payEscFromLabel = GTK_LABEL(gtk_builder_get_object(builder,
"pay_escrow_from_label"));
521 ldd->payTxnFreqPartRb = GTK_RADIO_BUTTON(gtk_builder_get_object(builder,
"pay_txn_part_rb"));
522 ldd->payTxnFreqUniqRb = GTK_RADIO_BUTTON(gtk_builder_get_object(builder,
"pay_uniq_freq_rb"));
523 ldd->payFreqAlign = GTK_ALIGNMENT(gtk_builder_get_object(builder,
"pay_freq_align"));
527 ldd->revTable = GTK_TABLE(gtk_builder_get_object(builder,
"rev_date_range_table"));
528 ldd->revRangeOpt = GTK_COMBO_BOX(gtk_builder_get_object(builder,
"rev_range_opt"));
529 ldd->revDateFrame = GTK_FRAME(gtk_builder_get_object(builder,
"rev_date_frame"));
530 ldd->revScrollWin = GTK_SCROLLED_WINDOW(gtk_builder_get_object(builder,
"rev_scrollwin"));
540 GList *liabilityAcct;
543 GList *paymentFromAccts;
545 GList *paymentToAccts;
554 liabilityAcct = NULL;
555 paymentFromAccts = NULL;
556 paymentToAccts = NULL;
558 liabilityAcct = g_list_append( liabilityAcct,
560 for ( i = 0; i < fromLen; i++ )
563 = g_list_append( paymentFromAccts,
564 GINT_TO_POINTER( paymentFroms[i] ) );
566 = g_list_append( paymentToAccts,
567 GINT_TO_POINTER( paymentFroms[i] ) );
570 for ( i = 0; i < toLen; i++ )
572 paymentToAccts = g_list_append( paymentToAccts,
573 GINT_TO_POINTER( paymentTos[i] ) );
581 struct gas_in_tables_data
585 gboolean newAcctAbility;
586 int left, right, top, bottom;
587 GList *allowableAccounts;
591 { &ldd->prmAccountGAS, ldd->prmTable, TRUE, 1, 4, 0, 1, liabilityAcct },
592 { &ldd->repAssetsFromGAS, ldd->repTable, TRUE, 1, 4, 2, 3, paymentFromAccts },
593 { &ldd->repPrincToGAS, ldd->repTable, TRUE, 1, 2, 3, 4, paymentToAccts },
594 { &ldd->repIntToGAS, ldd->repTable, TRUE, 3, 4, 3, 4, paymentToAccts },
595 { &ldd->payAcctFromGAS, ldd->payTable, TRUE, 1, 2, 4, 5, paymentFromAccts },
596 { &ldd->payAcctEscToGAS, ldd->payTable, FALSE, 3, 4, 4, 5, paymentToAccts },
597 { &ldd->payAcctEscFromGAS, ldd->payTable, FALSE, 1, 2, 5, 6, paymentFromAccts },
598 { &ldd->payAcctToGAS, ldd->payTable, TRUE, 3, 4, 5, 6, paymentToAccts },
603 a = GTK_ALIGNMENT(gtk_alignment_new( 0.0, 0.5, 0.25, 1.0 ));
604 ldd->prmOrigPrincGAE = GNC_AMOUNT_EDIT(gnc_amount_edit_new());
605 gtk_container_add( GTK_CONTAINER(a), GTK_WIDGET(ldd->prmOrigPrincGAE) );
606 gtk_table_attach( ldd->prmTable, GTK_WIDGET(a),
608 GTK_EXPAND | GTK_FILL,
609 GTK_EXPAND | GTK_FILL, 2, 2 );
611 for ( i = 0; gas_data[i].loc != NULL; i++ )
615 a = GTK_ALIGNMENT(gtk_alignment_new( 0.0, 0.5, 0.25, 1.0 ));
616 gas = GNC_ACCOUNT_SEL(gnc_account_sel_new());
617 gnc_account_sel_set_new_account_ability(
618 gas, gas_data[i].newAcctAbility );
619 if ( gas_data[i].allowableAccounts != NULL )
621 gnc_account_sel_set_acct_filters(
622 gas, gas_data[i].allowableAccounts, NULL );
624 gtk_container_add( GTK_CONTAINER(a),
626 gtk_table_attach( gas_data[i].
table,
632 GTK_EXPAND | GTK_FILL,
633 GTK_EXPAND | GTK_FILL, 2, 2 );
634 *(gas_data[i].loc) = gas;
639 gtk_widget_set_sensitive( GTK_WIDGET(ldd->payAcctEscToGAS), FALSE );
640 gtk_widget_set_sensitive( GTK_WIDGET(ldd->payAcctEscFromGAS), FALSE );
645 struct gde_in_tables_data
649 int left, right, top, bottom;
653 { &ldd->prmStartDateGDE, ldd->prmTable, 1, 2, 4, 5 },
654 { &ldd->revStartDate, ldd->revTable, 1, 2, 0, 1 },
655 { &ldd->revEndDate, ldd->revTable, 1, 2, 1, 2 },
659 for ( i = 0; gde_data[i].loc != NULL; i++ )
665 gtk_table_attach( gde_data[i].
table,
666 GTK_WIDGET( *gde_data[i].loc ),
671 (GTK_EXPAND | GTK_FILL),
677 gtk_widget_set_sensitive( GTK_WIDGET(ldd->prmVarFrame), FALSE );
679 g_signal_connect( ldd->prmType,
"changed",
680 G_CALLBACK( loan_info_prm_type_cb ),
688 a = GTK_ADJUSTMENT(gtk_adjustment_new( 8.0, 0.001,
691 gtk_spin_button_set_adjustment( ldd->prmIrateSpin, a );
692 gtk_spin_button_set_value( ldd->prmIrateSpin, 8.00 );
693 gtk_spin_button_set_snap_to_ticks( ldd->prmIrateSpin, TRUE );
695 a = GTK_ADJUSTMENT(gtk_adjustment_new( 360, 1,
698 gtk_spin_button_set_adjustment( ldd->prmLengthSpin, a );
699 g_signal_connect( ldd->prmLengthSpin,
"changed",
700 G_CALLBACK( loan_info_calc_update_cb ),
702 g_signal_connect( ldd->prmStartDateGDE,
"date-changed",
703 G_CALLBACK( loan_info_calc_update_cb ),
705 g_signal_connect( ldd->prmLengthSpin,
"value-changed",
706 G_CALLBACK( loan_info_calc_update_cb ),
708 g_signal_connect( ldd->prmLengthType,
"changed",
709 G_CALLBACK( loan_info_calc_update_cb ),
712 a = GTK_ADJUSTMENT(gtk_adjustment_new( 360, 1,
715 gtk_spin_button_set_adjustment( ldd->prmRemainSpin, a );
718 g_signal_connect( ldd->optEscrowCb,
"toggled",
719 G_CALLBACK(loan_opt_escrow_toggle_cb), ldd );
720 gtk_widget_set_sensitive( GTK_WIDGET(ldd->optEscrowHBox), FALSE );
721 ldd->optEscrowGAS = GNC_ACCOUNT_SEL(gnc_account_sel_new());
722 gnc_account_sel_set_new_account_ability( ldd->optEscrowGAS, TRUE );
723 gtk_container_add( GTK_CONTAINER(ldd->optEscrowHBox),
724 GTK_WIDGET(ldd->optEscrowGAS) );
737 GtkAlignment *optAlign, *subOptAlign;
740 str = g_string_sized_new( 32 );
742 for ( i = 0; i < ldd->ld.repayOptCount; i++ )
744 rouid = ldd->repayOptsUI[i];
745 vb = GTK_VBOX(gtk_vbox_new( FALSE, 2 ));
751 g_string_printf( str, _(
"... pay \"%s\"?"),
752 rouid->optData->name );
755 gtk_check_button_new_with_label(
757 gtk_box_pack_start( GTK_BOX(vb),
758 GTK_WIDGET(rouid->optCb),
762 gtk_check_button_new_with_label(
763 _(
"via Escrow account?") ));
764 gtk_widget_set_sensitive(
765 GTK_WIDGET(rouid->escrowCb),
770 0.5, 0.5, 0.75, 1.0 ));
771 gtk_container_add( GTK_CONTAINER(subOptAlign),
772 GTK_WIDGET(rouid->escrowCb) );
773 gtk_box_pack_start( GTK_BOX(vb), GTK_WIDGET(subOptAlign),
776 g_signal_connect( rouid->optCb,
"toggled",
777 G_CALLBACK(loan_opt_toggled_cb),
779 g_signal_connect( rouid->optCb,
"toggled",
780 G_CALLBACK(loan_opt_consistency_cb),
782 g_signal_connect( rouid->escrowCb,
"toggled",
783 G_CALLBACK(loan_opt_escrow_toggled_cb),
786 optAlign = GTK_ALIGNMENT(gtk_alignment_new( 0.5, 0.5, 0.75, 1.0 ));
787 gtk_container_add( GTK_CONTAINER(optAlign),
789 gtk_box_pack_start( GTK_BOX(ldd->optVBox), GTK_WIDGET(optAlign),
791 gtk_widget_show_all( GTK_WIDGET(optAlign) );
793 g_string_free( str, TRUE );
796 g_signal_connect( ldd->payUseEscrow,
"toggled",
797 G_CALLBACK(loan_pay_use_esc_toggle_cb), ldd );
798 g_signal_connect( ldd->paySpecSrcAcct,
"toggled",
799 G_CALLBACK(loan_pay_spec_src_toggle_cb), ldd );
800 g_signal_connect( ldd->payTxnFreqUniqRb,
"toggled",
801 G_CALLBACK(loan_pay_freq_toggle_cb), ldd );
805 hbox = GTK_HBOX(gtk_builder_get_object(builder,
"type_freq_hbox"));
806 ldd->prmVarGncFreq = GNC_FREQUENCY(gnc_frequency_new( NULL, NULL ));
807 gtk_box_pack_start( GTK_BOX(hbox) , GTK_WIDGET(ldd->prmVarGncFreq), TRUE, FALSE, 0 );
808 g_signal_connect (ldd->prmVarGncFreq,
"changed",
809 G_CALLBACK (loan_info_page_valid_cb), ldd);
813 hbox = GTK_HBOX(gtk_builder_get_object(builder,
"freq_frame_hbox"));
814 ldd->repGncFreq = GNC_FREQUENCY(gnc_frequency_new( NULL, NULL ));
815 gtk_box_pack_start( GTK_BOX(hbox) , GTK_WIDGET(ldd->repGncFreq), TRUE, FALSE, 0 );
816 g_signal_connect (ldd->repGncFreq,
"changed",
817 G_CALLBACK (loan_rep_page_valid_cb), ldd);
820 ldd->payGncFreq = GNC_FREQUENCY(gnc_frequency_new( NULL, NULL ));
821 gtk_container_add( GTK_CONTAINER(ldd->payFreqAlign), GTK_WIDGET(ldd->payGncFreq) );
822 g_signal_connect (ldd->payGncFreq,
"changed",
823 G_CALLBACK (loan_pay_page_valid_cb), ldd);
825 butt = GTK_WIDGET(gtk_builder_get_object(builder,
"pay_back_button"));
826 g_signal_connect (butt,
"clicked",
827 G_CALLBACK (loan_pay_back_button_cb), ldd);
829 butt = GTK_WIDGET(gtk_builder_get_object(builder,
"pay_next_button"));
830 g_signal_connect (butt,
"clicked",
831 G_CALLBACK (loan_pay_next_button_cb), ldd);
837 g_signal_connect (ldd->prmAccountGAS,
"account_sel_changed",
838 G_CALLBACK (loan_info_page_valid_cb), ldd);
839 g_signal_connect( ldd->prmIrateType,
"changed",
840 G_CALLBACK( loan_info_page_valid_cb ), ldd );
844 g_signal_connect (ldd->optEscrowGAS,
"account_sel_changed",
845 G_CALLBACK (loan_opt_page_valid_cb), ldd);
849 g_signal_connect (ldd->repAssetsFromGAS,
"account_sel_changed",
850 G_CALLBACK (loan_rep_page_valid_cb), ldd);
851 g_signal_connect (ldd->repIntToGAS,
"account_sel_changed",
852 G_CALLBACK (loan_rep_page_valid_cb), ldd);
853 g_signal_connect (ldd->repPrincToGAS,
"account_sel_changed",
854 G_CALLBACK (loan_rep_page_valid_cb), ldd);
858 g_signal_connect (ldd->payAcctFromGAS,
"account_sel_changed",
859 G_CALLBACK (loan_pay_page_valid_cb), ldd);
860 g_signal_connect (ldd->payAcctToGAS,
"account_sel_changed",
861 G_CALLBACK (loan_pay_page_valid_cb), ldd);
862 g_signal_connect (ldd->payAcctEscFromGAS,
"account_sel_changed",
863 G_CALLBACK (loan_pay_page_valid_cb), ldd);
864 g_signal_connect (ldd->payAcctEscToGAS,
"account_sel_changed",
865 G_CALLBACK (loan_pay_page_valid_cb), ldd);
869 gtk_combo_box_set_active( ldd->revRangeOpt, 0 );
870 g_signal_connect( ldd->revRangeOpt,
"changed",
871 G_CALLBACK( loan_rev_range_opt_changed_cb ),
873 g_signal_connect( ldd->revStartDate,
"date-changed",
874 G_CALLBACK( loan_rev_range_changed_cb ),
876 g_signal_connect( ldd->revEndDate,
"date-changed",
877 G_CALLBACK( loan_rev_range_changed_cb ),
881 g_signal_connect( ldd->window,
"destroy",
882 G_CALLBACK(loan_assistant_window_destroy_cb),
885 gtk_builder_connect_signals(builder, ldd);
886 g_object_unref(G_OBJECT(builder));
888 gtk_widget_show_all( ldd->window );
901 for ( optCount = 0; REPAY_DEFAULTS[optCount].name != NULL; optCount++ )
904 ldd->currentIdx = -1;
906 ldd->ld.principal = gnc_numeric_zero();
907 ldd->ld.startDate = g_date_new();
908 ldd->ld.varStartDate = g_date_new();
910 ldd->ld.loan_schedule = NULL;
911 ldd->ld.repayment_schedule = NULL;
914 recurrenceSet(r, 1, PERIOD_MONTH, ldd->ld.startDate, WEEKEND_ADJ_NONE);
915 ldd->ld.repayment_schedule = g_list_append(ldd->ld.repayment_schedule, r);
918 ldd->ld.repMemo = g_strdup( _(
"Loan") );
919 ldd->ld.repAmount = NULL;
920 ldd->ld.repStartDate = g_date_new();
921 ldd->ld.repayOptCount = optCount;
925 for ( i = 0; i < optCount; i++ )
927 g_assert( REPAY_DEFAULTS[i].name != NULL );
930 ldd->repayOptsUI[i]->ldd = ldd;
932 optData = ldd->ld.repayOpts[i]
933 = ldd->repayOptsUI[i]->optData
936 optData->enabled = FALSE;
937 optData->optValid = FALSE;
938 optData->FreqUniq = FALSE;
939 optData->name = g_strdup( _(REPAY_DEFAULTS[i].name) );
940 optData->txnMemo = g_strdup( _(REPAY_DEFAULTS[i].
942 optData->amount = 0.0;
943 optData->throughEscrowP = REPAY_DEFAULTS[i].escrowDefault;
944 optData->specSrcAcctP = REPAY_DEFAULTS[i].specSrcAcctDefault;
945 optData->schedule = NULL;
946 optData->startDate = NULL;
954 loan_info_prep( GtkAssistant *assistant, gpointer user_data )
958 gnc_amount_edit_set_amount( ldd->prmOrigPrincGAE, ldd->ld.principal );
959 gtk_spin_button_set_value( ldd->prmIrateSpin, ldd->ld.interestRate );
960 gtk_combo_box_set_active( ldd->prmIrateType, ldd->ld.rateType );
961 gtk_combo_box_set_active( ldd->prmType, ldd->ld.type );
962 if ( ldd->ld.type != GNC_FIXED )
964 g_signal_handlers_block_by_func( GNC_FREQUENCY( ldd->prmVarGncFreq), loan_info_page_valid_cb , ldd );
965 gnc_frequency_setup_recurrence(ldd->prmVarGncFreq, ldd->ld.loan_schedule, ldd->ld.varStartDate);
966 g_signal_handlers_unblock_by_func( GNC_FREQUENCY( ldd->prmVarGncFreq), loan_info_page_valid_cb , ldd );
973 tmpTm = g_new0(
struct tm, 1 );
975 g_date_to_struct_tm (ldd->ld.startDate, tmpTm);
976 gnc_date_edit_set_time (ldd->prmStartDateGDE,
983 gtk_spin_button_set_value( ldd->prmLengthSpin, ldd->ld.numPer );
984 gtk_combo_box_set_active( ldd->prmLengthType, ldd->ld.perSize );
985 gtk_spin_button_set_value( ldd->prmRemainSpin, ldd->ld.numMonRemain );
992 loan_info_prm_type_cb( GtkWidget *w, gpointer user_data )
997 index = gtk_combo_box_get_active( ldd->prmType );
998 gtk_widget_set_sensitive( GTK_WIDGET(ldd->prmVarFrame),
999 index != GNC_FIXED );
1005 loan_info_calc_update_cb( GtkWidget *w, gpointer user_data )
1009 int i, totalVal, total, remain;
1011 g_date_clear( &start, 1 );
1012 g_date_clear( &now, 1 );
1015 for ( i = 0; g_date_compare( &start, &now ) < 0; i++ )
1017 g_date_add_months( &start, 1 );
1022 gchar *valueStr = gtk_editable_get_chars( GTK_EDITABLE(ldd->prmLengthSpin),
1024 totalVal = strtol( valueStr, NULL, 10 );
1028 * ( gtk_combo_box_get_active( ldd->prmLengthType )
1031 gtk_spin_button_set_value( ldd->prmRemainSpin, remain );
1032 gtk_widget_show( GTK_WIDGET(ldd->prmRemainSpin) );
1037 loan_info_page_valid_cb (GtkWidget *widget, gpointer user_data )
1040 GtkAssistant *assistant = GTK_ASSISTANT(ldd->window);
1041 gint num = gtk_assistant_get_current_page (assistant);
1042 GtkWidget *page = gtk_assistant_get_nth_page (assistant, num);
1044 gtk_assistant_set_page_complete (assistant, page,
1045 loan_info_page_complete (assistant, ldd));
1051 loan_info_page_complete( GtkAssistant *assistant, gpointer user_data )
1055 ldd->ld.primaryAcct = gnc_account_sel_get_account( ldd->prmAccountGAS );
1057 if ( ldd->ld.primaryAcct == NULL )
1066 loan_info_page_save( GtkAssistant *assistant, gpointer user_data )
1070 ldd->ld.primaryAcct = gnc_account_sel_get_account( ldd->prmAccountGAS );
1072 if ( ! ldd->ld.repPriAcct )
1074 ldd->ld.repPriAcct = ldd->ld.primaryAcct;
1076 ldd->ld.principal = gnc_amount_edit_get_amount( ldd->prmOrigPrincGAE );
1077 ldd->ld.interestRate = gtk_spin_button_get_value( ldd->prmIrateSpin );
1078 ldd->ld.rateType = gtk_combo_box_get_active (ldd->prmIrateType );
1079 ldd->ld.type = gtk_combo_box_get_active( ldd->prmType );
1081 if ( ldd->ld.type != GNC_FIXED )
1083 recurrenceListFree(&ldd->ld.loan_schedule);
1084 gnc_frequency_save_to_recurrence(ldd->prmVarGncFreq,
1085 &ldd->ld.loan_schedule,
1086 ldd->ld.varStartDate);
1094 tmpTT = gnc_date_edit_get_date( ldd->prmStartDateGDE );
1096 g_date_set_dmy( ldd->ld.startDate,
1098 (tmpTm->tm_mon + 1),
1099 (1900 + tmpTm->tm_year) );
1106 (gtk_combo_box_get_active( ldd->prmLengthType )
1107 == GNC_MONTHS) ? GNC_MONTHS : GNC_YEARS;
1109 gtk_spin_button_get_value_as_int( ldd->prmLengthSpin );
1110 ldd->ld.numMonRemain =
1111 gtk_spin_button_get_value_as_int( ldd->prmRemainSpin );
1119 loan_opt_prep( GtkAssistant *assistant, gpointer user_data )
1126 loan_info_page_save(assistant, ldd);
1128 if ( ldd->ld.escrowAcct )
1130 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(ldd->optEscrowCb), TRUE );
1131 gnc_account_sel_set_account( ldd->optEscrowGAS, ldd->ld.escrowAcct, FALSE );
1133 for ( i = 0; i < ldd->ld.repayOptCount; i++ )
1135 rouid = ldd->repayOptsUI[i];
1136 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(rouid->optCb),
1137 rouid->optData->enabled );
1138 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(rouid->escrowCb),
1139 rouid->optData->throughEscrowP
1140 && rouid->optData->enabled
1141 && ldd->ld.escrowAcct );
1142 gtk_widget_set_sensitive( GTK_WIDGET(rouid->escrowCb),
1143 rouid->optData->enabled
1144 && ldd->ld.escrowAcct );
1151 loan_opt_toggled_cb( GtkToggleButton *tb, gpointer user_data )
1156 rouid->optData->enabled = gtk_toggle_button_get_active(tb);
1162 loan_opt_consistency_cb( GtkToggleButton *tb, gpointer user_data )
1164 GtkToggleButton *escrowCb;
1168 escrowCb = GTK_TOGGLE_BUTTON(rouid->escrowCb);
1170 gtk_toggle_button_set_active( escrowCb,
1171 gtk_toggle_button_get_active(
1173 rouid->ldd->optEscrowCb) )
1174 && rouid->optData->throughEscrowP
1175 && gtk_toggle_button_get_active(tb) );
1178 gtk_widget_set_sensitive( GTK_WIDGET(escrowCb),
1179 gtk_toggle_button_get_active(tb)
1180 && gtk_toggle_button_get_active(
1181 GTK_TOGGLE_BUTTON(rouid->ldd->optEscrowCb)) );
1187 loan_opt_escrow_toggle_cb( GtkToggleButton *tb, gpointer user_data )
1193 GtkAssistant *assistant = GTK_ASSISTANT(ldd->window);
1194 gint num = gtk_assistant_get_current_page (assistant);
1195 GtkWidget *page = gtk_assistant_get_nth_page (assistant, num);
1197 newState = gtk_toggle_button_get_active(tb);
1198 gtk_widget_set_sensitive( GTK_WIDGET(ldd->optEscrowHBox), newState );
1202 if (GNC_ACCOUNT_SEL( ldd->ld.escrowAcct) == NULL)
1203 gtk_assistant_set_page_complete (assistant, page, FALSE);
1207 ldd->ld.escrowAcct = NULL;
1208 gnc_account_sel_set_account( GNC_ACCOUNT_SEL( ldd->optEscrowGAS), NULL , FALSE );
1209 gtk_assistant_set_page_complete (assistant, page, TRUE);
1214 for ( i = 0; i < ldd->ld.repayOptCount; i++ )
1216 rouid = ldd->repayOptsUI[i];
1222 g_signal_handlers_block_by_func( rouid->escrowCb,
1223 loan_opt_escrow_toggled_cb,
1225 gtk_toggle_button_set_active(
1226 GTK_TOGGLE_BUTTON(rouid->escrowCb),
1228 && gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(rouid->optCb) )
1229 && rouid->optData->throughEscrowP ) );
1230 gtk_widget_set_sensitive(
1231 GTK_WIDGET(rouid->escrowCb),
1233 && gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(rouid->optCb) ) );
1234 g_signal_handlers_unblock_by_func( rouid->escrowCb,
1235 loan_opt_escrow_toggled_cb,
1239 rouid->optData->from = ldd->ld.escrowAcct;
1243 rouid->optData->from = NULL;
1251 loan_opt_escrow_toggled_cb( GtkToggleButton *tb, gpointer user_data )
1256 rouid->optData->throughEscrowP = gtk_toggle_button_get_active( tb );
1261 loan_opt_page_valid_cb (GtkWidget *widget, gpointer user_data )
1265 GtkAssistant *assistant = GTK_ASSISTANT(ldd->window);
1266 gint num = gtk_assistant_get_current_page (assistant);
1267 GtkWidget *page = gtk_assistant_get_nth_page (assistant, num);
1269 gtk_assistant_set_page_complete (assistant, page,
1270 loan_opt_page_complete (assistant, ldd));
1276 loan_opt_page_complete( GtkAssistant *assistant, gpointer user_data )
1280 if ( gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(ldd->optEscrowCb) ) )
1282 ldd->ld.escrowAcct =
1283 gnc_account_sel_get_account( ldd->optEscrowGAS );
1285 if ( ldd->ld.escrowAcct == NULL )
1290 ldd->ld.escrowAcct = NULL;
1299 loan_rep_prep( GtkAssistant *assistant, gpointer user_data )
1304 if ( ldd->ld.repAmount )
1306 g_free( ldd->ld.repAmount );
1309 str = g_string_sized_new( 64 );
1310 loan_get_pmt_formula( ldd, str);
1311 ldd->ld.repAmount = str->str;
1312 g_string_free( str, FALSE );
1314 if ( ldd->ld.repMemo )
1315 gtk_entry_set_text( ldd->repTxnName, ldd->ld.repMemo );
1317 if ( ldd->ld.repAmount )
1318 gtk_entry_set_text( ldd->repAmtEntry, ldd->ld.repAmount );
1320 gnc_account_sel_set_account( ldd->repAssetsFromGAS, ldd->ld.repFromAcct, FALSE );
1321 gnc_account_sel_set_account( ldd->repPrincToGAS, ldd->ld.repPriAcct, FALSE );
1322 gnc_account_sel_set_account( ldd->repIntToGAS, ldd->ld.repIntAcct, FALSE );
1324 g_signal_handlers_block_by_func( ldd->repGncFreq, loan_rep_page_valid_cb , ldd );
1325 gnc_frequency_setup_recurrence(ldd->repGncFreq, ldd->ld.repayment_schedule, ldd->ld.repStartDate);
1326 g_signal_handlers_unblock_by_func( ldd->repGncFreq, loan_rep_page_valid_cb , ldd );
1332 (i < ldd->ld.repayOptCount)
1333 && !ldd->ld.repayOpts[i]->enabled;
1336 if ( i < ldd->ld.repayOptCount )
1337 ldd->currentIdx = i;
1339 ldd->currentIdx = -1;
1345 loan_rep_page_valid_cb (GtkWidget *widget, gpointer user_data )
1348 GtkAssistant *assistant = GTK_ASSISTANT(ldd->window);
1349 gint num = gtk_assistant_get_current_page (assistant);
1350 GtkWidget *page = gtk_assistant_get_nth_page (assistant, num);
1352 gtk_assistant_set_page_complete (assistant, page,
1353 loan_rep_page_complete (assistant, ldd));
1359 loan_rep_page_complete( GtkAssistant *assistant, gpointer user_data )
1363 ldd->ld.repFromAcct =
1364 gnc_account_sel_get_account( ldd->repAssetsFromGAS );
1366 if ( ldd->ld.repFromAcct == NULL )
1369 ldd->ld.repPriAcct =
1370 gnc_account_sel_get_account( ldd->repPrincToGAS );
1372 if ( ldd->ld.repPriAcct == NULL )
1375 ldd->ld.repIntAcct =
1376 gnc_account_sel_get_account( ldd->repIntToGAS );
1378 if ( ldd->ld.repIntAcct == NULL )
1387 loan_rep_page_save( GtkAssistant *assistant, gpointer user_data )
1391 if ( ldd->ld.repMemo )
1392 g_free( ldd->ld.repMemo );
1394 gtk_editable_get_chars( GTK_EDITABLE(ldd->repTxnName), 0, -1 );
1396 if ( ldd->ld.repAmount )
1397 g_free( ldd->ld.repAmount );
1399 gtk_editable_get_chars( GTK_EDITABLE(ldd->repAmtEntry), 0, -1 );
1401 ldd->ld.repFromAcct =
1402 gnc_account_sel_get_account( ldd->repAssetsFromGAS );
1404 ldd->ld.repPriAcct =
1405 gnc_account_sel_get_account( ldd->repPrincToGAS );
1407 ldd->ld.repIntAcct =
1408 gnc_account_sel_get_account( ldd->repIntToGAS );
1410 recurrenceListFree(&ldd->ld.repayment_schedule);
1411 gnc_frequency_save_to_recurrence(ldd->repGncFreq,
1412 &ldd->ld.repayment_schedule,
1413 ldd->ld.repStartDate);
1420 loan_pay_prep( GtkAssistant *assistant, gpointer user_data )
1427 gint num = gtk_assistant_get_current_page (assistant);
1428 GtkWidget *page = gtk_assistant_get_nth_page (assistant, num);
1431 loan_rep_page_save(assistant, ldd);
1434 if (ldd->currentIdx == -1 )
1436 gtk_assistant_set_current_page (assistant, num + 1);
1440 g_assert( ldd->currentIdx >= 0 );
1441 g_assert( ldd->currentIdx <= ldd->ld.repayOptCount );
1443 rod = ldd->ld.repayOpts[ldd->currentIdx];
1444 str = g_string_sized_new( 32 );
1446 g_string_printf( str, _(
"Loan Repayment Option: \"%s\""), rod->name );
1447 gtk_assistant_set_page_title (assistant, page, str->str );
1450 gtk_entry_set_text( ldd->payTxnName, rod->txnMemo );
1451 g_string_printf( str,
"%0.2f", rod->amount );
1452 gtk_entry_set_text( ldd->payAmtEntry, str->str );
1454 gtk_widget_set_sensitive( GTK_WIDGET(ldd->payUseEscrow),
1455 (ldd->ld.escrowAcct != NULL) );
1458 g_signal_handlers_block_by_func( ldd->payUseEscrow,
1459 loan_pay_use_esc_toggle_cb,
1462 loan_pay_use_esc_setup( ldd,
1463 (ldd->ld.escrowAcct != NULL)
1464 && rod->throughEscrowP );
1465 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(ldd->payUseEscrow),
1466 (rod->throughEscrowP
1467 && ldd->ld.escrowAcct != NULL) );
1469 g_signal_handlers_unblock_by_func( ldd->payUseEscrow,
1470 loan_pay_use_esc_toggle_cb,
1475 g_signal_handlers_block_by_func( ldd->paySpecSrcAcct,
1476 loan_pay_spec_src_toggle_cb,
1478 loan_pay_spec_src_setup( ldd, rod->specSrcAcctP );
1479 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(ldd->paySpecSrcAcct),
1480 rod->specSrcAcctP );
1482 g_signal_handlers_unblock_by_func( ldd->paySpecSrcAcct,
1483 loan_pay_spec_src_toggle_cb,
1487 g_signal_handlers_block_by_func(ldd->payAcctToGAS, loan_pay_page_valid_cb, ldd );
1488 gnc_account_sel_set_account( ldd->payAcctToGAS, rod->to, FALSE );
1489 g_signal_handlers_unblock_by_func(ldd->payAcctToGAS, loan_pay_page_valid_cb, ldd );
1492 g_signal_handlers_block_by_func(ldd->payTxnFreqUniqRb, loan_pay_freq_toggle_cb, ldd );
1493 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(ldd->payTxnFreqPartRb), !rod->FreqUniq );
1494 gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(ldd->payTxnFreqUniqRb), rod->FreqUniq );
1495 g_signal_handlers_unblock_by_func(ldd->payTxnFreqUniqRb, loan_pay_freq_toggle_cb, ldd );
1497 gtk_widget_set_sensitive( GTK_WIDGET(ldd->payFreqAlign), rod->FreqUniq );
1499 if ( rod->FreqUniq )
1501 g_signal_handlers_disconnect_by_func( ldd->payGncFreq, loan_pay_page_valid_cb, ldd );
1502 gtk_container_remove( GTK_CONTAINER(ldd->payFreqAlign), GTK_WIDGET(ldd->payGncFreq) );
1503 ldd->payGncFreq = NULL;
1504 ldd->payGncFreq = GNC_FREQUENCY(gnc_frequency_new_from_recurrence( rod->schedule, rod->startDate ));
1505 gtk_container_add( GTK_CONTAINER(ldd->payFreqAlign), GTK_WIDGET(ldd->payGncFreq) );
1506 g_signal_connect (ldd->payGncFreq,
"changed",
1507 G_CALLBACK (loan_pay_page_valid_cb), ldd);
1509 g_string_free( str, TRUE );
1510 loan_pay_page_valid_cb(GTK_WIDGET(ldd->window), ldd);
1516 loan_pay_page_valid_cb (GtkWidget *widget, gpointer user_data )
1519 GtkAssistant *assistant = GTK_ASSISTANT(ldd->window);
1520 gint num = gtk_assistant_get_current_page (assistant);
1521 GtkWidget *page = gtk_assistant_get_nth_page (assistant, num);
1523 gtk_assistant_set_page_complete (assistant, page,
1524 ( loan_pay_complete (assistant, ldd) &&
1525 loan_pay_all_opt_valid (assistant, ldd )));
1533 gtk_widget_set_sensitive( GTK_WIDGET(ldd->payEscToLabel), newState );
1534 gtk_widget_set_sensitive( GTK_WIDGET(ldd->payEscFromLabel), newState );
1537 g_signal_handlers_block_by_func( ldd->payAcctEscToGAS, loan_pay_page_valid_cb, ldd );
1538 g_signal_handlers_block_by_func( ldd->payAcctEscFromGAS, loan_pay_page_valid_cb, ldd );
1539 gnc_account_sel_set_account( ldd->payAcctEscToGAS, ldd->ld.escrowAcct, FALSE );
1540 gnc_account_sel_set_account( ldd->payAcctEscFromGAS, ldd->ld.escrowAcct, FALSE );
1541 g_signal_handlers_unblock_by_func( ldd->payAcctEscToGAS, loan_pay_page_valid_cb, ldd );
1542 g_signal_handlers_unblock_by_func( ldd->payAcctEscFromGAS, loan_pay_page_valid_cb, ldd );
1549 loan_pay_use_esc_toggle_cb( GtkToggleButton *tb, gpointer user_data )
1554 newState = gtk_toggle_button_get_active( tb );
1555 loan_pay_use_esc_setup( ldd, newState );
1563 gtk_widget_set_sensitive( GTK_WIDGET(ldd->payAcctFromLabel), newState );
1564 gtk_widget_set_sensitive( GTK_WIDGET(ldd->payAcctFromGAS), newState );
1567 g_signal_handlers_block_by_func( ldd->payAcctFromGAS, loan_pay_page_valid_cb, ldd );
1568 gnc_account_sel_set_account( ldd->payAcctFromGAS, ldd->ld.repayOpts[ldd->currentIdx]->from, FALSE );
1569 g_signal_handlers_unblock_by_func( ldd->payAcctFromGAS, loan_pay_page_valid_cb, ldd );
1573 g_signal_handlers_block_by_func( ldd->payAcctFromGAS, loan_pay_page_valid_cb, ldd );
1574 gnc_account_sel_set_account( ldd->payAcctFromGAS, NULL, FALSE );
1575 ldd->ld.repayOpts[ldd->currentIdx]->from = NULL;
1576 g_signal_handlers_unblock_by_func( ldd->payAcctFromGAS, loan_pay_page_valid_cb, ldd );
1583 loan_pay_spec_src_toggle_cb( GtkToggleButton *tb, gpointer user_data )
1588 newState = gtk_toggle_button_get_active( tb );
1589 loan_pay_spec_src_setup( ldd, newState );
1595 loan_pay_freq_toggle_cb( GtkToggleButton *tb, gpointer user_data )
1600 g_assert( ldd->currentIdx >= 0 );
1601 g_assert( ldd->currentIdx <= ldd->ld.repayOptCount );
1603 rod = ldd->ld.repayOpts[ldd->currentIdx];
1605 rod->FreqUniq = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(ldd->payTxnFreqUniqRb) );
1606 gtk_widget_set_sensitive( GTK_WIDGET(ldd->payFreqAlign), rod->FreqUniq );
1608 if ( rod->FreqUniq )
1610 if ( rod->schedule == NULL )
1614 recurrenceSet(r, 1, PERIOD_MONTH, ldd->ld.startDate, WEEKEND_ADJ_NONE);
1615 rod->schedule = g_list_append(rod->schedule, r);
1617 if ( rod->startDate == NULL )
1619 rod->startDate = g_date_new();
1620 *rod->startDate = *ldd->ld.startDate;
1622 g_signal_handlers_block_by_func( ldd->payGncFreq, loan_pay_page_valid_cb, ldd );
1623 gnc_frequency_setup_recurrence(ldd->payGncFreq, rod->schedule, rod->startDate);
1624 g_signal_handlers_unblock_by_func( ldd->payGncFreq, loan_pay_page_valid_cb, ldd );
1630 recurrenceListFree(&rod->schedule);
1632 if ( rod->startDate )
1634 g_date_free( rod->startDate );
1635 rod->startDate = NULL;
1643 loan_pay_next_button_cb( GtkButton *button, gpointer user_data )
1649 if ( loan_pay_complete ( GTK_ASSISTANT(ldd->window), user_data ) != FALSE )
1652 for ( i = ldd->currentIdx + 1;
1653 (i < ldd->ld.repayOptCount)
1654 && !ldd->ld.repayOpts[i]->enabled; i++ )
1656 if ( i < ldd->ld.repayOptCount )
1658 ldd->currentIdx = i;
1659 loan_pay_prep( GTK_ASSISTANT(ldd->window), user_data );
1667 loan_pay_back_button_cb( GtkButton *button, gpointer user_data )
1673 if ( loan_pay_complete ( GTK_ASSISTANT(ldd->window), user_data ) != FALSE)
1676 for ( i = ldd->currentIdx - 1;
1677 (i > -1) && !ldd->ld.repayOpts[i]->enabled;
1682 ldd->currentIdx = i;
1683 loan_pay_prep( GTK_ASSISTANT(ldd->window), user_data );
1691 loan_pay_all_opt_valid ( GtkAssistant *assistant, gpointer user_data )
1699 for ( i = 0; (i < ldd->ld.repayOptCount); i++ )
1701 if (ldd->ld.repayOpts[i]->enabled)
1703 if (ldd->ld.repayOpts[i]->optValid)
1715 loan_pay_complete( GtkAssistant *assistant, gpointer user_data )
1721 g_assert( ldd->currentIdx >= 0 );
1722 g_assert( ldd->currentIdx <= ldd->ld.repayOptCount );
1723 rod = ldd->ld.repayOpts[ ldd->currentIdx ];
1725 tmpStr = gtk_editable_get_chars( GTK_EDITABLE(ldd->payTxnName),
1727 if ( rod->txnMemo != NULL )
1729 g_free( rod->txnMemo );
1731 rod->txnMemo = tmpStr;
1734 tmpStr = gtk_editable_get_chars( GTK_EDITABLE(ldd->payAmtEntry),
1736 rod->amount = (float)strtod( tmpStr, NULL );
1740 gtk_toggle_button_get_active(
1741 GTK_TOGGLE_BUTTON(ldd->paySpecSrcAcct) );
1744 if ( rod->specSrcAcctP )
1746 rod->from = gnc_account_sel_get_account( ldd->payAcctFromGAS );
1747 if ( rod->from == NULL )
1752 rod->to = gnc_account_sel_get_account( ldd->payAcctToGAS );
1753 if ( rod->to == NULL )
1757 rod->optValid = TRUE;
1760 if ( rod->FreqUniq )
1762 if ( rod->startDate == NULL )
1764 rod->startDate = g_date_new();
1766 recurrenceListFree(&rod->schedule);
1767 gnc_frequency_save_to_recurrence(ldd->payGncFreq, &rod->schedule, rod->startDate);
1769 if (! rod->schedule )
1781 loan_rev_prep( GtkAssistant *assistant, gpointer user_data )
1784 static const int BASE_COLS = 3;
1786 GtkListStore *store;
1787 GtkCellRenderer *renderer;
1788 GtkTreeViewColumn *column;
1794 if (ldd->currentIdx != -1)
1795 loan_pay_complete(assistant, ldd);
1798 if ( ldd->revView != NULL )
1800 gtk_widget_destroy( GTK_WIDGET(ldd->revView) );
1801 ldd->revView = NULL;
1804 ldd->ld.revNumPmts = BASE_COLS;
1806 for ( i = 0; i < ldd->ld.repayOptCount; i++ )
1808 ldd->ld.revRepayOptToColMap[i] = -1;
1809 if ( ! ldd->ld.repayOpts[i]->enabled )
1815 ldd->ld.revRepayOptToColMap[i] = ldd->ld.revNumPmts;
1816 ldd->ld.revNumPmts += 1;
1819 types = g_new( GType, ldd->ld.revNumPmts + 1 );
1820 for ( i = 0; i < ldd->ld.revNumPmts + 1; i++ )
1821 types[i] = G_TYPE_STRING;
1822 store = gtk_list_store_newv(ldd->ld.revNumPmts + 1, types);
1825 ldd->revView = GTK_TREE_VIEW(
1826 gtk_tree_view_new_with_model( GTK_TREE_MODEL(store) ));
1827 g_object_unref(store);
1829 renderer = gtk_cell_renderer_text_new();
1830 column = gtk_tree_view_column_new_with_attributes(_(
"Date"), renderer,
1831 "text", LOAN_COL_DATE,
1833 gtk_tree_view_append_column(ldd->revView, column);
1835 renderer = gtk_cell_renderer_text_new();
1836 column = gtk_tree_view_column_new_with_attributes(_(
"Payment"), renderer,
1837 "text", LOAN_COL_PAYMENT,
1839 gtk_tree_view_append_column(ldd->revView, column);
1841 renderer = gtk_cell_renderer_text_new();
1842 column = gtk_tree_view_column_new_with_attributes(_(
"Principal"), renderer,
1843 "text", LOAN_COL_PRINCIPAL,
1845 gtk_tree_view_append_column(ldd->revView, column);
1847 renderer = gtk_cell_renderer_text_new();
1848 column = gtk_tree_view_column_new_with_attributes(_(
"Interest"), renderer,
1849 "text", LOAN_COL_INTEREST,
1851 gtk_tree_view_append_column(ldd->revView, column);
1855 for ( i = 0; i < ldd->ld.repayOptCount; i++ )
1857 if ( ldd->ld.revRepayOptToColMap[i] == -1 )
1861 renderer = gtk_cell_renderer_text_new();
1862 column = gtk_tree_view_column_new_with_attributes
1863 (ldd->ld.repayOpts[i]->name, renderer,
1864 "text", LOAN_COL_INTEREST + col,
1866 gtk_tree_view_append_column(ldd->revView, column);
1871 gtk_container_add( GTK_CONTAINER(ldd->revScrollWin),
1872 GTK_WIDGET(ldd->revView) );
1873 gtk_widget_show( GTK_WIDGET(ldd->revView) );
1875 loan_rev_recalc_schedule( ldd );
1879 g_date_clear( &start, 1 );
1880 g_date_clear( &end, 1 );
1881 loan_rev_get_dates( ldd, &start, &end );
1882 loan_rev_update_view( ldd, &start, &end );
1889 loan_rev_range_opt_changed_cb( GtkComboBox *combo, gpointer user_data )
1894 opt = gtk_combo_box_get_active( ldd->revRangeOpt );
1895 gtk_widget_set_sensitive( GTK_WIDGET(ldd->revDateFrame),
1899 g_date_clear( &start, 1 );
1900 g_date_clear( &end, 1 );
1901 loan_rev_get_dates( ldd, &start, &end );
1902 loan_rev_update_view( ldd, &start, &end );
1909 loan_rev_range_changed_cb(
GNCDateEdit *gde, gpointer user_data )
1914 g_date_clear( &start, 1 );
1915 g_date_clear( &end, 1 );
1916 loan_rev_get_dates( ldd, &start, &end );
1917 loan_rev_update_view( ldd, &start, &end );
1927 struct tm *endDateMath;
1929 *start = *ldd->ld.startDate;
1931 endDateMath = g_new0(
struct tm, 1 );
1932 g_date_to_struct_tm (ldd->ld.startDate, endDateMath);
1933 monthsTotal = ( (ldd->ld.numPer - 1)
1934 * ( ldd->ld.perSize == GNC_MONTHS ? 1 : 12 ) );
1935 endDateMath->tm_mon += monthsTotal;
1937 g_free (endDateMath);
1945 int range = gtk_combo_box_get_active( ldd->revRangeOpt );
1950 g_date_set_dmy( start, 1, G_DATE_JANUARY, g_date_get_year( start ) );
1951 g_date_set_dmy( end, 31, G_DATE_DECEMBER, g_date_get_year( start ) );
1956 g_date_add_years( end, 1 );
1959 loan_rev_get_loan_range( ldd, start, end );
1963 gnc_date_edit_get_date( ldd->revStartDate ) );
1965 gnc_date_edit_get_date( ldd->revEndDate ) );
1968 PERR(
"Unknown review date range option %d", range );
1977 loan_rev_sched_list_free( gpointer data, gpointer user_data )
1980 g_free( rrr->numCells );
1987 loan_rev_hash_to_list( gpointer key, gpointer val, gpointer user_data )
1989 GList **l = (GList**)user_data;
1993 DEBUG(
"%.8x, %.8x",
1994 GPOINTER_TO_UINT(key),
1995 GPOINTER_TO_UINT(val));
1998 rrr->date = *(GDate*)key;
2000 *l = g_list_append( *l, (gpointer)rrr );
2006 loan_rev_hash_free_date_keys( gpointer key, gpointer val, gpointer user_data )
2008 g_free( (GDate*)key );
2018 GHashTable *repayment_schedule;
2020 g_date_clear( &start, 1 );
2021 g_date_clear( &end, 1 );
2022 loan_rev_get_loan_range( ldd, &start, &end );
2032 GDate curDate, nextDate;
2033 GString *pmtFormula, *ppmtFormula, *ipmtFormula;
2037 pmtFormula = g_string_sized_new( 64 );
2038 loan_get_pmt_formula( ldd, pmtFormula );
2039 ppmtFormula = g_string_sized_new( 64 );
2040 loan_get_ppmt_formula( ldd, ppmtFormula );
2041 ipmtFormula = g_string_sized_new( 64 );
2042 loan_get_ipmt_formula( ldd, ipmtFormula );
2044 ivar = g_hash_table_new( g_str_hash, g_str_equal );
2045 g_date_clear( &curDate, 1 );
2047 g_date_subtract_days( &curDate, 1 );
2048 g_date_clear(&nextDate, 1);
2049 recurrenceListNextInstance(ldd->ld.repayment_schedule, &curDate, &nextDate);
2051 g_date_valid( &nextDate )
2052 && g_date_compare( &nextDate, &end ) <= 0 ;
2055 recurrenceListNextInstance(ldd->ld.repayment_schedule,
2056 &curDate, &nextDate))
2062 (
gnc_numeric*)g_hash_table_lookup( repayment_schedule,
2064 if ( rowNumData == NULL)
2067 GDate *dateKeyCopy = g_date_new();
2069 *dateKeyCopy = curDate;
2070 rowNumData = g_new0(
gnc_numeric, ldd->ld.revNumPmts );
2071 g_assert( rowNumData != NULL );
2072 for ( j = 0; j < ldd->ld.revNumPmts; j++ )
2076 g_hash_table_insert( repayment_schedule,
2077 (gpointer)dateKeyCopy,
2078 (gpointer)rowNumData );
2083 ival = gnc_numeric_create( i, 1 );
2084 g_hash_table_insert( ivar,
"i", &ival );
2086 if ( ! gnc_exp_parser_parse_separate_vars(
2087 pmtFormula->str, &val, &eloc, ivar ) )
2089 PERR(
"pmt Parsing error at %s", eloc );
2093 rowNumData[0] = val;
2095 if ( ! gnc_exp_parser_parse_separate_vars(
2096 ppmtFormula->str, &val, &eloc, ivar ) )
2098 PERR(
"ppmt Parsing error at %s", eloc );
2102 rowNumData[1] = val;
2104 if ( ! gnc_exp_parser_parse_separate_vars(
2105 ipmtFormula->str, &val, &eloc, ivar ) )
2107 PERR(
"ipmt Parsing error at %s", eloc );
2111 rowNumData[2] = val;
2114 g_string_free( ipmtFormula, TRUE );
2115 g_string_free( ppmtFormula, TRUE );
2116 g_string_free( pmtFormula, TRUE );
2118 g_hash_table_destroy( ivar );
2124 GDate curDate, nextDate;
2127 for ( i = 0; i < ldd->ld.repayOptCount; i++ )
2129 if ( ! ldd->ld.repayOpts[i]->enabled )
2133 = ( ldd->ld.repayOpts[i]->schedule != NULL
2134 ? ldd->ld.repayOpts[i]->schedule
2135 : ldd->ld.repayment_schedule );
2137 g_date_clear( &curDate, 1 );
2139 g_date_subtract_days( &curDate, 1 );
2140 g_date_clear(&nextDate, 1);
2141 recurrenceListNextInstance(schedule, &curDate, &nextDate );
2142 for ( ; g_date_valid( &nextDate )
2143 && g_date_compare( &nextDate, &end ) <= 0;
2145 recurrenceListNextInstance(
2146 schedule, &curDate, &nextDate ) )
2152 rowNumData = (
gnc_numeric*)g_hash_table_lookup( repayment_schedule,
2154 if ( rowNumData == NULL )
2157 GDate *dateKeyCopy = g_date_new();
2159 *dateKeyCopy = curDate;
2160 rowNumData = g_new0(
gnc_numeric, ldd->ld.revNumPmts );
2161 g_assert( rowNumData != NULL );
2162 for ( j = 0; j < ldd->ld.revNumPmts; j++ )
2166 g_hash_table_insert( repayment_schedule,
2167 (gpointer)dateKeyCopy,
2168 (gpointer)rowNumData );
2175 rowNumData[ ldd->ld.revRepayOptToColMap[i] ]
2183 if ( ldd->ld.revSchedule != NULL )
2185 g_list_foreach( ldd->ld.revSchedule,
2186 loan_rev_sched_list_free,
2188 g_list_free( ldd->ld.revSchedule );
2189 ldd->ld.revSchedule = NULL;
2191 g_hash_table_foreach( repayment_schedule, loan_rev_hash_to_list,
2192 &ldd->ld.revSchedule );
2193 g_hash_table_foreach( repayment_schedule, loan_rev_hash_free_date_keys,
2195 g_hash_table_destroy( repayment_schedule );
2196 ldd->ld.revSchedule =
2197 g_list_sort( ldd->ld.revSchedule, (GCompareFunc)g_date_compare );
2206 static gchar *NO_AMT_CELL_TEXT =
" ";
2209 GtkListStore *store;
2212 pai = gnc_default_price_print_info();
2213 pai.min_decimal_places = 2;
2215 store = GTK_LIST_STORE(gtk_tree_view_get_model( ldd->revView ));
2217 gtk_list_store_clear( store );
2219 for ( l = ldd->ld.revSchedule; l != NULL; l = l->next )
2225 if ( g_date_compare( &rrr->date, start ) < 0 )
2227 if ( g_date_compare( &rrr->date, end ) > 0 )
2230 gtk_list_store_append(store, &iter);
2233 gtk_list_store_set( store, &iter, LOAN_COL_DATE, tmpBuf, -1 );
2235 for ( i = 0; i < ldd->ld.revNumPmts; i++ )
2242 gtk_list_store_set( store, &iter,
2243 i + 1, NO_AMT_CELL_TEXT,
2249 g_assert( numPrinted < 50 );
2251 gtk_list_store_set( store, &iter,
2263 gfloat loan_apr_to_simple_formula (gfloat rate, gfloat compounding_periods)
2268 simple_rate = compounding_periods * ((pow((1 + rate), (1 / compounding_periods))) - 1);
2269 return (simple_rate);
2272 #define MAX_FORMULA 1024
2276 loan_get_formula_internal(
LoanAssistantData *ldd, GString *gstr,
const gchar*
template )
2279 gfloat pass_thru_rate, period_rate;
2282 gchar formula[MAX_FORMULA];
2284 g_assert( ldd != NULL );
2285 g_assert( gstr != NULL );
2287 pass_thru_rate = ldd->ld.interestRate / 100;
2288 periods = (ldd->ld.numPer * (ldd->ld.perSize == GNC_MONTHS ? 1 : 12)) * 1.;
2291 rate_case = ldd->ld.rateType;
2294 case GNC_IRATE_SIMPLE:
2295 period_rate = pass_thru_rate;
2297 case GNC_IRATE_APR_DAILY:
2298 period_rate = loan_apr_to_simple_formula (pass_thru_rate, 365);
2300 case GNC_IRATE_APR_WEEKLY:
2301 period_rate = loan_apr_to_simple_formula (pass_thru_rate, 52);
2303 case GNC_IRATE_APR_MONTHLY:
2304 period_rate = loan_apr_to_simple_formula (pass_thru_rate, 12);
2306 case GNC_IRATE_APR_QUARTERLY:
2307 period_rate = loan_apr_to_simple_formula (pass_thru_rate, 4);
2309 case GNC_IRATE_APR_ANNUALLY:
2310 period_rate = loan_apr_to_simple_formula (pass_thru_rate, 1);
2313 period_rate = ldd->ld.interestRate / 100;
2317 if (0 < strfmon (formula, MAX_FORMULA,
template,
2318 period_rate, 12.0, periods, principal ))
2319 g_string_append (gstr, formula);
2327 loan_get_formula_internal (ldd, gstr,
"pmt( %!.5i / %!0.2i : %!0.2i : %!0.2i : 0 : 0 )");
2335 loan_get_formula_internal (ldd, gstr,
"ppmt( %!.5i / %!0.2i : i : %!0.2i : %!0.2i : 0 : 0 )");
2343 loan_get_formula_internal (ldd, gstr,
"ipmt( %!.5i / %!0.2i : i : %!0.2i : %!0.2i : 0 : 0 )");
2349 ld_calc_sx_instance_num(GDate *start_date, GList *schedule)
2352 GDate next_date, today;
2354 g_date_clear(&next_date, 1);
2355 g_date_clear(&today, 1);
2358 if (g_date_compare(start_date, &today) > 0)
2361 instance_count = -1;
2365 recurrenceListNextInstance(schedule, start_date, &next_date);
2367 while (g_date_compare(&next_date, &today) < 0);
2369 return instance_count;
2375 loan_tcSX_free( gpointer data, gpointer user_data )
2378 g_free( tcSX->
name );
2380 gnc_ttinfo_free( tcSX->
mainTxn );
2394 loan_find_ttsplit_with_acct( gconstpointer elt,
2395 gconstpointer crit )
2398 return ( (gnc_ttsplitinfo_get_account( ttsi )
2417 xaccSchedXactionSetStartDate( sx, &tcSX->
start );
2418 xaccSchedXactionSetLastOccurDate( sx, &tcSX->last );
2424 ttxnList = g_list_append( ttxnList, tcSX->
mainTxn );
2426 ttxnList = g_list_append( ttxnList, tcSX->
escrowTxn );
2428 g_assert( ttxnList != NULL );
2431 gnc_get_current_book() );
2433 sxes = gnc_book_get_schedxactions(gnc_get_current_book());
2434 gnc_sxes_add_sx(sxes, sx);
2435 g_list_free( ttxnList );
2522 #define AMTBUF_LEN 64
2523 gchar amtBuf[AMTBUF_LEN];
2532 if ( rod->throughEscrowP && ldd->ld.escrowAcct )
2539 elt = g_list_find_custom(
2540 gnc_ttinfo_get_template_splits( paymentSX->
mainTxn ),
2542 loan_find_ttsplit_with_acct );
2546 gstr = g_string_new( gnc_ttsplitinfo_get_debit_formula( ttsi ) );
2547 g_string_append_printf( gstr,
" + %s", amtBuf );
2548 gnc_ttsplitinfo_set_debit_formula( ttsi, gstr->str );
2549 g_string_free( gstr, TRUE );
2554 if ( rod->from != NULL )
2561 elt = g_list_find_custom(
2562 gnc_ttinfo_get_template_splits( tcSX->
escrowTxn ),
2564 loan_find_ttsplit_with_acct );
2573 ttsi = gnc_ttsplitinfo_malloc();
2574 gnc_ttsplitinfo_set_memo( ttsi, rod->txnMemo );
2575 gnc_ttsplitinfo_set_account( ttsi, ldd->ld.escrowAcct );
2576 gnc_ttinfo_append_template_split( tcSX->
escrowTxn, ttsi );
2578 if ( (str = (gchar*)gnc_ttsplitinfo_get_credit_formula( ttsi ))
2581 gstr = g_string_sized_new( 16 );
2588 gstr = g_string_new( str );
2589 g_string_append_printf( gstr,
" + " );
2591 g_string_append_printf( gstr,
"%s", amtBuf );
2592 gnc_ttsplitinfo_set_credit_formula( ttsi, gstr->str );
2593 g_string_free( gstr, TRUE );
2600 elt = g_list_find_custom(
2601 gnc_ttinfo_get_template_splits( paymentSX->
mainTxn ),
2602 ldd->ld.repFromAcct,
2603 loan_find_ttsplit_with_acct );
2608 ttsi = gnc_ttsplitinfo_malloc();
2609 gnc_ttsplitinfo_set_memo( ttsi, rod->txnMemo );
2610 gnc_ttsplitinfo_set_account( ttsi, ldd->ld.escrowAcct );
2611 gnc_ttsplitinfo_set_credit_formula( ttsi, amtBuf );
2612 gnc_ttinfo_append_template_split( tcSX->
escrowTxn, ttsi );
2620 if ( rod->from != NULL )
2627 elt = g_list_find_custom(
2628 gnc_ttinfo_get_template_splits( tcSX->
mainTxn ),
2629 ldd->ld.repFromAcct,
2630 loan_find_ttsplit_with_acct );
2641 if ( fromSplit != NULL )
2644 gstr = g_string_new( gnc_ttsplitinfo_get_credit_formula( fromSplit ) );
2645 g_string_append_printf( gstr,
" + %s", amtBuf );
2646 gnc_ttsplitinfo_set_credit_formula( fromSplit, gstr->str );
2647 g_string_free( gstr, TRUE );
2655 ttsi = gnc_ttsplitinfo_malloc();
2656 gnc_ttsplitinfo_set_memo( ttsi, rod->txnMemo );
2659 gnc_ttsplitinfo_set_account( ttsi, rod->from );
2663 gnc_ttsplitinfo_set_account( ttsi, ldd->ld.repFromAcct );
2665 gnc_ttsplitinfo_set_credit_formula( ttsi, amtBuf );
2667 if ( rod->throughEscrowP )
2671 gnc_ttinfo_append_template_split( tti, ttsi );
2678 ttsi = gnc_ttsplitinfo_malloc();
2679 gnc_ttsplitinfo_set_memo( ttsi, rod->txnMemo );
2680 gnc_ttsplitinfo_set_account( ttsi, rod->to );
2681 gnc_ttsplitinfo_set_debit_formula( ttsi, amtBuf );
2682 gnc_ttinfo_append_template_split( toTxn, ttsi );
2709 GList *repaySXes = NULL;
2718 paymentSX->
name = g_strdup(ldd->ld.repMemo);
2719 paymentSX->
start = *ldd->ld.startDate;
2720 paymentSX->last = *ldd->ld.repStartDate;
2721 g_date_subtract_months( &paymentSX->last, 1 );
2723 paymentSX->end = *ldd->ld.repStartDate;
2724 g_date_add_months( &paymentSX->end, ldd->ld.numMonRemain - 1);
2727 paymentSX->
schedule = ldd->ld.repayment_schedule;
2731 (ldd->ld.numPer * ( ldd->ld.perSize == GNC_YEARS ? 12 : 1 ))
2732 - ldd->ld.numMonRemain + 1;
2734 paymentSX->
mainTxn = gnc_ttinfo_malloc();
2735 gnc_ttinfo_set_currency( paymentSX->
mainTxn,
2739 GString *payMainTxnDesc = g_string_sized_new( 32 );
2740 g_string_printf( payMainTxnDesc,
2743 ( ldd->ld.escrowAcct == NULL
2745 : _(
"Escrow Payment") )
2748 gnc_ttinfo_set_description( paymentSX->
mainTxn,
2749 payMainTxnDesc->str );
2750 g_string_free( payMainTxnDesc, TRUE );
2772 srcAcct = ldd->ld.repFromAcct;
2773 if ( ldd->ld.escrowAcct != NULL )
2775 Account *realSrcAcct = srcAcct;
2776 srcAcct = ldd->ld.escrowAcct;
2777 gstr = g_string_sized_new( 32 );
2778 loan_get_pmt_formula( ldd, gstr );
2781 ttsi = gnc_ttsplitinfo_malloc();
2782 gnc_ttsplitinfo_set_memo( ttsi, ldd->ld.repMemo );
2783 gnc_ttsplitinfo_set_account( ttsi, realSrcAcct );
2784 gnc_ttsplitinfo_set_credit_formula( ttsi, gstr->str );
2785 gnc_ttinfo_append_template_split( ttxn, ttsi );
2790 ttsi = gnc_ttsplitinfo_malloc();
2791 gnc_ttsplitinfo_set_memo( ttsi, ldd->ld.repMemo );
2792 gnc_ttsplitinfo_set_account( ttsi, ldd->ld.escrowAcct );
2793 gnc_ttsplitinfo_set_debit_formula( ttsi, gstr->str );
2794 gnc_ttinfo_append_template_split( ttxn, ttsi );
2797 g_string_free( gstr, TRUE );
2799 paymentSX->
escrowTxn = gnc_ttinfo_malloc();
2800 gnc_ttinfo_set_currency( paymentSX->
escrowTxn,
2804 GString *escrowTxnDesc;
2805 escrowTxnDesc = g_string_new( ldd->ld.repMemo );
2806 g_string_append_printf( escrowTxnDesc,
" - %s", _(
"Payment") );
2807 gnc_ttinfo_set_description( paymentSX->
escrowTxn,
2808 escrowTxnDesc->str );
2809 g_string_free( escrowTxnDesc, TRUE );
2815 ttsi = gnc_ttsplitinfo_malloc();
2817 gstr = g_string_new( ldd->ld.repMemo );
2818 g_string_append_printf( gstr,
" - %s",
2820 gnc_ttsplitinfo_set_memo( ttsi, gstr->str );
2821 g_string_free( gstr, TRUE );
2824 gnc_ttsplitinfo_set_account( ttsi, srcAcct );
2825 gstr = g_string_sized_new( 32 );
2826 loan_get_pmt_formula( ldd, gstr );
2827 gnc_ttsplitinfo_set_credit_formula( ttsi, gstr->str );
2828 gnc_ttinfo_append_template_split( ttxn, ttsi );
2829 g_string_free( gstr, TRUE );
2835 ttsi = gnc_ttsplitinfo_malloc();
2837 gstr = g_string_new( ldd->ld.repMemo );
2838 g_string_append_printf( gstr,
" - %s",
2840 gnc_ttsplitinfo_set_memo( ttsi, gstr->str );
2841 g_string_free( gstr, TRUE );
2844 gnc_ttsplitinfo_set_account( ttsi, ldd->ld.repPriAcct );
2845 gstr = g_string_sized_new( 32 );
2846 loan_get_ppmt_formula( ldd, gstr );
2847 gnc_ttsplitinfo_set_debit_formula( ttsi, gstr->str );
2848 gnc_ttinfo_append_template_split( ttxn, ttsi );
2849 g_string_free( gstr, TRUE );
2855 ttsi = gnc_ttsplitinfo_malloc();
2857 gstr = g_string_new( ldd->ld.repMemo );
2858 g_string_append_printf( gstr,
" - %s",
2860 gnc_ttsplitinfo_set_memo( ttsi, gstr->str );
2861 g_string_free( gstr, TRUE );
2864 gnc_ttsplitinfo_set_account( ttsi, ldd->ld.repIntAcct );
2865 gstr = g_string_sized_new( 32 );
2866 loan_get_ipmt_formula( ldd, gstr );
2867 gnc_ttsplitinfo_set_debit_formula( ttsi, gstr->str );
2868 gnc_ttinfo_append_template_split( ttxn, ttsi );
2869 g_string_free( gstr, TRUE );
2874 for ( i = 0; i < ldd->ld.repayOptCount; i++ )
2877 if ( ! rod->enabled )
2881 if ( rod->schedule != NULL )
2884 gstr = g_string_new( ldd->ld.repMemo );
2885 g_string_append_printf( gstr,
" - %s",
2887 tcSX->
name = g_strdup(gstr->str);
2888 tcSX->
start = *ldd->ld.startDate;
2889 tcSX->last = *ldd->ld.repStartDate;
2891 tcSX->end = tcSX->last;
2892 g_date_add_months( &tcSX->end, ldd->ld.numMonRemain );
2898 ld_calc_sx_instance_num(&tcSX->
start, rod->schedule);
2899 rod->schedule = NULL;
2900 tcSX->
mainTxn = gnc_ttinfo_malloc();
2901 gnc_ttinfo_set_currency( tcSX->
mainTxn,
2903 gnc_ttinfo_set_description( tcSX->
mainTxn,
2906 gnc_ttinfo_set_currency( tcSX->
escrowTxn,
2908 gnc_ttinfo_set_description( tcSX->
escrowTxn,
2911 g_string_free( gstr, TRUE );
2914 repaySXes = g_list_append( repaySXes, tcSX );
2919 ld_setup_repayment_sx( ldd, rod, paymentSX, tcSX );
2925 loan_create_sx_from_tcSX( ldd, paymentSX );
2927 for ( l = repaySXes; l; l = l->next )
2929 loan_create_sx_from_tcSX( ldd, (
toCreateSX*)l->data );
2933 loan_tcSX_free( paymentSX, NULL );
2934 g_list_foreach( repaySXes, loan_tcSX_free, NULL );
2935 g_list_free( repaySXes );
2941 loan_assistant_finish ( GtkAssistant *gtkassistant, gpointer user_data )
2944 loan_create_sxes( ldd );
2950 loan_assistant_cancel( GtkAssistant *gtkassistant, gpointer user_data )
2953 gnc_close_gui_component_by_data( DIALOG_LOAN_ASSISTANT_CM_CLASS, ldd );
2958 loan_assistant_close( GtkAssistant *gtkassistant, gpointer user_data )
2961 gnc_close_gui_component_by_data( DIALOG_LOAN_ASSISTANT_CM_CLASS, ldd );
2966 loan_assistant_prepare (GtkAssistant *assistant, GtkWidget *page,
2969 gint currentpage = gtk_assistant_get_current_page(assistant);
2971 switch (currentpage)
2975 loan_info_prep (assistant, user_data);
2979 loan_opt_prep (assistant, user_data);
2983 loan_rep_prep (assistant, user_data);
2987 loan_pay_prep (assistant, user_data);
2991 loan_rev_prep (assistant, user_data);
3003 gnc_ui_sx_loan_assistant_create (
void)
3010 gnc_loan_assistant_create (ldd);
3012 component_id = gnc_register_gui_component (DIALOG_LOAN_ASSISTANT_CM_CLASS,
3013 NULL, loan_assistant_close_handler,
3016 gnc_gui_component_watch_entity_type (component_id,
3018 QOF_EVENT_MODIFY | QOF_EVENT_DESTROY);
3020 gtk_widget_show_all (ldd->window);
3022 gnc_window_adjust_for_screen (GTK_WINDOW(ldd->window));
void gnc_sx_set_schedule(SchedXaction *sx, GList *schedule)
void gnc_sx_set_instance_count(SchedXaction *sx, gint instance_num)
Date and Time handling routines.
gnc_numeric double_to_gnc_numeric(double n, gint64 denom, gint how)
utility functions for the GnuCash UI
#define DEBUG(format, args...)
#define PERR(format, args...)
gnc_commodity * gnc_default_currency(void)
void gnc_tm_free(struct tm *time)
free a struct tm* created with gnc_localtime() or gnc_gmtime()
guint gnc_gdate_hash(gconstpointer gd)
gdouble gnc_numeric_to_double(gnc_numeric n)
Account handling public routines.
gnc_numeric gnc_numeric_convert(gnc_numeric n, gint64 denom, gint how)
gboolean gnc_gdate_equal(gconstpointer gda, gconstpointer gdb)
gnc_numeric gnc_numeric_error(GNCNumericErrorCode error_code)
Anchor Scheduled Transaction info in a book. See src/doc/books.txt for design overview.
time64 gnc_mktime(struct tm *time)
calculate seconds from the epoch given a time struct
void xaccSchedXactionSetTemplateTrans(SchedXaction *sx, GList *t_t_list, QofBook *book)
Set the schedxaction's template transaction.
struct tm * gnc_localtime(const time64 *secs)
fill out a time struct from a 64-bit time value.
All type declarations for the whole Gnucash engine.
int xaccSPrintAmount(char *bufp, gnc_numeric val, GNCPrintAmountInfo info)
void xaccSchedXactionSetName(SchedXaction *sx, const gchar *newName)
time64 gnc_time(time64 *tbuf)
get the current local time
GNCNumericErrorCode gnc_numeric_check(gnc_numeric a)
SchedXaction * xaccSchedXactionMalloc(QofBook *book)
Scheduled Transactions public handling routines.
void xaccSchedXactionSetEndDate(SchedXaction *sx, const GDate *newEnd)
#define GNC_HOW_DENOM_SIGFIGS(n)
size_t qof_print_gdate(char *buf, size_t bufflen, const GDate *gd)
const gchar * QofLogModule
void gnc_gdate_set_time64(GDate *gd, time64 time)