31 #include <glib/gi18n.h> 40 #include "TransactionP.hpp" 45 #include "qofinstance-p.h" 51 #include <unordered_set> 53 static QofLogModule log_module = GNC_MOD_ACCOUNT;
56 static gchar account_separator[8] =
".";
57 static gunichar account_uc_separator =
':';
59 static bool imap_convert_bayes_to_flat_run =
false;
62 static const std::string KEY_ASSOC_INCOME_ACCOUNT(
"ofx/associated-income-account");
63 static const std::string KEY_RECONCILE_INFO(
"reconcile-info");
64 static const std::string KEY_INCLUDE_CHILDREN(
"include-children");
65 static const std::string KEY_POSTPONE(
"postpone");
66 static const std::string KEY_LOT_MGMT(
"lot-mgmt");
67 static const std::string KEY_ONLINE_ID(
"online_id");
68 static const std::string KEY_IMP_APPEND_TEXT(
"import-append-text");
69 static const std::string AB_KEY(
"hbci");
70 static const std::string AB_ACCOUNT_ID(
"account-id");
71 static const std::string AB_ACCOUNT_UID(
"account-uid");
72 static const std::string AB_BANK_CODE(
"bank-code");
73 static const std::string AB_TRANS_RETRIEVAL(
"trans-retrieval");
75 static const std::string KEY_BALANCE_LIMIT(
"balance-limit");
76 static const std::string KEY_BALANCE_HIGHER_LIMIT_VALUE(
"higher-value");
77 static const std::string KEY_BALANCE_LOWER_LIMIT_VALUE(
"lower-value");
78 static const std::string KEY_BALANCE_INCLUDE_SUB_ACCTS(
"inlude-sub-accts");
80 using FinalProbabilityVec=std::vector<std::pair<std::string, int32_t>>;
81 using ProbabilityVec=std::vector<std::pair<std::string, struct AccountProbability>>;
82 using FlatKvpEntry=std::pair<std::string, KvpValue*>;
105 PROP_END_NOCLOSING_BALANCE,
106 PROP_END_CLEARED_BALANCE,
107 PROP_END_RECONCILED_BALANCE,
112 PROP_TAX_COPY_NUMBER,
123 PROP_IMP_APPEND_TEXT,
124 PROP_IS_OPENING_BALANCE,
125 PROP_OFX_INCOME_ACCOUNT,
129 PROP_AB_TRANS_RETRIEVAL,
137 PROP_START_NOCLOSING_BALANCE,
138 PROP_START_CLEARED_BALANCE,
139 PROP_START_RECONCILED_BALANCE,
142 #define GET_PRIVATE(o) \ 143 ((AccountPrivate*)gnc_account_get_instance_private((Account*)o)) 146 static const std::map<GNCAccountType, const char*> gnc_acct_debit_strs = {
163 static const char* dflt_acct_debit_str = N_(
"Debit");
166 static const std::map<GNCAccountType, const char*> gnc_acct_credit_strs = {
183 static const char* dflt_acct_credit_str = N_(
"Credit");
192 static void xaccAccountBringUpToDate (
Account *acc);
205 return account_separator;
209 gnc_get_account_separator (
void)
211 return account_uc_separator;
215 gnc_set_account_separator (
const gchar *separator)
220 uc = g_utf8_get_char_validated(separator, -1);
221 if ((uc == (gunichar) - 2) || (uc == (gunichar) - 1) || g_unichar_isalnum(uc))
223 account_uc_separator =
':';
224 strcpy(account_separator,
":");
228 account_uc_separator = uc;
229 count = g_unichar_to_utf8(uc, account_separator);
230 account_separator[count] =
'\0';
235 gchar *message =
nullptr;
237 if ( !invalid_account_names )
246 message = g_strdup_printf(
247 _(
"The separator character \"%s\" is used in one or more account names.\n\n" 248 "This will result in unexpected behaviour. " 249 "Either change the account names or choose another separator character.\n\n" 250 "Below you will find the list of invalid account names:\n" 251 "%s"), separator, account_list );
252 g_free ( account_list );
259 const gchar *separator;
263 check_acct_name (
Account *acct, gpointer user_data)
267 if (g_strstr_len (name, -1, cb->separator))
268 cb->list = g_list_prepend (cb->list, g_strdup (name));
273 g_return_val_if_fail (separator !=
nullptr,
nullptr);
274 if (!book)
return nullptr;
277 (AccountCb)check_acct_name, &cb);
284 static inline void mark_account (
Account *acc);
288 qof_instance_set_dirty(&acc->inst);
295 G_DEFINE_TYPE_WITH_PRIVATE(
Account, gnc_account, QOF_TYPE_INSTANCE)
302 priv = GET_PRIVATE(acc);
303 priv->parent =
nullptr;
314 priv->lots =
nullptr;
316 priv->commodity =
nullptr;
317 priv->commodity_scu = 0;
318 priv->non_standard_scu = FALSE;
320 priv->balance = gnc_numeric_zero();
321 priv->noclosing_balance = gnc_numeric_zero();
322 priv->cleared_balance = gnc_numeric_zero();
323 priv->reconciled_balance = gnc_numeric_zero();
324 priv->starting_balance = gnc_numeric_zero();
325 priv->starting_noclosing_balance = gnc_numeric_zero();
326 priv->starting_cleared_balance = gnc_numeric_zero();
327 priv->starting_reconciled_balance = gnc_numeric_zero();
328 priv->balance_dirty = FALSE;
330 new (&priv->children) AccountVec ();
331 new (&priv->splits) SplitsVec ();
332 priv->splits_hash = g_hash_table_new (g_direct_hash, g_direct_equal);
333 priv->sort_dirty = FALSE;
337 gnc_account_dispose (GObject *acctp)
339 G_OBJECT_CLASS(gnc_account_parent_class)->dispose(acctp);
343 gnc_account_finalize(GObject* acctp)
345 G_OBJECT_CLASS(gnc_account_parent_class)->finalize(acctp);
355 gnc_account_get_property (GObject *
object,
363 g_return_if_fail(GNC_IS_ACCOUNT(
object));
365 account = GNC_ACCOUNT(
object);
366 priv = GET_PRIVATE(account);
370 g_value_set_string(value, priv->accountName);
376 g_value_set_string(value, priv->accountCode);
378 case PROP_DESCRIPTION:
379 g_value_set_string(value, priv->description);
389 g_value_set_int(value, priv->type);
392 g_value_take_object(value, priv->commodity);
394 case PROP_COMMODITY_SCU:
395 g_value_set_int(value, priv->commodity_scu);
397 case PROP_NON_STD_SCU:
398 g_value_set_boolean(value, priv->non_standard_scu);
400 case PROP_SORT_DIRTY:
401 g_value_set_boolean(value, priv->sort_dirty);
403 case PROP_BALANCE_DIRTY:
404 g_value_set_boolean(value, priv->balance_dirty);
406 case PROP_START_BALANCE:
407 g_value_set_boxed(value, &priv->starting_balance);
409 case PROP_START_NOCLOSING_BALANCE:
410 g_value_set_boxed(value, &priv->starting_noclosing_balance);
412 case PROP_START_CLEARED_BALANCE:
413 g_value_set_boxed(value, &priv->starting_cleared_balance);
415 case PROP_START_RECONCILED_BALANCE:
416 g_value_set_boxed(value, &priv->starting_reconciled_balance);
418 case PROP_END_BALANCE:
419 g_value_set_boxed(value, &priv->balance);
421 case PROP_END_NOCLOSING_BALANCE:
422 g_value_set_boxed(value, &priv->noclosing_balance);
424 case PROP_END_CLEARED_BALANCE:
425 g_value_set_boxed(value, &priv->cleared_balance);
427 case PROP_END_RECONCILED_BALANCE:
428 g_value_set_boxed(value, &priv->reconciled_balance);
432 g_value_set_pointer(value, priv->policy);
435 g_value_set_int(value, priv->mark);
437 case PROP_TAX_RELATED:
443 case PROP_TAX_SOURCE:
444 g_value_set_string(value,
447 case PROP_TAX_COPY_NUMBER:
448 g_value_set_int64(value,
454 case PROP_AUTO_INTEREST:
457 case PROP_IS_OPENING_BALANCE:
460 case PROP_PLACEHOLDER:
466 case PROP_SORT_ORDER:
469 case PROP_SORT_REVERSED:
472 case PROP_LOT_NEXT_ID:
474 g_value_set_int64 (value, 0);
475 qof_instance_get_path_kvp (QOF_INSTANCE (account), value, {KEY_LOT_MGMT,
"next-id"});
477 case PROP_ONLINE_ACCOUNT:
478 qof_instance_get_path_kvp (QOF_INSTANCE (account), value, {KEY_ONLINE_ID});
480 case PROP_IMP_APPEND_TEXT:
483 case PROP_OFX_INCOME_ACCOUNT:
484 qof_instance_get_path_kvp (QOF_INSTANCE (account), value, {KEY_ASSOC_INCOME_ACCOUNT});
486 case PROP_AB_ACCOUNT_ID:
487 qof_instance_get_path_kvp (QOF_INSTANCE (account), value, {AB_KEY, AB_ACCOUNT_ID});
489 case PROP_AB_ACCOUNT_UID:
490 qof_instance_get_path_kvp (QOF_INSTANCE (account), value, {AB_KEY, AB_ACCOUNT_UID});
492 case PROP_AB_BANK_CODE:
493 qof_instance_get_path_kvp (QOF_INSTANCE (account), value, {AB_KEY, AB_BANK_CODE});
495 case PROP_AB_TRANS_RETRIEVAL:
496 qof_instance_get_path_kvp (QOF_INSTANCE (account), value, {AB_KEY, AB_TRANS_RETRIEVAL});
499 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, prop_id, pspec);
505 gnc_account_set_property (GObject *
object,
512 g_return_if_fail(GNC_IS_ACCOUNT(
object));
513 account = GNC_ACCOUNT(
object);
514 if (prop_id < PROP_RUNTIME_0)
515 g_assert (qof_instance_get_editlevel(account));
525 case PROP_DESCRIPTION:
541 case PROP_COMMODITY_SCU:
544 case PROP_NON_STD_SCU:
547 case PROP_SORT_DIRTY:
550 case PROP_BALANCE_DIRTY:
553 case PROP_START_BALANCE:
554 number =
static_cast<gnc_numeric*
>(g_value_get_boxed(value));
557 case PROP_START_CLEARED_BALANCE:
558 number =
static_cast<gnc_numeric*
>(g_value_get_boxed(value));
561 case PROP_START_RECONCILED_BALANCE:
562 number =
static_cast<gnc_numeric*
>(g_value_get_boxed(value));
571 case PROP_TAX_RELATED:
577 case PROP_TAX_SOURCE:
579 g_value_get_string(value));
581 case PROP_TAX_COPY_NUMBER:
583 g_value_get_int64(value));
588 case PROP_AUTO_INTEREST:
591 case PROP_IS_OPENING_BALANCE:
594 case PROP_PLACEHOLDER:
600 case PROP_SORT_ORDER:
603 case PROP_SORT_REVERSED:
606 case PROP_LOT_NEXT_ID:
607 qof_instance_set_path_kvp (QOF_INSTANCE (account), value, {KEY_LOT_MGMT,
"next-id"});
609 case PROP_ONLINE_ACCOUNT:
610 qof_instance_set_path_kvp (QOF_INSTANCE (account), value, {KEY_ONLINE_ID});
612 case PROP_IMP_APPEND_TEXT:
615 case PROP_OFX_INCOME_ACCOUNT:
616 qof_instance_set_path_kvp (QOF_INSTANCE (account), value, {KEY_ASSOC_INCOME_ACCOUNT});
618 case PROP_AB_ACCOUNT_ID:
619 qof_instance_set_path_kvp (QOF_INSTANCE (account), value, {AB_KEY, AB_ACCOUNT_ID});
621 case PROP_AB_ACCOUNT_UID:
622 qof_instance_set_path_kvp (QOF_INSTANCE (account), value, {AB_KEY, AB_ACCOUNT_UID});
624 case PROP_AB_BANK_CODE:
625 qof_instance_set_path_kvp (QOF_INSTANCE (account), value, {AB_KEY, AB_BANK_CODE});
627 case PROP_AB_TRANS_RETRIEVAL:
628 qof_instance_set_path_kvp (QOF_INSTANCE (account), value, {AB_KEY, AB_TRANS_RETRIEVAL});
631 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object, prop_id, pspec);
639 GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
641 gobject_class->dispose = gnc_account_dispose;
642 gobject_class->finalize = gnc_account_finalize;
643 gobject_class->set_property = gnc_account_set_property;
644 gobject_class->get_property = gnc_account_get_property;
646 g_object_class_install_property
649 g_param_spec_string (
"name",
651 "The accountName is an arbitrary string " 652 "assigned by the user. It is intended to " 653 "a short, 5 to 30 character long string " 654 "that is displayed by the GUI as the " 655 "account mnemonic. Account names may be " 656 "repeated. but no two accounts that share " 657 "a parent may have the same name.",
659 static_cast<GParamFlags>(G_PARAM_READWRITE)));
661 g_object_class_install_property
664 g_param_spec_string (
"fullname",
666 "The name of the account concatenated with " 667 "all its parent account names to indicate " 670 static_cast<GParamFlags>(G_PARAM_READABLE)));
672 g_object_class_install_property
675 g_param_spec_string (
"code",
677 "The account code is an arbitrary string " 678 "assigned by the user. It is intended to " 679 "be reporting code that is a synonym for " 682 static_cast<GParamFlags>(G_PARAM_READWRITE)));
684 g_object_class_install_property
687 g_param_spec_string (
"description",
688 "Account Description",
689 "The account description is an arbitrary " 690 "string assigned by the user. It is intended " 691 "to be a longer, 1-5 sentence description of " 692 "what this account is all about.",
694 static_cast<GParamFlags>(G_PARAM_READWRITE)));
696 g_object_class_install_property
699 g_param_spec_string (
"color",
701 "The account color is a color string assigned " 702 "by the user. It is intended to highlight the " 703 "account based on the users wishes.",
705 static_cast<GParamFlags>(G_PARAM_READWRITE)));
707 g_object_class_install_property
710 g_param_spec_string (
"notes",
712 "The account notes is an arbitrary provided " 713 "for the user to attach any other text that " 714 "they would like to associate with the account.",
716 static_cast<GParamFlags>(G_PARAM_READWRITE)));
718 g_object_class_install_property
721 g_param_spec_int (
"type",
723 "The account type, picked from the enumerated list " 724 "that includes ACCT_TYPE_BANK, ACCT_TYPE_STOCK, " 725 "ACCT_TYPE_CREDIT, ACCT_TYPE_INCOME, etc.",
729 static_cast<GParamFlags>(G_PARAM_READWRITE)));
731 g_object_class_install_property
734 g_param_spec_object (
"commodity",
736 "The commodity field denotes the kind of " 737 "'stuff' stored in this account, whether " 738 "it is USD, gold, stock, etc.",
740 static_cast<GParamFlags>(G_PARAM_READWRITE)));
742 g_object_class_install_property
745 g_param_spec_int (
"commodity-scu",
747 "The smallest fraction of the commodity that is " 748 "tracked. This number is used as the denominator " 749 "value in 1/x, so a value of 100 says that the " 750 "commodity can be divided into hundredths. E.G." 751 "1 USD can be divided into 100 cents.",
755 static_cast<GParamFlags>(G_PARAM_READWRITE)));
757 g_object_class_install_property
760 g_param_spec_boolean (
"non-std-scu",
762 "TRUE if the account SCU doesn't match " 763 "the commodity SCU. This indicates a case " 764 "where the two were accidentally set to " 765 "mismatched values in older versions of " 768 static_cast<GParamFlags>(G_PARAM_READWRITE)));
770 g_object_class_install_property
773 g_param_spec_boolean(
"sort-dirty",
775 "TRUE if the splits in the account needs to be " 776 "resorted. This flag is set by the accounts " 777 "code for certain internal modifications, or " 778 "when external code calls the engine to say a " 779 "split has been modified in a way that may " 780 "affect the sort order of the account. Note: " 781 "This value can only be set to TRUE.",
783 static_cast<GParamFlags>(G_PARAM_READWRITE)));
785 g_object_class_install_property
788 g_param_spec_boolean(
"balance-dirty",
790 "TRUE if the running balances in the account " 791 "needs to be recalculated. This flag is set " 792 "by the accounts code for certain internal " 793 "modifications, or when external code calls " 794 "the engine to say a split has been modified. " 795 "Note: This value can only be set to TRUE.",
797 static_cast<GParamFlags>(G_PARAM_READWRITE)));
799 g_object_class_install_property
802 g_param_spec_boxed(
"start-balance",
804 "The starting balance for the account. This " 805 "parameter is intended for use with backends that " 806 "do not return the complete list of splits for an " 807 "account, but rather return a partial list. In " 808 "such a case, the backend will typically return " 809 "all of the splits after some certain date, and " 810 "the 'starting balance' will represent the " 811 "summation of the splits up to that date.",
813 static_cast<GParamFlags>(G_PARAM_READWRITE)));
815 g_object_class_install_property
817 PROP_START_NOCLOSING_BALANCE,
818 g_param_spec_boxed(
"start-noclosing-balance",
819 "Starting No-closing Balance",
820 "The starting balance for the account, ignoring closing." 821 "This parameter is intended for use with backends " 822 "that do not return the complete list of splits " 823 "for an account, but rather return a partial " 824 "list. In such a case, the backend will " 825 "typically return all of the splits after " 826 "some certain date, and the 'starting noclosing " 827 "balance' will represent the summation of the " 828 "splits up to that date, ignoring closing splits.",
830 static_cast<GParamFlags>(G_PARAM_READWRITE)));
832 g_object_class_install_property
834 PROP_START_CLEARED_BALANCE,
835 g_param_spec_boxed(
"start-cleared-balance",
836 "Starting Cleared Balance",
837 "The starting cleared balance for the account. " 838 "This parameter is intended for use with backends " 839 "that do not return the complete list of splits " 840 "for an account, but rather return a partial " 841 "list. In such a case, the backend will " 842 "typically return all of the splits after " 843 "some certain date, and the 'starting cleared " 844 "balance' will represent the summation of the " 845 "splits up to that date.",
847 static_cast<GParamFlags>(G_PARAM_READWRITE)));
849 g_object_class_install_property
851 PROP_START_RECONCILED_BALANCE,
852 g_param_spec_boxed(
"start-reconciled-balance",
853 "Starting Reconciled Balance",
854 "The starting reconciled balance for the " 855 "account. This parameter is intended for use " 856 "with backends that do not return the complete " 857 "list of splits for an account, but rather return " 858 "a partial list. In such a case, the backend " 859 "will typically return all of the splits after " 860 "some certain date, and the 'starting reconciled " 861 "balance' will represent the summation of the " 862 "splits up to that date.",
864 static_cast<GParamFlags>(G_PARAM_READWRITE)));
866 g_object_class_install_property
869 g_param_spec_boxed(
"end-balance",
870 "Ending Account Balance",
871 "This is the current ending balance for the " 872 "account. It is computed from the sum of the " 873 "starting balance and all splits in the account.",
877 g_object_class_install_property
879 PROP_END_NOCLOSING_BALANCE,
880 g_param_spec_boxed(
"end-noclosing-balance",
881 "Ending Account Noclosing Balance",
882 "This is the current ending no-closing balance for " 883 "the account. It is computed from the sum of the " 884 "starting balance and all cleared splits in the " 889 g_object_class_install_property
891 PROP_END_CLEARED_BALANCE,
892 g_param_spec_boxed(
"end-cleared-balance",
893 "Ending Account Cleared Balance",
894 "This is the current ending cleared balance for " 895 "the account. It is computed from the sum of the " 896 "starting balance and all cleared splits in the " 901 g_object_class_install_property
903 PROP_END_RECONCILED_BALANCE,
904 g_param_spec_boxed(
"end-reconciled-balance",
905 "Ending Account Reconciled Balance",
906 "This is the current ending reconciled balance " 907 "for the account. It is computed from the sum of " 908 "the starting balance and all reconciled splits " 911 static_cast<GParamFlags>(G_PARAM_READABLE)));
913 g_object_class_install_property
916 g_param_spec_pointer (
"policy",
918 "The account lots policy.",
919 static_cast<GParamFlags>(G_PARAM_READWRITE)));
921 g_object_class_install_property
924 g_param_spec_int (
"acct-mark",
930 static_cast<GParamFlags>(G_PARAM_READWRITE)));
932 g_object_class_install_property
935 g_param_spec_boolean (
"tax-related",
937 "Whether the account maps to an entry on an " 938 "income tax document.",
940 static_cast<GParamFlags>(G_PARAM_READWRITE)));
942 g_object_class_install_property
944 PROP_IS_OPENING_BALANCE,
945 g_param_spec_boolean (
"opening-balance",
947 "Whether the account holds opening balances",
949 static_cast<GParamFlags>(G_PARAM_READWRITE)));
951 g_object_class_install_property
954 g_param_spec_string (
"tax-code",
956 "This is the code for mapping an account to a " 957 "specific entry on a taxable document. In the " 958 "United States it is used to transfer totals " 959 "into tax preparation software.",
961 static_cast<GParamFlags>(G_PARAM_READWRITE)));
963 g_object_class_install_property
966 g_param_spec_string (
"tax-source",
968 "This specifies where exported name comes from.",
970 static_cast<GParamFlags>(G_PARAM_READWRITE)));
972 g_object_class_install_property
974 PROP_TAX_COPY_NUMBER,
975 g_param_spec_int64 (
"tax-copy-number",
977 "This specifies the copy number of the tax " 982 static_cast<GParamFlags>(G_PARAM_READWRITE)));
984 g_object_class_install_property
987 g_param_spec_boolean (
"hidden",
989 "Whether the account should be hidden in the " 992 static_cast<GParamFlags>(G_PARAM_READWRITE)));
994 g_object_class_install_property
997 g_param_spec_boolean (
"auto-interest-transfer",
999 "Whether an interest transfer should be automatically " 1000 "added before reconcile.",
1002 static_cast<GParamFlags>(G_PARAM_READWRITE)));
1004 g_object_class_install_property
1007 g_param_spec_boolean (
"placeholder",
1009 "Whether the account is a placeholder account which does not " 1010 "allow transactions to be created, edited or deleted.",
1012 static_cast<GParamFlags>(G_PARAM_READWRITE)));
1014 g_object_class_install_property
1017 g_param_spec_string (
"filter",
1019 "The account filter is a value saved to allow " 1020 "filters to be recalled.",
1022 static_cast<GParamFlags>(G_PARAM_READWRITE)));
1024 g_object_class_install_property
1027 g_param_spec_string (
"sort-order",
1028 "Account Sort Order",
1029 "The account sort order is a value saved to allow " 1030 "the sort order to be recalled.",
1032 static_cast<GParamFlags>(G_PARAM_READWRITE)));
1034 g_object_class_install_property
1037 g_param_spec_boolean (
"sort-reversed",
1038 "Account Sort Reversed",
1039 "Parameter to store whether the sort order is reversed or not.",
1041 static_cast<GParamFlags>(G_PARAM_READWRITE)));
1043 g_object_class_install_property
1046 g_param_spec_int64 (
"lot-next-id",
1048 "Tracks the next id to use in gnc_lot_make_default.",
1052 static_cast<GParamFlags>(G_PARAM_READWRITE)));
1054 g_object_class_install_property
1056 PROP_ONLINE_ACCOUNT,
1057 g_param_spec_string (
"online-id",
1058 "Online Account ID",
1059 "The online account which corresponds to this " 1060 "account for OFX import",
1062 static_cast<GParamFlags>(G_PARAM_READWRITE)));
1064 g_object_class_install_property
1066 PROP_IMP_APPEND_TEXT,
1067 g_param_spec_boolean (
"import-append-text",
1068 "Import Append Text",
1069 "Saved state of Append checkbox for setting initial " 1070 "value next time this account is imported.",
1072 static_cast<GParamFlags>(G_PARAM_READWRITE)));
1074 g_object_class_install_property(
1076 PROP_OFX_INCOME_ACCOUNT,
1077 g_param_spec_boxed(
"ofx-income-account",
1078 "Associated income account",
1079 "Used by the OFX importer.",
1081 static_cast<GParamFlags>(G_PARAM_READWRITE)));
1083 g_object_class_install_property
1086 g_param_spec_string (
"ab-account-id",
1087 "AQBanking Account ID",
1088 "The AqBanking account which corresponds to this " 1089 "account for AQBanking import",
1091 static_cast<GParamFlags>(G_PARAM_READWRITE)));
1092 g_object_class_install_property
1095 g_param_spec_string (
"ab-bank-code",
1096 "AQBanking Bank Code",
1097 "The online account which corresponds to this " 1098 "account for AQBanking import",
1100 static_cast<GParamFlags>(G_PARAM_READWRITE)));
1102 g_object_class_install_property
1104 PROP_AB_ACCOUNT_UID,
1105 g_param_spec_int64 (
"ab-account-uid",
1106 "AQBanking Account UID",
1107 "Tracks the next id to use in gnc_lot_make_default.",
1111 static_cast<GParamFlags>(G_PARAM_READWRITE)));
1113 g_object_class_install_property
1115 PROP_AB_TRANS_RETRIEVAL,
1116 g_param_spec_boxed(
"ab-trans-retrieval",
1117 "AQBanking Last Transaction Retrieval",
1118 "The time of the last transaction retrieval for this " 1121 static_cast<GParamFlags>(G_PARAM_READWRITE)));
1126 xaccInitAccount (
Account * acc, QofBook *book)
1128 ENTER (
"book=%p\n", book);
1131 LEAVE (
"account=%p\n", acc);
1138 gnc_account_foreach_split (
const Account *acc, std::function<
void(Split*)> func,
1141 if (!GNC_IS_ACCOUNT (acc))
1144 auto& splits{GET_PRIVATE(acc)->splits};
1146 std::for_each(splits.rbegin(), splits.rend(), func);
1148 std::for_each(splits.begin(), splits.end(), func);
1152 gnc_account_foreach_split_until_date (
const Account *acc,
time64 end_date,
1153 std::function<
void(Split*)> f)
1155 if (!GNC_IS_ACCOUNT (acc))
1158 auto after_date = [](
time64 end_date,
auto s) ->
bool 1161 auto& splits{GET_PRIVATE(acc)->splits};
1162 auto after_date_iter = std::upper_bound (splits.begin(), splits.end(), end_date, after_date);
1163 std::for_each (splits.begin(), after_date_iter, f);
1171 if (!GNC_IS_ACCOUNT (acc))
1174 const auto& splits{GET_PRIVATE(acc)->splits};
1177 auto latest = std::find_if(splits.rbegin(), splits.rend(), predicate);
1178 return (latest == splits.rend()) ?
nullptr : *latest;
1182 auto earliest = std::find_if(splits.begin(), splits.end(), predicate);
1183 return (earliest == splits.end()) ?
nullptr : *earliest;
1191 gnc_account_get_book(
const Account *account)
1193 if (!account)
return nullptr;
1201 gnc_coll_get_root_account (QofCollection *col)
1203 if (!col)
return nullptr;
1208 gnc_coll_set_root_account (QofCollection *col,
Account *root)
1214 old_root = gnc_coll_get_root_account (col);
1215 if (old_root == root)
return;
1220 rpriv = GET_PRIVATE(root);
1228 qof_collection_set_data (col, root);
1238 gnc_book_get_root_account (QofBook *book)
1243 if (!book)
return nullptr;
1245 root = gnc_coll_get_root_account (col);
1252 gnc_book_set_root_account (QofBook *book,
Account *root)
1257 if (root && gnc_account_get_book(root) != book)
1259 PERR (
"cannot mix and match books freely!");
1264 gnc_coll_set_root_account (col, root);
1275 g_return_val_if_fail (book,
nullptr);
1277 acc =
static_cast<Account*
>(g_object_new (GNC_TYPE_ACCOUNT,
nullptr));
1278 xaccInitAccount (acc, book);
1291 rpriv = GET_PRIVATE(root);
1295 mark_account (root);
1297 gnc_book_set_root_account(book, root);
1307 g_return_val_if_fail(GNC_IS_ACCOUNT(from),
nullptr);
1308 g_return_val_if_fail(QOF_IS_BOOK(book),
nullptr);
1311 ret =
static_cast<Account*
>(g_object_new (GNC_TYPE_ACCOUNT,
nullptr));
1312 g_return_val_if_fail (ret,
nullptr);
1314 from_priv = GET_PRIVATE(from);
1315 priv = GET_PRIVATE(ret);
1316 xaccInitAccount (ret, book);
1321 priv->type = from_priv->type;
1327 qof_instance_copy_kvp (QOF_INSTANCE (ret), QOF_INSTANCE (from));
1334 priv->commodity_scu = from_priv->commodity_scu;
1335 priv->non_standard_scu = from_priv->non_standard_scu;
1337 qof_instance_set_dirty(&ret->inst);
1346 xaccFreeOneChildAccount (
Account *acc)
1350 if (qof_instance_get_editlevel(acc) == 0)
1356 xaccFreeAccountChildren (
Account *acc)
1358 auto priv{GET_PRIVATE(acc)};
1360 auto children = priv->children;
1361 std::for_each (children.begin(), children.end(), xaccFreeOneChildAccount);
1364 priv->children.clear();
1372 xaccFreeAccount (
Account *acc)
1377 g_return_if_fail(GNC_IS_ACCOUNT(acc));
1379 priv = GET_PRIVATE(acc);
1386 qof_instance_set_destroying(acc, TRUE);
1388 if (!priv->children.empty())
1390 PERR (
" instead of calling xaccFreeAccount(), please call\n" 1391 " xaccAccountBeginEdit(); xaccAccountDestroy();\n");
1394 xaccFreeAccountChildren(acc);
1400 PERR (
" instead of calling xaccFreeAccount(), please call\n" 1401 " xaccAccountBeginEdit(); xaccAccountDestroy();\n");
1403 for (lp = priv->lots; lp; lp = lp->next)
1405 GNCLot *lot =
static_cast<GNCLot*
>(lp->data);
1406 gnc_lot_destroy (lot);
1408 g_list_free (priv->lots);
1409 priv->lots =
nullptr;
1416 if (!priv->splits.empty())
1418 PERR (
" instead of calling xaccFreeAccount(), please call\n" 1419 " xaccAccountBeginEdit(); xaccAccountDestroy();\n");
1421 qof_instance_reset_editlevel(acc);
1423 for (
auto s : priv->splits)
1436 priv->accountName = priv->accountCode = priv->description =
nullptr;
1441 priv->last_num =
nullptr;
1442 priv->tax_us_code =
nullptr;
1443 priv->tax_us_pns =
nullptr;
1444 priv->color =
nullptr;
1445 priv->sort_order =
nullptr;
1446 priv->notes =
nullptr;
1447 priv->filter =
nullptr;
1449 priv->parent =
nullptr;
1451 priv->balance = gnc_numeric_zero();
1452 priv->noclosing_balance = gnc_numeric_zero();
1453 priv->cleared_balance = gnc_numeric_zero();
1454 priv->reconciled_balance = gnc_numeric_zero();
1458 priv->commodity =
nullptr;
1460 priv->balance_dirty = FALSE;
1461 priv->sort_dirty = FALSE;
1462 priv->splits.~SplitsVec();
1463 priv->children.~AccountVec();
1464 g_hash_table_destroy (priv->splits_hash);
1467 g_object_unref(acc);
1477 g_return_if_fail(acc);
1489 PERR(
"commit error: %d", errcode);
1490 gnc_engine_signal_commit_error( errcode );
1498 priv = GET_PRIVATE(acc);
1501 xaccFreeAccount(acc);
1505 destroy_pending_splits_for_account(
QofInstance *ent, gpointer acc)
1507 Transaction *trans = (Transaction *) ent;
1511 while ((split = xaccTransFindSplitByAccount(trans, static_cast<Account*>(acc))))
1521 g_return_if_fail(acc);
1526 priv = GET_PRIVATE(acc);
1531 qof_instance_increase_editlevel(acc);
1534 xaccFreeAccountChildren(acc);
1536 PINFO (
"freeing splits for account %p (%s)",
1537 acc, priv->accountName ? priv->accountName :
"(null)");
1546 for_each(priv->splits.rbegin(), priv->splits.rend(), [](Split *s) {
1551 priv->splits.clear();
1552 g_hash_table_remove_all (priv->splits_hash);
1566 qof_collection_foreach(col, destroy_pending_splits_for_account, acc);
1569 for (
auto lp = priv->lots; lp; lp = lp->next)
1571 GNCLot *lot =
static_cast<GNCLot*
>(lp->data);
1572 gnc_lot_destroy (lot);
1575 g_list_free(priv->lots);
1576 priv->lots =
nullptr;
1578 qof_instance_set_dirty(&acc->inst);
1579 qof_instance_decrease_editlevel(acc);
1583 xaccAccountBringUpToDate(acc);
1592 g_return_if_fail(GNC_IS_ACCOUNT(acc));
1594 qof_instance_set_destroying(acc, TRUE);
1603 xaccAcctChildrenEqual(
const AccountVec& na,
1604 const AccountVec& nb,
1605 gboolean check_guids)
1607 if (na.size() != nb.size())
1609 PINFO (
"Accounts have different numbers of children");
1615 auto it_b = std::find_if (nb.begin(), nb.end(), [aa](
auto ab) ->
bool 1617 if (!aa)
return (!ab);
1618 if (!ab)
return false;
1619 auto code_a{GET_PRIVATE(aa)->accountCode};
1620 auto code_b{GET_PRIVATE(ab)->accountCode};
1621 if ((code_a && *code_a) || (code_b && *code_b))
return !g_strcmp0 (code_a, code_b);
1622 return !g_strcmp0 (GET_PRIVATE(aa)->accountName, GET_PRIVATE(ab)->accountName);
1625 if (it_b == nb.end())
1627 PINFO (
"Unable to find matching child account.");
1638 PWARN (
"accounts %s and %s differ", sa, sb);
1652 if (!aa && !ab)
return TRUE;
1654 g_return_val_if_fail(GNC_IS_ACCOUNT(aa), FALSE);
1655 g_return_val_if_fail(GNC_IS_ACCOUNT(ab), FALSE);
1657 priv_aa = GET_PRIVATE(aa);
1658 priv_ab = GET_PRIVATE(ab);
1659 if (priv_aa->type != priv_ab->type)
1661 PWARN (
"types differ: %d vs %d", priv_aa->type, priv_ab->type);
1665 if (g_strcmp0(priv_aa->accountName, priv_ab->accountName) != 0)
1667 PWARN (
"names differ: %s vs %s", priv_aa->accountName, priv_ab->accountName);
1671 if (g_strcmp0(priv_aa->accountCode, priv_ab->accountCode) != 0)
1673 PWARN (
"codes differ: %s vs %s", priv_aa->accountCode, priv_ab->accountCode);
1677 if (g_strcmp0(priv_aa->description, priv_ab->description) != 0)
1679 PWARN (
"descriptions differ: %s vs %s", priv_aa->description, priv_ab->description);
1685 PWARN (
"commodities differ");
1693 PWARN (
"GUIDs differ");
1698 if (qof_instance_compare_kvp (QOF_INSTANCE (aa), QOF_INSTANCE (ab)) != 0)
1703 frame_a = qof_instance_kvp_as_string (QOF_INSTANCE (aa));
1704 frame_b = qof_instance_kvp_as_string (QOF_INSTANCE (ab));
1706 PWARN (
"kvp frames differ:\n%s\n\nvs\n\n%s", frame_a, frame_b);
1722 PWARN (
"starting balances differ: %s vs %s", str_a, str_b);
1731 priv_ab->starting_noclosing_balance))
1739 PWARN (
"starting noclosing balances differ: %s vs %s", str_a, str_b);
1747 priv_ab->starting_cleared_balance))
1755 PWARN (
"starting cleared balances differ: %s vs %s", str_a, str_b);
1764 priv_ab->starting_reconciled_balance))
1772 PWARN (
"starting reconciled balances differ: %s vs %s", str_a, str_b);
1788 PWARN (
"balances differ: %s vs %s", str_a, str_b);
1804 PWARN (
"noclosing balances differ: %s vs %s", str_a, str_b);
1819 PWARN (
"cleared balances differ: %s vs %s", str_a, str_b);
1827 if (!
gnc_numeric_equal(priv_aa->reconciled_balance, priv_ab->reconciled_balance))
1835 PWARN (
"reconciled balances differ: %s vs %s", str_a, str_b);
1845 if (!std::equal (priv_aa->splits.begin(), priv_aa->splits.end(),
1846 priv_ab->splits.begin(), priv_ab->splits.end(),
1847 [check_guids](
auto sa,
auto sb)
1850 PWARN (
"splits differ");
1854 if (!xaccAcctChildrenEqual(priv_aa->children, priv_ab->children, check_guids))
1856 PWARN (
"children differ");
1870 g_return_if_fail(GNC_IS_ACCOUNT(acc));
1875 priv = GET_PRIVATE(acc);
1876 priv->sort_dirty = TRUE;
1884 g_return_if_fail(GNC_IS_ACCOUNT(acc));
1889 priv = GET_PRIVATE(acc);
1890 priv->balance_dirty = TRUE;
1897 g_return_if_fail (GNC_IS_ACCOUNT (acc));
1902 priv = GET_PRIVATE (acc);
1903 priv->defer_bal_computation = defer;
1911 priv = GET_PRIVATE (acc);
1912 return priv->defer_bal_computation;
1919 static bool split_cmp_less (
const Split* a,
const Split* b)
1929 g_return_val_if_fail(GNC_IS_ACCOUNT(acc), FALSE);
1930 g_return_val_if_fail(GNC_IS_SPLIT(s), FALSE);
1932 priv = GET_PRIVATE(acc);
1933 if (!g_hash_table_add (priv->splits_hash, s))
1936 priv->splits.push_back (s);
1938 if (qof_instance_get_editlevel(acc) == 0)
1939 std::sort (priv->splits.begin(), priv->splits.end(), split_cmp_less);
1941 priv->sort_dirty =
true;
1948 priv->balance_dirty = TRUE;
1959 g_return_val_if_fail(GNC_IS_ACCOUNT(acc), FALSE);
1960 g_return_val_if_fail(GNC_IS_SPLIT(s), FALSE);
1962 priv = GET_PRIVATE(acc);
1964 if (!g_hash_table_remove (priv->splits_hash, s))
1969 if (s == priv->splits.back())
1970 priv->splits.pop_back();
1972 priv->splits.erase (std::remove (priv->splits.begin(), priv->splits.end(), s),
1973 priv->splits.end());
1980 priv->balance_dirty = TRUE;
1990 g_return_if_fail(GNC_IS_ACCOUNT(acc));
1992 priv = GET_PRIVATE(acc);
1993 if (!priv->sort_dirty || (!force && qof_instance_get_editlevel(acc) > 0))
1995 std::sort (priv->splits.begin(), priv->splits.end(), split_cmp_less);
1996 priv->sort_dirty = FALSE;
1997 priv->balance_dirty = TRUE;
2001 xaccAccountBringUpToDate(
Account *acc)
2017 g_return_if_fail(GNC_IS_ACCOUNT(acc));
2018 g_return_if_fail(guid);
2021 PINFO(
"acct=%p", acc);
2023 qof_instance_set_guid (&acc->inst, guid);
2024 qof_instance_set_dirty(&acc->inst);
2035 if (!guid || !book)
return nullptr;
2048 g_return_if_fail(GNC_IS_ACCOUNT(acc));
2050 priv = GET_PRIVATE(acc);
2059 g_return_if_fail(GNC_IS_ACCOUNT(acc));
2070 g_return_if_fail(GNC_IS_ACCOUNT(acc));
2072 priv = GET_PRIVATE(acc);
2074 std::for_each (priv->children.begin(), priv->children.end(),
2084 g_return_val_if_fail(GNC_IS_ACCOUNT(acc),
nullptr);
2086 return GET_PRIVATE(acc)->policy;
2094 g_return_if_fail(GNC_IS_ACCOUNT(acc));
2096 priv = GET_PRIVATE(acc);
2104 xaccAccountRemoveLot (
Account *acc, GNCLot *lot)
2108 g_return_if_fail(GNC_IS_ACCOUNT(acc));
2109 g_return_if_fail(GNC_IS_LOT(lot));
2111 priv = GET_PRIVATE(acc);
2112 g_return_if_fail(priv->lots);
2114 ENTER (
"(acc=%p, lot=%p)", acc, lot);
2115 priv->lots = g_list_remove(priv->lots, lot);
2116 qof_event_gen (QOF_INSTANCE(lot), QOF_EVENT_REMOVE,
nullptr);
2118 LEAVE (
"(acc=%p, lot=%p)", acc, lot);
2129 g_return_if_fail(GNC_IS_ACCOUNT(acc));
2130 g_return_if_fail(GNC_IS_LOT(lot));
2134 if (lot_account == acc)
2137 ENTER (
"(acc=%p, lot=%p)", acc, lot);
2142 old_acc = lot_account;
2143 opriv = GET_PRIVATE(old_acc);
2144 opriv->lots = g_list_remove(opriv->lots, lot);
2147 priv = GET_PRIVATE(acc);
2148 priv->lots = g_list_prepend(priv->lots, lot);
2149 gnc_lot_set_account(lot, acc);
2159 LEAVE (
"(acc=%p, lot=%p)", acc, lot);
2165 xaccPreSplitMove (Split *split)
2171 xaccPostSplitMove (Split *split,
Account *accto)
2175 xaccSplitSetAccount(split, accto);
2187 g_return_if_fail(GNC_IS_ACCOUNT(accfrom));
2188 g_return_if_fail(GNC_IS_ACCOUNT(accto));
2191 from_priv = GET_PRIVATE(accfrom);
2192 if (from_priv->splits.empty() || accfrom == accto)
2197 ENTER (
"(accfrom=%p, accto=%p)", accfrom, accto);
2202 std::for_each (from_priv->splits.begin(), from_priv->splits.end(), xaccPreSplitMove);
2219 auto splits = from_priv->splits;
2220 std::for_each (splits.begin(), splits.end(), [accto](
auto s){ xaccPostSplitMove (s, accto); });
2223 g_assert(from_priv->splits.empty());
2224 g_assert(from_priv->lots ==
nullptr);
2228 LEAVE (
"(accfrom=%p, accto=%p)", accfrom, accto);
2264 gnc_numeric balance;
2265 gnc_numeric noclosing_balance;
2266 gnc_numeric cleared_balance;
2267 gnc_numeric reconciled_balance;
2269 if (
nullptr == acc)
return;
2271 priv = GET_PRIVATE(acc);
2272 if (qof_instance_get_editlevel(acc) > 0)
return;
2273 if (!priv->balance_dirty || priv->defer_bal_computation)
return;
2277 balance = priv->starting_balance;
2278 noclosing_balance = priv->starting_noclosing_balance;
2279 cleared_balance = priv->starting_cleared_balance;
2280 reconciled_balance = priv->starting_reconciled_balance;
2282 PINFO (
"acct=%s starting baln=%" G_GINT64_FORMAT
"/%" G_GINT64_FORMAT,
2283 priv->accountName, balance.num, balance.denom);
2284 for (
auto split : priv->splits)
2288 balance = gnc_numeric_add_fixed(balance, amt);
2290 if (
NREC != split->reconciled)
2292 cleared_balance = gnc_numeric_add_fixed(cleared_balance, amt);
2295 if (
YREC == split->reconciled ||
2296 FREC == split->reconciled)
2298 reconciled_balance =
2299 gnc_numeric_add_fixed(reconciled_balance, amt);
2303 noclosing_balance = gnc_numeric_add_fixed(noclosing_balance, amt);
2305 split->balance = balance;
2306 split->noclosing_balance = noclosing_balance;
2307 split->cleared_balance = cleared_balance;
2308 split->reconciled_balance = reconciled_balance;
2312 priv->balance = balance;
2313 priv->noclosing_balance = noclosing_balance;
2314 priv->cleared_balance = cleared_balance;
2315 priv->reconciled_balance = reconciled_balance;
2316 priv->balance_dirty = FALSE;
2335 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
2343 const char *da, *db;
2346 if ( aa && !ab )
return -1;
2347 if ( !aa && ab )
return +1;
2348 if ( !aa && !ab )
return 0;
2350 priv_aa = GET_PRIVATE(aa);
2351 priv_ab = GET_PRIVATE(ab);
2354 da = priv_aa->accountCode;
2355 db = priv_ab->accountCode;
2358 result = g_strcmp0 (da, db);
2364 if (-1 == revorder[0])
2369 revorder [typeorder[i]] = i;
2378 if (ta < tb)
return -1;
2379 if (ta > tb)
return +1;
2382 da = priv_aa->accountName;
2383 db = priv_ab->accountName;
2407 g_return_if_fail(GNC_IS_ACCOUNT(acc));
2411 priv = GET_PRIVATE(acc);
2412 if (priv->type == tip)
2417 priv->balance_dirty = TRUE;
2428 g_return_if_fail(GNC_IS_ACCOUNT(acc));
2429 g_return_if_fail(str);
2432 priv = GET_PRIVATE(acc);
2433 if (g_strcmp0(str, priv->accountName) == 0)
2448 g_return_if_fail(GNC_IS_ACCOUNT(acc));
2451 priv = GET_PRIVATE(acc);
2452 if (g_strcmp0(str, priv->accountCode) == 0)
2467 g_return_if_fail(GNC_IS_ACCOUNT(acc));
2470 priv = GET_PRIVATE(acc);
2471 if (g_strcmp0(str, priv->description) == 0)
2481 set_kvp_gnc_numeric_path (
Account *acc,
const std::vector<std::string>& path,
2482 std::optional<gnc_numeric> value)
2485 qof_instance_set_path_kvp<gnc_numeric> (QOF_INSTANCE(acc), value, path);
2489 static std::optional<gnc_numeric>
2490 get_kvp_gnc_numeric_path (
const Account *acc,
const Path& path)
2492 return qof_instance_get_path_kvp<gnc_numeric> (QOF_INSTANCE(acc), path);
2496 set_kvp_string_path (
Account *acc, std::vector<std::string>
const & path,
2499 std::optional<const char*> val;
2500 if (value && *value)
2501 val = g_strdup(value);
2504 qof_instance_set_path_kvp<const char*> (QOF_INSTANCE(acc), val, path);
2509 get_kvp_string_path (
const Account *acc,
const Path& path)
2511 auto rv{qof_instance_get_path_kvp<const char*> (QOF_INSTANCE(acc), path)};
2512 return rv ? *rv :
nullptr;
2516 set_kvp_account_path (
Account* acc,
const Path& path,
const Account* kvp_account)
2518 std::optional<GncGUID*> val;
2523 qof_instance_set_path_kvp<GncGUID*> (QOF_INSTANCE(acc), val, path);
2528 get_kvp_account_path (
const Account *acc,
const Path& path)
2530 auto val{qof_instance_get_path_kvp<GncGUID*> (QOF_INSTANCE(acc), path)};
2535 set_kvp_boolean_path (
Account *acc,
const Path& path, gboolean option)
2537 set_kvp_string_path (acc, path, option ?
"true" :
nullptr);
2541 get_kvp_boolean_path (
const Account *acc,
const Path& path)
2543 auto slot{QOF_INSTANCE(acc)->kvp_data->get_slot(path)};
2544 if (!slot)
return false;
2545 switch (slot->get_type())
2547 case KvpValueImpl::Type::INT64:
2548 return slot->get<int64_t>() != 0;
2549 case KvpValueImpl::Type::STRING:
2550 return g_strcmp0 (slot->get<
const char*>(),
"true") == 0;
2557 set_kvp_int64_path (
Account *acc,
const Path& path, std::optional<gint64> value)
2560 qof_instance_set_path_kvp<int64_t> (QOF_INSTANCE(acc), value, path);
2564 static const std::optional<gint64>
2565 get_kvp_int64_path (
const Account *acc,
const Path& path)
2567 return qof_instance_get_path_kvp<int64_t> (QOF_INSTANCE(acc), path);
2573 set_kvp_string_path (acc, {
"color"}, str);
2579 set_kvp_string_path (acc, {
"filter"}, str);
2585 set_kvp_string_path (acc, {
"sort-order"}, str);
2591 set_kvp_boolean_path (acc, {
"sort-reversed"}, sortreversed);
2599 g_return_if_fail(GNC_IS_ACCOUNT(acc));
2600 g_return_if_fail(GNC_IS_ACCOUNT(parent));
2602 parent_acc = GNC_ACCOUNT(parent);
2606 mark_account (parent_acc);
2615 set_kvp_string_path (acc, {
"notes"}, str);
2622 g_return_if_fail (GNC_IS_ACCOUNT(acc));
2623 g_return_if_fail (tag && *tag);
2625 set_kvp_account_path (acc, {
"associated-account", tag}, assoc_acct);
2634 g_return_if_fail(GNC_IS_ACCOUNT(acc));
2635 g_return_if_fail(GNC_IS_COMMODITY(com));
2638 priv = GET_PRIVATE(acc);
2639 if (com == priv->commodity)
2644 priv->commodity = com;
2647 priv->non_standard_scu = FALSE;
2650 for (
auto s : priv->splits)
2659 priv->sort_dirty = TRUE;
2660 priv->balance_dirty = TRUE;
2677 g_return_if_fail(GNC_IS_ACCOUNT(acc));
2679 priv = GET_PRIVATE(acc);
2681 priv->commodity_scu = scu;
2683 priv->non_standard_scu = TRUE;
2691 g_return_val_if_fail(GNC_IS_ACCOUNT(acc), 0);
2692 return GET_PRIVATE(acc)->commodity_scu;
2700 g_return_val_if_fail(GNC_IS_ACCOUNT(acc), 0);
2702 priv = GET_PRIVATE(acc);
2703 if (priv->non_standard_scu || !priv->commodity)
2704 return priv->commodity_scu;
2713 g_return_if_fail(GNC_IS_ACCOUNT(acc));
2715 priv = GET_PRIVATE(acc);
2716 if (priv->non_standard_scu == flag)
2719 priv->non_standard_scu = flag;
2727 g_return_val_if_fail(GNC_IS_ACCOUNT(acc), 0);
2728 return GET_PRIVATE(acc)->non_standard_scu;
2738 if ((!acc) || (!currency))
return;
2741 set_kvp_string_path (acc, {
"old-currency"}, s);
2745 auto commodity = gnc_commodity_table_lookup_unique (
table, s);
2757 g_return_if_fail (GNC_IS_ACCOUNT(acc));
2762 auto children = GET_PRIVATE(acc)->children;
2763 for (
auto child : children)
2771 account_foreach_descendant_sorted (
const Account *acc, std::function<
void(
Account*)> account_cb)
2773 g_return_if_fail (GNC_IS_ACCOUNT(acc));
2775 auto children = GET_PRIVATE(acc)->children;
2776 std::sort (children.begin(), children.end(),
2779 for (
auto child : children)
2782 account_foreach_descendant_sorted (child, account_cb);
2794 g_assert(GNC_IS_ACCOUNT(new_parent));
2795 g_assert(GNC_IS_ACCOUNT(child));
2798 ppriv = GET_PRIVATE(new_parent);
2799 cpriv = GET_PRIVATE(child);
2800 old_parent = cpriv->parent;
2801 if (old_parent == new_parent)
2823 PWARN (
"reparenting accounts across books is not correctly supported\n");
2832 cpriv->parent = new_parent;
2833 ppriv->children.push_back (child);
2834 qof_instance_set_dirty(&new_parent->inst);
2835 qof_instance_set_dirty(&child->inst);
2858 if (!parent)
return;
2860 ppriv = GET_PRIVATE(parent);
2861 cpriv = GET_PRIVATE(child);
2863 if (cpriv->parent != parent)
2865 PERR (
"account not a child of parent");
2873 ppriv->children.erase (std::remove (ppriv->children.begin(), ppriv->children.end(), child),
2874 ppriv->children.end());
2880 cpriv->parent =
nullptr;
2888 g_return_val_if_fail(GNC_IS_ACCOUNT(acc),
nullptr);
2889 return GET_PRIVATE(acc)->parent;
2895 g_return_val_if_fail(GNC_IS_ACCOUNT(acc),
nullptr);
2906 g_return_val_if_fail(GNC_IS_ACCOUNT(account), FALSE);
2907 return (GET_PRIVATE(account)->parent ==
nullptr);
2913 g_return_val_if_fail(GNC_IS_ACCOUNT(account),
nullptr);
2914 auto& children = GET_PRIVATE(account)->children;
2915 return std::accumulate (children.rbegin(), children.rend(),
static_cast<GList*
>(
nullptr),
2922 g_return_val_if_fail(GNC_IS_ACCOUNT(account),
nullptr);
2929 g_return_val_if_fail(GNC_IS_ACCOUNT(account), 0);
2930 return GET_PRIVATE(account)->children.size();
2936 g_return_val_if_fail(GNC_IS_ACCOUNT(parent), -1);
2937 g_return_val_if_fail(GNC_IS_ACCOUNT(child), -1);
2938 auto& children = GET_PRIVATE(parent)->children;
2939 return std::distance (children.begin(), std::find (children.begin(), children.end(), child));
2945 g_return_val_if_fail(GNC_IS_ACCOUNT(parent),
nullptr);
2946 if ((
size_t)num >= GET_PRIVATE(parent)->children.size())
2948 return static_cast<Account*
>(GET_PRIVATE(parent)->children.at (num));
2965 g_return_val_if_fail(GNC_IS_ACCOUNT(account), 0);
2967 priv = GET_PRIVATE(account);
2970 account = priv->parent;
2971 priv = GET_PRIVATE(account);
2982 g_return_val_if_fail(GNC_IS_ACCOUNT(account), 0);
2984 priv = GET_PRIVATE(account);
2985 if (!priv->children.size())
2988 return 1 + std::accumulate (priv->children.begin(), priv->children.end(),
2989 0, [](
auto a,
auto b)
2996 GList* list =
nullptr;
2998 return g_list_reverse (list);
3004 GList* list =
nullptr;
3005 account_foreach_descendant_sorted (account, [&list](
auto a){ list = g_list_prepend (list, a); });
3006 return g_list_reverse (list);
3015 account_foreach_descendant_breadthfirst_until (
const Account *acc,
3019 g_return_val_if_fail (GNC_IS_ACCOUNT(acc),
nullptr);
3020 g_return_val_if_fail (thunk,
nullptr);
3022 auto& children{GET_PRIVATE(acc)->children};
3024 for (
auto acc : children)
3025 if (
auto result = thunk (acc, user_data))
3028 for (
auto acc: children)
3029 if (
auto result = account_foreach_descendant_breadthfirst_until (acc, thunk, user_data))
3036 is_acct_name (
Account *account, gpointer user_data)
3038 auto name {
static_cast<gchar*
>(user_data)};
3045 return (
Account*)account_foreach_descendant_breadthfirst_until (parent, is_acct_name, (
char*)name);
3049 is_acct_code (
Account *account, gpointer user_data)
3051 auto name {
static_cast<gchar*
>(user_data)};
3058 return (
Account*)account_foreach_descendant_breadthfirst_until (parent, is_acct_code, (
char*)code);
3062 is_opening_balance_account (
Account* account, gpointer data)
3064 gnc_commodity* commodity = GNC_COMMODITY(data);
3081 gnc_account_lookup_by_full_name_helper (
const Account *parent,
3084 g_return_val_if_fail(GNC_IS_ACCOUNT(parent),
nullptr);
3085 g_return_val_if_fail(names,
nullptr);
3088 for (
auto account : GET_PRIVATE(parent)->children)
3090 auto priv = GET_PRIVATE(account);
3091 if (g_strcmp0(priv->accountName, names[0]) == 0)
3095 if (names[1] ==
nullptr)
3099 if (priv->children.empty())
3103 if (
auto found = gnc_account_lookup_by_full_name_helper(account, &names[1]))
3121 g_return_val_if_fail(GNC_IS_ACCOUNT(any_acc),
nullptr);
3122 g_return_val_if_fail(name,
nullptr);
3125 rpriv = GET_PRIVATE(root);
3126 while (rpriv->parent)
3128 root = rpriv->parent;
3129 rpriv = GET_PRIVATE(root);
3132 found = gnc_account_lookup_by_full_name_helper(root, names);
3141 gnc_commodity* commodity)
3144 auto rpriv{GET_PRIVATE(root)};
3145 for (
auto account : rpriv->children)
3157 retval = g_list_prepend(retval, account);
3162 for (
auto account : rpriv->children)
3169 retval = g_list_concat(result, retval);
3179 g_return_if_fail(GNC_IS_ACCOUNT(acc));
3180 g_return_if_fail(thunk);
3181 std::for_each (GET_PRIVATE(acc)->children.begin(), GET_PRIVATE(acc)->children.end(),
3182 [user_data, thunk](
auto a){ thunk (a, user_data); });
3198 gpointer result {
nullptr};
3200 g_return_val_if_fail (GNC_IS_ACCOUNT(acc),
nullptr);
3201 g_return_val_if_fail (thunk,
nullptr);
3203 for (
auto child : GET_PRIVATE(acc)->children)
3205 result = thunk (child, user_data);
3220 return GET_PRIVATE(acc)->type;
3224 qofAccountGetTypeString (
const Account *acc)
3226 g_return_val_if_fail(GNC_IS_ACCOUNT(acc),
nullptr);
3231 qofAccountSetType (
Account *acc,
const char *type_string)
3233 g_return_if_fail(GNC_IS_ACCOUNT(acc));
3234 g_return_if_fail(type_string);
3241 g_return_val_if_fail(GNC_IS_ACCOUNT(acc),
nullptr);
3242 return GET_PRIVATE(acc)->accountName;
3245 std::vector<const Account*>
3246 gnc_account_get_all_parents (
const Account *account)
3248 std::vector<const Account*> rv;
3259 if (
nullptr == account)
3260 return g_strdup(
"");
3263 g_return_val_if_fail(GNC_IS_ACCOUNT(account), g_strdup(
""));
3265 auto path{gnc_account_get_all_parents (account)};
3266 auto seps_size{path.empty() ? 0 : strlen (account_separator) * (path.size() - 1)};
3267 auto alloc_size{std::accumulate (path.begin(), path.end(), seps_size,
3268 [](
auto sum,
auto acc)
3270 auto rv = g_new (
char, alloc_size + 1);
3273 std::for_each (path.rbegin(), path.rend(),
3277 p = stpcpy (p, account_separator);
3288 g_return_val_if_fail(GNC_IS_ACCOUNT(acc),
nullptr);
3289 return GET_PRIVATE(acc)->accountCode;
3295 g_return_val_if_fail(GNC_IS_ACCOUNT(acc),
nullptr);
3296 return GET_PRIVATE(acc)->description;
3302 return get_kvp_string_path (acc, {
"color"});
3308 return get_kvp_string_path (acc, {
"filter"});
3314 return get_kvp_string_path (acc, {
"sort-order"});
3320 return get_kvp_boolean_path (acc, {
"sort-reversed"});
3326 return get_kvp_string_path (acc, {
"notes"});
3332 g_return_val_if_fail (tag && *tag,
nullptr);
3334 return get_kvp_account_path (acc, {
"associated-account", tag});
3341 if (
auto s = get_kvp_string_path (acc, {
"old-currency"}))
3344 return gnc_commodity_table_lookup_unique (
table, s);
3353 if (!GNC_IS_ACCOUNT(acc))
3355 return GET_PRIVATE(acc)->commodity;
3360 g_return_val_if_fail (GNC_IS_ACCOUNT (account),
nullptr);
3376 g_return_if_fail(GNC_IS_ACCOUNT(acc));
3378 priv = GET_PRIVATE(acc);
3379 priv->starting_balance = start_baln;
3380 priv->balance_dirty = TRUE;
3385 const gnc_numeric start_baln)
3389 g_return_if_fail(GNC_IS_ACCOUNT(acc));
3391 priv = GET_PRIVATE(acc);
3392 priv->starting_cleared_balance = start_baln;
3393 priv->balance_dirty = TRUE;
3398 const gnc_numeric start_baln)
3402 g_return_if_fail(GNC_IS_ACCOUNT(acc));
3404 priv = GET_PRIVATE(acc);
3405 priv->starting_reconciled_balance = start_baln;
3406 priv->balance_dirty = TRUE;
3412 g_return_val_if_fail(GNC_IS_ACCOUNT(acc), gnc_numeric_zero());
3413 return GET_PRIVATE(acc)->balance;
3419 g_return_val_if_fail(GNC_IS_ACCOUNT(acc), gnc_numeric_zero());
3420 return GET_PRIVATE(acc)->cleared_balance;
3426 g_return_val_if_fail(GNC_IS_ACCOUNT(acc), gnc_numeric_zero());
3427 return GET_PRIVATE(acc)->reconciled_balance;
3431 xaccAccountGetProjectedMinimumBalance (
const Account *acc)
3434 std::optional<gnc_numeric> minimum;
3436 auto before_today_end = [&minimum, today](
const Split *s) ->
bool 3446 return minimum ? *minimum : gnc_numeric_zero();
3454 GetBalanceAsOfDate (
Account *acc,
time64 date, std::function<gnc_numeric(Split*)> split_to_numeric)
3456 g_return_val_if_fail(GNC_IS_ACCOUNT(acc), gnc_numeric_zero());
3461 auto is_before_date = [date](
auto s) ->
bool 3465 return latest_split ? split_to_numeric (latest_split) : gnc_numeric_zero();
3475 xaccAccountGetNoclosingBalanceAsOfDate (
Account *acc,
time64 date)
3490 xaccAccountGetPresentBalance (
const Account *acc)
3492 g_return_val_if_fail(GNC_IS_ACCOUNT(acc), gnc_numeric_zero());
3509 xaccAccountConvertBalanceToCurrency(
const Account *acc,
3510 gnc_numeric balance,
3511 const gnc_commodity *balance_currency,
3512 const gnc_commodity *new_currency)
3521 book = gnc_account_get_book (acc);
3525 pdb, balance, balance_currency, new_currency);
3535 xaccAccountConvertBalanceToCurrencyAsOfDate(
const Account *acc,
3536 gnc_numeric balance,
3537 const gnc_commodity *balance_currency,
3538 const gnc_commodity *new_currency,
3548 book = gnc_account_get_book (acc);
3552 pdb, balance, balance_currency, new_currency, date);
3563 xaccAccountGetXxxBalanceInCurrency (
const Account *acc,
3564 xaccGetBalanceFn fn,
3565 const gnc_commodity *report_currency)
3568 gnc_numeric balance;
3570 g_return_val_if_fail(GNC_IS_ACCOUNT(acc), gnc_numeric_zero());
3571 g_return_val_if_fail(fn, gnc_numeric_zero());
3572 g_return_val_if_fail(GNC_IS_COMMODITY(report_currency), gnc_numeric_zero());
3574 priv = GET_PRIVATE(acc);
3576 balance = xaccAccountConvertBalanceToCurrency(acc, balance,
3583 xaccAccountGetXxxBalanceAsOfDateInCurrency(
Account *acc,
time64 date,
3584 xaccGetBalanceAsOfDateFn fn,
3585 const gnc_commodity *report_commodity)
3589 g_return_val_if_fail(GNC_IS_ACCOUNT(acc), gnc_numeric_zero());
3590 g_return_val_if_fail(fn, gnc_numeric_zero());
3591 g_return_val_if_fail(GNC_IS_COMMODITY(report_commodity), gnc_numeric_zero());
3593 priv = GET_PRIVATE(acc);
3594 return xaccAccountConvertBalanceToCurrencyAsOfDate(
3595 acc, fn(acc, date), priv->commodity, report_commodity, date);
3603 const gnc_commodity *currency;
3604 gnc_numeric balance;
3605 xaccGetBalanceFn fn;
3606 xaccGetBalanceAsOfDateFn asOfDateFn;
3617 xaccAccountBalanceHelper (
Account *acc, gpointer data)
3620 gnc_numeric balance;
3622 if (!cb->fn || !cb->currency)
3624 balance = xaccAccountGetXxxBalanceInCurrency (acc, cb->fn, cb->currency);
3631 xaccAccountBalanceAsOfDateHelper (
Account *acc, gpointer data)
3634 gnc_numeric balance;
3636 g_return_if_fail (cb->asOfDateFn && cb->currency);
3638 balance = xaccAccountGetXxxBalanceAsOfDateInCurrency (
3639 acc, cb->date, cb->asOfDateFn, cb->currency);
3658 xaccAccountGetXxxBalanceInCurrencyRecursive (
const Account *acc,
3659 xaccGetBalanceFn fn,
3660 const gnc_commodity *report_commodity,
3661 gboolean include_children)
3663 gnc_numeric balance;
3665 if (!acc)
return gnc_numeric_zero ();
3666 if (!report_commodity)
3668 if (!report_commodity)
3669 return gnc_numeric_zero();
3671 balance = xaccAccountGetXxxBalanceInCurrency (acc, fn, report_commodity);
3675 if (include_children)
3682 cb.balance = balance;
3688 balance = cb.balance;
3695 xaccAccountGetXxxBalanceAsOfDateInCurrencyRecursive (
3697 const gnc_commodity *report_commodity, gboolean include_children)
3699 gnc_numeric balance;
3701 g_return_val_if_fail(acc, gnc_numeric_zero());
3702 if (!report_commodity)
3704 if (!report_commodity)
3705 return gnc_numeric_zero();
3707 balance = xaccAccountGetXxxBalanceAsOfDateInCurrency(
3708 acc, date, fn, report_commodity);
3712 if (include_children)
3719 cb.balance = balance;
3721 CurrencyBalance cb = { report_commodity, balance,
nullptr, fn, date };
3725 balance = cb.balance;
3732 xaccAccountGetBalanceInCurrency (
const Account *acc,
3733 const gnc_commodity *report_commodity,
3734 gboolean include_children)
3737 rc = xaccAccountGetXxxBalanceInCurrencyRecursive (
3739 PINFO(
" baln=%" G_GINT64_FORMAT
"/%" G_GINT64_FORMAT, rc.num, rc.denom);
3745 xaccAccountGetClearedBalanceInCurrency (
const Account *acc,
3746 const gnc_commodity *report_commodity,
3747 gboolean include_children)
3749 return xaccAccountGetXxxBalanceInCurrencyRecursive (
3755 xaccAccountGetReconciledBalanceInCurrency (
const Account *acc,
3756 const gnc_commodity *report_commodity,
3757 gboolean include_children)
3759 return xaccAccountGetXxxBalanceInCurrencyRecursive (
3765 xaccAccountGetPresentBalanceInCurrency (
const Account *acc,
3766 const gnc_commodity *report_commodity,
3767 gboolean include_children)
3769 return xaccAccountGetXxxBalanceAsOfDateInCurrencyRecursive (
3776 xaccAccountGetProjectedMinimumBalanceInCurrency (
3778 const gnc_commodity *report_commodity,
3779 gboolean include_children)
3781 return xaccAccountGetXxxBalanceInCurrencyRecursive (
3782 acc, xaccAccountGetProjectedMinimumBalance, report_commodity,
3789 gboolean include_children)
3791 return xaccAccountGetXxxBalanceAsOfDateInCurrencyRecursive (
3799 gboolean include_children)
3801 return xaccAccountGetXxxBalanceAsOfDateInCurrencyRecursive
3802 (acc, date, xaccAccountGetNoclosingBalanceAsOfDate,
3803 report_commodity, include_children);
3818 xaccAccountGetNoclosingBalanceChangeForPeriod (
Account *acc,
time64 t1,
3819 time64 t2, gboolean recurse)
3830 const gnc_commodity *currency;
3831 gnc_numeric balanceChange;
3837 xaccAccountBalanceChangeHelper (
Account *acc, gpointer data)
3845 gnc_numeric balanceChange_conv = xaccAccountConvertBalanceToCurrencyAsOfDate(acc, balanceChange,
xaccAccountGetCommodity(acc), cbdiff->currency, cbdiff->t2);
3846 cbdiff->balanceChange =
gnc_numeric_add (cbdiff->balanceChange, balanceChange_conv,
3852 xaccAccountGetNoclosingBalanceChangeInCurrencyForPeriod (
Account *acc,
time64 t1,
3853 time64 t2, gboolean recurse)
3868 balanceChange = cbdiff.balanceChange;
3870 return balanceChange;
3877 xaccAccountGetSplits (
const Account *account)
3879 static const SplitsVec empty;
3880 g_return_val_if_fail (GNC_IS_ACCOUNT(account), empty);
3881 return GET_PRIVATE(account)->splits;
3887 g_return_val_if_fail(GNC_IS_ACCOUNT(acc),
nullptr);
3888 auto priv{GET_PRIVATE(acc)};
3889 return std::accumulate (priv->splits.rbegin(), priv->splits.rend(),
3890 static_cast<GList*
>(
nullptr), g_list_prepend);
3894 xaccAccountGetSplitsSize (
const Account *account)
3896 g_return_val_if_fail (GNC_IS_ACCOUNT(account), 0);
3897 return GNC_IS_ACCOUNT(account) ? GET_PRIVATE(account)->splits.size() : 0;
3900 gboolean gnc_account_and_descendants_empty (
Account *acc)
3902 g_return_val_if_fail (GNC_IS_ACCOUNT (acc), FALSE);
3903 auto priv = GET_PRIVATE (acc);
3904 if (!priv->splits.empty())
return FALSE;
3905 return std::all_of (priv->children.begin(), priv->children.end(),
3906 gnc_account_and_descendants_empty);
3912 g_return_val_if_fail(GNC_IS_ACCOUNT(acc),
nullptr);
3913 return g_list_copy(GET_PRIVATE(acc)->lots);
3918 gboolean (*match_func)(GNCLot *lot,
3919 gpointer user_data),
3920 gpointer user_data, GCompareFunc sort_func)
3924 GList *retval =
nullptr;
3926 g_return_val_if_fail(GNC_IS_ACCOUNT(acc),
nullptr);
3928 priv = GET_PRIVATE(acc);
3929 for (lot_list = priv->lots; lot_list; lot_list = lot_list->next)
3931 GNCLot *lot =
static_cast<GNCLot*
>(lot_list->data);
3937 if (match_func && !(match_func)(lot, user_data))
3941 retval = g_list_prepend (retval, lot);
3945 retval = g_list_sort (retval, sort_func);
3952 gpointer (*proc)(GNCLot *lot,
void *data),
void *data)
3954 g_return_val_if_fail(GNC_IS_ACCOUNT(acc),
nullptr);
3955 g_return_val_if_fail(proc,
nullptr);
3957 for (
auto node = GET_PRIVATE(acc)->lots; node; node = node->next)
3958 if (
auto result = proc(GNC_LOT(node->data), data))
3972 return get_kvp_boolean_path(acc, {
"tax-related"});
3978 set_kvp_boolean_path(acc, {
"tax-related"}, tax_related);
3984 return get_kvp_string_path (acc, {
"tax-US",
"code"});
3990 set_kvp_string_path (acc, {
"tax-US",
"code"}, code);
3996 return get_kvp_string_path (acc, {
"tax-US",
"payer-name-source"});
4002 set_kvp_string_path (acc, {
"tax-US",
"payer-name-source"}, source);
4008 auto copy_number = get_kvp_int64_path (acc, {
"tax-US",
"copy-number"});
4009 return copy_number ? *copy_number : 1;
4015 set_kvp_int64_path (acc, {
"tax-US",
"copy-number"}, copy_number);
4025 return _(dflt_acct_debit_str);
4027 auto result = gnc_acct_debit_strs.find(acct_type);
4028 if (result != gnc_acct_debit_strs.end())
4029 return _(result->second);
4031 return _(dflt_acct_debit_str);
4037 return _(dflt_acct_credit_str);
4039 auto result = gnc_acct_credit_strs.find(acct_type);
4040 if (result != gnc_acct_credit_strs.end())
4041 return _(result->second);
4043 return _(dflt_acct_credit_str);
4052 return get_kvp_boolean_path(acc, {
"placeholder"});
4058 set_kvp_boolean_path(acc, {
"placeholder"}, val);
4064 return get_kvp_boolean_path(acc, {
"import-append-text"});
4070 set_kvp_boolean_path(acc, {
"import-append-text"}, val);
4076 g_return_val_if_fail (GNC_IS_ACCOUNT(acc),
false);
4080 return !g_strcmp0 (get_kvp_string_path (acc, {
"equity-type"}),
"opening-balance");
4086 g_return_if_fail (GNC_IS_ACCOUNT(acc));
4089 set_kvp_string_path(acc, {
"equity-type"}, val ?
"opening-balance" :
nullptr);
4095 g_return_val_if_fail(GNC_IS_ACCOUNT(acc), PLACEHOLDER_NONE);
4099 ? PLACEHOLDER_CHILD : PLACEHOLDER_NONE;
4108 return get_kvp_boolean_path (acc, {KEY_RECONCILE_INFO,
"auto-interest-transfer"});
4114 set_kvp_boolean_path (acc, {KEY_RECONCILE_INFO,
"auto-interest-transfer"}, val);
4123 return get_kvp_boolean_path (acc, {
"hidden"});
4129 set_kvp_boolean_path (acc, {
"hidden"}, val);
4137 g_return_val_if_fail(GNC_IS_ACCOUNT(acc), FALSE);
4141 priv = GET_PRIVATE(acc);
4142 while ((acc = priv->parent) !=
nullptr)
4144 priv = GET_PRIVATE(acc);
4159 g_return_val_if_fail(GNC_IS_ACCOUNT(acc), FALSE);
4160 g_return_val_if_fail(GNC_IS_ACCOUNT(ancestor), FALSE);
4163 while (parent && parent != ancestor)
4164 parent = GET_PRIVATE(parent)->parent;
4166 return (parent == ancestor);
4175 #define GNC_RETURN_ENUM_AS_STRING(x) case (ACCT_TYPE_ ## x): return #x; 4182 GNC_RETURN_ENUM_AS_STRING(NONE);
4183 GNC_RETURN_ENUM_AS_STRING(BANK);
4184 GNC_RETURN_ENUM_AS_STRING(CASH);
4185 GNC_RETURN_ENUM_AS_STRING(CREDIT);
4186 GNC_RETURN_ENUM_AS_STRING(ASSET);
4187 GNC_RETURN_ENUM_AS_STRING(LIABILITY);
4188 GNC_RETURN_ENUM_AS_STRING(STOCK);
4189 GNC_RETURN_ENUM_AS_STRING(MUTUAL);
4190 GNC_RETURN_ENUM_AS_STRING(CURRENCY);
4191 GNC_RETURN_ENUM_AS_STRING(INCOME);
4192 GNC_RETURN_ENUM_AS_STRING(EXPENSE);
4193 GNC_RETURN_ENUM_AS_STRING(EQUITY);
4194 GNC_RETURN_ENUM_AS_STRING(RECEIVABLE);
4195 GNC_RETURN_ENUM_AS_STRING(PAYABLE);
4196 GNC_RETURN_ENUM_AS_STRING(ROOT);
4197 GNC_RETURN_ENUM_AS_STRING(TRADING);
4198 GNC_RETURN_ENUM_AS_STRING(CHECKING);
4199 GNC_RETURN_ENUM_AS_STRING(SAVINGS);
4200 GNC_RETURN_ENUM_AS_STRING(MONEYMRKT);
4201 GNC_RETURN_ENUM_AS_STRING(CREDITLINE);
4203 PERR (
"asked to translate unknown account type %d.\n", type);
4209 #undef GNC_RETURN_ENUM_AS_STRING 4211 #define GNC_RETURN_ON_MATCH(x) \ 4212 if(g_strcmp0(#x, (str)) == 0) { *type = ACCT_TYPE_ ## x; return(TRUE); } 4218 GNC_RETURN_ON_MATCH(NONE);
4219 GNC_RETURN_ON_MATCH(BANK);
4220 GNC_RETURN_ON_MATCH(CASH);
4221 GNC_RETURN_ON_MATCH(CREDIT);
4222 GNC_RETURN_ON_MATCH(ASSET);
4223 GNC_RETURN_ON_MATCH(LIABILITY);
4224 GNC_RETURN_ON_MATCH(STOCK);
4225 GNC_RETURN_ON_MATCH(MUTUAL);
4226 GNC_RETURN_ON_MATCH(CURRENCY);
4227 GNC_RETURN_ON_MATCH(INCOME);
4228 GNC_RETURN_ON_MATCH(EXPENSE);
4229 GNC_RETURN_ON_MATCH(EQUITY);
4230 GNC_RETURN_ON_MATCH(RECEIVABLE);
4231 GNC_RETURN_ON_MATCH(PAYABLE);
4232 GNC_RETURN_ON_MATCH(ROOT);
4233 GNC_RETURN_ON_MATCH(TRADING);
4234 GNC_RETURN_ON_MATCH(CHECKING);
4235 GNC_RETURN_ON_MATCH(SAVINGS);
4236 GNC_RETURN_ON_MATCH(MONEYMRKT);
4237 GNC_RETURN_ON_MATCH(CREDITLINE);
4239 PERR(
"asked to translate unknown account type string %s.\n",
4240 str ? str :
"(null)");
4245 #undef GNC_RETURN_ON_MATCH 4291 return _(account_type_name [type]);
4333 PERR(
"bad account type: %d", type);
4379 PERR(
"bad account type: %d", type);
4486 g_return_val_if_fail(GNC_IS_ACCOUNT(acc), FALSE);
4488 priv = GET_PRIVATE(acc);
4499 gboolean retval = FALSE;
4500 auto date = get_kvp_int64_path (acc, {KEY_RECONCILE_INFO,
"last-date"});
4517 set_kvp_int64_path (acc, {KEY_RECONCILE_INFO,
"last-date"}, last_date);
4525 int *months,
int *days)
4527 if (!acc)
return FALSE;
4528 auto m{get_kvp_int64_path (acc, {KEY_RECONCILE_INFO,
"last-interval",
"months"})};
4529 auto d{get_kvp_int64_path (acc, {KEY_RECONCILE_INFO,
"last-interval",
"days"})};
4547 set_kvp_int64_path (acc, {KEY_RECONCILE_INFO,
"last-interval",
"months"}, months);
4548 set_kvp_int64_path (acc, {KEY_RECONCILE_INFO,
"last-interval",
"days"}, days);
4557 if (
auto date = get_kvp_int64_path (acc, {KEY_RECONCILE_INFO, KEY_POSTPONE,
"date"}))
4560 *postpone_date = *date;
4572 set_kvp_int64_path (acc, {KEY_RECONCILE_INFO, KEY_POSTPONE,
"date"}, postpone_date);
4580 gnc_numeric *balance)
4582 if (
auto bal = get_kvp_gnc_numeric_path (acc, {KEY_RECONCILE_INFO, KEY_POSTPONE,
"balance"}))
4597 set_kvp_gnc_numeric_path (acc, {KEY_RECONCILE_INFO, KEY_POSTPONE,
"balance"}, balance);
4607 set_kvp_gnc_numeric_path (acc, {KEY_RECONCILE_INFO, KEY_POSTPONE,
"balance"}, {});
4616 return get_kvp_string_path (acc, {
"last-num"});
4625 set_kvp_string_path (acc, {
"last-num"}, num);
4633 get_balance_limit (
const Account* acc,
const std::string& key, gnc_numeric* balance)
4635 auto limit = get_kvp_gnc_numeric_path (acc, {KEY_BALANCE_LIMIT, key});
4637 *balance = gnc_numeric_create (limit->num, limit->denom);
4638 return limit.has_value();
4642 set_balance_limit (
Account *acc,
const std::string& key, std::optional<gnc_numeric> balance)
4646 set_kvp_gnc_numeric_path (acc, {KEY_BALANCE_LIMIT, key}, balance);
4651 gnc_numeric *balance)
4653 return get_balance_limit (acc, KEY_BALANCE_HIGHER_LIMIT_VALUE, balance);
4658 gnc_numeric *balance)
4660 return get_balance_limit (acc, KEY_BALANCE_LOWER_LIMIT_VALUE, balance);
4666 set_balance_limit (acc, KEY_BALANCE_HIGHER_LIMIT_VALUE, balance);
4672 set_balance_limit (acc, KEY_BALANCE_LOWER_LIMIT_VALUE, balance);
4678 set_balance_limit (acc, KEY_BALANCE_HIGHER_LIMIT_VALUE, {});
4684 set_balance_limit (acc, KEY_BALANCE_LOWER_LIMIT_VALUE, {});
4690 return get_kvp_boolean_path (acc, {KEY_BALANCE_LIMIT, KEY_BALANCE_INCLUDE_SUB_ACCTS});
4696 set_kvp_boolean_path (acc, {KEY_BALANCE_LIMIT, KEY_BALANCE_INCLUDE_SUB_ACCTS}, inc_sub);
4703 GetOrMakeOrphanAccount (
Account *root, gnc_commodity * currency)
4708 g_return_val_if_fail (root,
nullptr);
4713 PERR (
"No currency specified!");
4717 accname = g_strconcat (_(
"Orphaned Gains"),
"-",
4733 _(
"Realized Gains or Losses from " 4734 "Commodity or Trading Accounts " 4735 "that haven't been recorded elsewhere."));
4751 auto gains_account = get_kvp_account_path (acc, path);
4753 if (gains_account ==
nullptr)
4756 set_kvp_account_path (acc, path, gains_account);
4759 return gains_account;
4771 set_kvp_string_path (acc, {
"old-price-source"}, src);
4780 static char *source =
nullptr;
4781 if (!acc)
return nullptr;
4787 return get_kvp_string_path (acc, {
"old-price-source"});
4798 set_kvp_string_path (acc, {
"old-quote-tz"}, tz);
4807 if (!acc)
return nullptr;
4809 return get_kvp_string_path (acc, {
"old-quote-tz"});
4822 set_kvp_int64_path (acc, {KEY_RECONCILE_INFO, KEY_INCLUDE_CHILDREN}, status);
4835 return get_kvp_boolean_path (acc, {KEY_RECONCILE_INFO, KEY_INCLUDE_CHILDREN});
4844 auto has_description = [description](
const Split* s) ->
bool 4869 g_return_if_fail(GNC_IS_ACCOUNT(to_parent));
4870 g_return_if_fail(GNC_IS_ACCOUNT(from_parent));
4873 auto from_priv = GET_PRIVATE(from_parent);
4874 if (from_priv->children.empty())
4878 auto children = from_priv->children;
4879 for (
auto child : children)
4889 g_return_if_fail(GNC_IS_ACCOUNT(parent));
4891 auto ppriv = GET_PRIVATE(parent);
4892 for (
auto it_a = ppriv->children.begin(); it_a != ppriv->children.end(); it_a++)
4895 auto priv_a = GET_PRIVATE(acc_a);
4896 for (
auto it_b = std::next(it_a); it_b != ppriv->children.end(); it_b++)
4899 auto priv_b = GET_PRIVATE(acc_b);
4900 if (0 !=
null_strcmp(priv_a->accountName, priv_b->accountName))
4902 if (0 !=
null_strcmp(priv_a->accountCode, priv_b->accountCode))
4904 if (0 !=
null_strcmp(priv_a->description, priv_b->description))
4914 if (priv_a->type != priv_b->type)
4918 if (!priv_b->children.empty())
4920 auto work = priv_b->children;
4932 while (!priv_b->splits.empty())
4933 xaccSplitSetAccount (priv_b->splits.front(), acc_a);
4952 xaccSplitsBeginStagedTransactionTraversals (SplitsVec& splits)
4954 for (
auto s : splits)
4956 Transaction *trans = s->parent;
4969 xaccSplitsBeginStagedTransactionTraversals(GET_PRIVATE (account)->splits);
4975 if (trans ==
nullptr)
return FALSE;
4977 if (trans->marker < stage)
4979 trans->marker = stage;
4990 auto do_one_account = [](
auto acc)
4991 { gnc_account_foreach_split (acc, [](
auto s){ s->parent->marker = 0; },
false); };
4998 TransactionCallback thunk,
5004 auto splits = GET_PRIVATE(acc)->splits;
5005 for (
auto s : splits)
5007 auto trans = s->parent;
5008 if (trans && (trans->marker < stage))
5010 trans->marker = stage;
5013 auto retval = thunk(trans, cb_data);
5014 if (retval)
return retval;
5025 TransactionCallback thunk,
5035 priv = GET_PRIVATE(acc);
5036 for (
auto acc_p : priv->children)
5039 if (retval)
return retval;
5043 for (
auto s : priv->splits)
5046 if (trans && (trans->marker < stage))
5048 trans->marker = stage;
5051 retval = thunk(trans, cb_data);
5052 if (retval)
return retval;
5065 int (*proc)(Transaction *t,
void *data),
5068 if (!acc || !proc)
return 0;
5079 if (!acc || !proc)
return 0;
5090 #define IMAP_FRAME "import-map" 5091 #define IMAP_FRAME_BAYES "import-map-bayes" 5095 gnc_account_imap_find_account (
Account *acc,
5096 const char *category,
5099 if (!acc || !key)
return nullptr;
5100 std::vector<std::string> path {IMAP_FRAME};
5102 path.push_back (category);
5103 path.push_back (key);
5104 return get_kvp_account_path (acc, path);
5108 gnc_account_imap_find_any (QofBook *book,
const char* category,
const char *key)
5113 auto root = gnc_book_get_root_account (book);
5117 for (
auto ptr = accts; ptr; ptr = g_list_next (ptr))
5119 auto tmp_acc =
static_cast<Account*
> (ptr->data);
5121 if (gnc_account_imap_find_account (tmp_acc, category, key))
5127 g_list_free (accts);
5134 gnc_account_imap_add_account (
Account *acc,
5135 const char *category,
5139 if (!acc || !key || !added_acc || !*key)
return;
5141 auto path = category ? Path{IMAP_FRAME, category, key} : Path{IMAP_FRAME, key};
5143 set_kvp_account_path (acc, path, added_acc);
5148 gnc_account_imap_delete_account (
Account *acc,
5149 const char *category,
5152 if (!acc || !key)
return;
5154 auto path = category ? Path{IMAP_FRAME, category, key} : Path{IMAP_FRAME, key};
5155 if (qof_instance_has_path_slot (QOF_INSTANCE (acc), path))
5157 qof_instance_slot_path_delete (QOF_INSTANCE (acc), path);
5159 qof_instance_slot_path_delete_if_empty (QOF_INSTANCE (acc), {IMAP_FRAME, category});
5160 qof_instance_slot_path_delete_if_empty (QOF_INSTANCE (acc), {IMAP_FRAME});
5162 qof_instance_set_dirty (QOF_INSTANCE (acc));
5177 double product_difference;
5182 std::string account_guid;
5183 int64_t token_count;
5191 std::vector<AccountTokenCount> accounts;
5192 int64_t total_count;
5200 std::string account_guid;
5201 int32_t probability;
5205 build_token_info(
char const * suffix, KvpValue * value,
TokenAccountsInfo & tokenInfo)
5209 tokenInfo.total_count += value->get<int64_t>();
5211 tokenInfo.accounts.emplace_back(
AccountTokenCount{std::string{suffix}, value->get<int64_t>()});
5218 static constexpr
int probability_factor = 100000;
5220 static FinalProbabilityVec
5221 build_probabilities(ProbabilityVec
const & first_pass)
5223 FinalProbabilityVec ret;
5224 for (
auto const & first_pass_prob : first_pass)
5226 auto const & account_probability = first_pass_prob.second;
5231 int32_t probability = (account_probability.product /
5232 (account_probability.product + account_probability.product_difference)) * probability_factor;
5233 ret.push_back({first_pass_prob.first, probability});
5239 highest_probability(FinalProbabilityVec
const & probabilities)
5241 AccountInfo ret {
"", std::numeric_limits<int32_t>::min()};
5242 for (
auto const & prob : probabilities)
5243 if (prob.second > ret.probability)
5248 static ProbabilityVec
5249 get_first_pass_probabilities(
Account* acc, GList * tokens)
5254 for (
auto current_token = tokens; current_token; current_token = current_token->next)
5257 auto path = std::string{IMAP_FRAME_BAYES
"/"} + static_cast <
char const *> (current_token->data) +
"/";
5258 qof_instance_foreach_slot_prefix (QOF_INSTANCE (acc), path, &build_token_info, tokenInfo);
5259 for (
auto const & current_account_token : tokenInfo.accounts)
5261 auto item = std::find_if(ret.begin(), ret.end(), [¤t_account_token]
5262 (std::pair<std::string, AccountProbability>
const & a) {
5263 return current_account_token.account_guid == a.first;
5265 if (item != ret.end())
5267 item->second.product = ((double)current_account_token.token_count /
5268 (
double)tokenInfo.total_count) * item->second.product;
5269 item->second.product_difference = ((
double)1 - ((double)current_account_token.token_count /
5270 (
double)tokenInfo.total_count)) * item->second.product_difference;
5276 new_probability.product = ((double)current_account_token.token_count /
5277 (
double)tokenInfo.total_count);
5278 new_probability.product_difference = 1 - (new_probability.product);
5279 ret.push_back({current_account_token.account_guid, std::move(new_probability)});
5287 look_for_old_separator_descendants (
Account *root, std::string
const & full_name,
const gchar *separator)
5289 GList *top_accounts, *ptr;
5293 PINFO(
"Incoming full_name is '%s', current separator is '%s'", full_name.c_str (), separator);
5295 for (ptr = top_accounts; ptr; ptr = g_list_next (ptr))
5299 if (g_str_has_prefix (full_name.c_str (), name))
5301 gint name_len = strlen (name);
5302 const gchar old_sep = full_name[name_len];
5303 if (!g_ascii_isalnum (old_sep))
5305 if (name_len > found_len)
5307 found_sep = full_name[name_len];
5308 found_len = name_len;
5313 g_list_free (top_accounts);
5314 std::string new_name {full_name};
5316 std::replace (new_name.begin (), new_name.end (), found_sep, *separator);
5317 PINFO (
"Return full_name is '%s'", new_name.c_str ());
5322 get_guid_from_account_name (
Account * root, std::string
const & name)
5327 auto temp_account_name = look_for_old_separator_descendants (root, name,
5332 return temp_guid.to_string ();
5336 convert_entry (KvpEntry entry,
Account* root)
5339 auto account_name = entry.first.back();
5340 if (!gnc::GUID::is_valid_guid (account_name))
5346 entry.first.pop_back();
5347 auto guid_str = get_guid_from_account_name (root, account_name);
5348 entry.first.emplace_back (guid_str);
5350 std::string new_key {std::accumulate (entry.first.begin(), entry.first.end(), std::string {})};
5351 new_key = IMAP_FRAME_BAYES + new_key;
5352 return {new_key, entry.second};
5355 static std::vector<FlatKvpEntry>
5358 auto frame = qof_instance_get_slots (QOF_INSTANCE (acc));
5359 auto slot = frame->get_slot ({IMAP_FRAME_BAYES});
5362 auto imap_frame = slot->get<KvpFrame*> ();
5363 auto flat_kvp = imap_frame->flatten_kvp ();
5365 std::vector <FlatKvpEntry> ret;
5366 for (
auto const & flat_entry : flat_kvp)
5368 auto converted_entry = convert_entry (flat_entry, root);
5370 if (converted_entry.first.size())
5371 ret.emplace_back (converted_entry);
5377 convert_imap_account_bayes_to_flat (
Account *acc)
5379 auto frame = qof_instance_get_slots (QOF_INSTANCE (acc));
5380 if (!frame->get_keys().size())
5382 auto flat_imap = get_flat_imap(acc);
5383 if (!flat_imap.size ())
5386 frame->set({IMAP_FRAME_BAYES},
nullptr);
5387 std::for_each(flat_imap.begin(), flat_imap.end(),
5388 [&frame] (FlatKvpEntry
const & entry) {
5389 frame->set({entry.first.c_str()}, entry.second);
5391 qof_instance_set_dirty (QOF_INSTANCE (acc));
5400 imap_convert_bayes_to_flat (QofBook * book)
5402 auto root = gnc_book_get_root_account (book);
5405 for (
auto ptr = accts; ptr; ptr = g_list_next (ptr))
5408 if (convert_imap_account_bayes_to_flat (acc))
5414 g_list_free (accts);
5421 imap_convert_bayes_to_flat_run =
false;
5436 check_import_map_data (QofBook *book)
5438 if (gnc_features_check_used (book, GNC_FEATURE_GUID_FLAT_BAYESIAN) ||
5439 imap_convert_bayes_to_flat_run)
5443 imap_convert_bayes_to_flat (book);
5444 imap_convert_bayes_to_flat_run =
true;
5447 static constexpr
double threshold = .90 * probability_factor;
5455 auto book = gnc_account_get_book(acc);
5456 check_import_map_data (book);
5457 auto first_pass = get_first_pass_probabilities(acc, tokens);
5458 if (!first_pass.size())
5460 auto final_probabilities = build_probabilities(first_pass);
5461 if (!final_probabilities.size())
5463 auto best = highest_probability(final_probabilities);
5464 if (best.account_guid ==
"")
5466 if (best.probability < threshold)
5470 guid = gnc::GUID::from_string(best.account_guid);
5479 change_imap_entry (
Account *acc, std::string
const & path, int64_t token_count)
5481 PINFO(
"Source Account is '%s', Count is '%" G_GINT64_FORMAT
"'",
5485 if (
auto existing_token_count = get_kvp_int64_path (acc, {path}))
5487 PINFO(
"found existing value of '%" G_GINT64_FORMAT
"'", *existing_token_count);
5488 token_count += *existing_token_count;
5492 set_kvp_int64_path (acc, {path}, token_count);
5501 GList *current_token;
5503 char *account_fullname;
5512 check_import_map_data (gnc_account_get_book(acc));
5514 g_return_if_fail (added_acc !=
nullptr);
5518 PINFO(
"account name: '%s'", account_fullname);
5523 for (current_token = g_list_first(tokens); current_token;
5524 current_token = current_token->next)
5526 char* token =
static_cast<char*
>(current_token->data);
5531 if (!token || !token[0])
5535 PINFO(
"adding token '%s'", token);
5536 auto path = std::string {IMAP_FRAME_BAYES} +
'/' + token +
'/' + guid_string;
5538 change_imap_entry (acc, path, token_count);
5543 g_free (account_fullname);
5544 g_free (guid_string);
5551 build_non_bayes (
const char *key,
const GValue *value, gpointer user_data)
5553 if (!G_VALUE_HOLDS_BOXED (value))
5557 gchar *guid_string =
nullptr;
5562 guid = (
GncGUID*)g_value_get_boxed (value);
5565 PINFO(
"build_non_bayes: match string '%s', match account guid: '%s'",
5566 (
char*)key, guid_string);
5570 imapInfo_node->source_account = imapInfo->source_account;
5572 imapInfo_node->head = g_strdup (imapInfo->head);
5573 imapInfo_node->match_string = g_strdup (key);
5574 imapInfo_node->category = g_strdup (imapInfo->category);
5575 imapInfo_node->count = g_strdup (
" ");
5577 imapInfo->list = g_list_prepend (imapInfo->list, imapInfo_node);
5579 g_free (guid_string);
5583 build_bayes (
const char *suffix, KvpValue * value,
GncImapInfo & imapInfo)
5586 std::string account_guid {&suffix[guid_start]};
5590 guid = gnc::GUID::from_string (account_guid);
5594 PWARN(
"Invalid GUID string from %s%s", IMAP_FRAME_BAYES, suffix);
5596 auto map_account =
xaccAccountLookup (&guid, gnc_account_get_book (imapInfo.source_account));
5598 auto count = value->get <int64_t> ();
5599 imap_node->source_account = imapInfo.source_account;
5600 imap_node->map_account = map_account;
5601 imap_node->head = g_strdup_printf (
"%s%s", IMAP_FRAME_BAYES, suffix);
5602 imap_node->match_string = g_strndup (&suffix[1], guid_start - 2);
5603 imap_node->category = g_strdup(
" ");
5604 imap_node->count = g_strdup_printf (
"%" G_GINT64_FORMAT, count);
5605 imapInfo.list = g_list_prepend (imapInfo.list, imap_node);
5610 g_free (imapInfo->head);
5611 g_free (imapInfo->category);
5612 g_free (imapInfo->match_string);
5613 g_free (imapInfo->count);
5620 check_import_map_data (gnc_account_get_book (acc));
5624 qof_instance_foreach_slot_prefix (QOF_INSTANCE (acc), IMAP_FRAME_BAYES, &build_bayes, imapInfo);
5625 return g_list_reverse(imapInfo.list);
5631 GList *list =
nullptr;
5635 std::vector<std::string> path {IMAP_FRAME};
5637 path.emplace_back (category);
5639 imapInfo.source_account = acc;
5640 imapInfo.list = list;
5642 imapInfo.head = g_strdup (IMAP_FRAME);
5643 imapInfo.category = g_strdup (category);
5645 if (qof_instance_has_path_slot (QOF_INSTANCE (acc), path))
5647 qof_instance_foreach_slot (QOF_INSTANCE(acc), IMAP_FRAME, category,
5648 build_non_bayes, &imapInfo);
5650 g_free (imapInfo.head);
5651 g_free (imapInfo.category);
5652 return g_list_reverse(imapInfo.list);
5660 return g_strdup (category ?
5661 get_kvp_string_path (acc, {head, category}) :
5662 get_kvp_string_path (acc, {head}));
5668 char *match_string, gboolean empty)
5672 std::vector<std::string> path {head};
5674 path.emplace_back (category);
5676 path.emplace_back (match_string);
5678 if (qof_instance_has_path_slot (QOF_INSTANCE (acc), path))
5682 qof_instance_slot_path_delete_if_empty (QOF_INSTANCE(acc), path);
5684 qof_instance_slot_path_delete (QOF_INSTANCE(acc), path);
5685 PINFO(
"Account is '%s', head is '%s', category is '%s', match_string is'%s'",
5687 qof_instance_set_dirty (QOF_INSTANCE(acc));
5698 auto slots = qof_instance_get_slots_prefix (QOF_INSTANCE (acc), IMAP_FRAME_BAYES);
5699 if (!slots.size())
return;
5701 for (
auto const & entry : slots)
5703 qof_instance_slot_path_delete (QOF_INSTANCE (acc), {entry.first});
5705 qof_instance_set_dirty (QOF_INSTANCE(acc));
5714 destroy_all_child_accounts (
Account *acc, gpointer data)
5721 gnc_account_book_end(QofBook* book)
5723 Account *root_account = gnc_book_get_root_account (book);
5733 accounts = g_list_reverse (accounts);
5734 g_list_foreach (accounts, (GFunc)destroy_all_child_accounts,
nullptr);
5735 g_list_free (accounts);
5748 static QofObject account_object_def =
5751 DI(.e_type = ) GNC_ID_ACCOUNT,
5754 DI(.book_begin = )
nullptr,
5755 DI(.book_end = ) gnc_account_book_end,
5758 DI(.foreach = ) qof_collection_foreach,
5763 gboolean xaccAccountRegister (
void)
5765 static QofParam params[] =
5768 ACCOUNT_NAME_, QOF_TYPE_STRING,
5773 ACCOUNT_CODE_, QOF_TYPE_STRING,
5778 ACCOUNT_DESCRIPTION_, QOF_TYPE_STRING,
5783 ACCOUNT_COLOR_, QOF_TYPE_STRING,
5788 ACCOUNT_FILTER_, QOF_TYPE_STRING,
5793 ACCOUNT_SORT_ORDER_, QOF_TYPE_STRING,
5798 ACCOUNT_SORT_REVERSED_, QOF_TYPE_BOOLEAN,
5803 ACCOUNT_NOTES_, QOF_TYPE_STRING,
5808 ACCOUNT_PRESENT_, QOF_TYPE_NUMERIC,
5812 ACCOUNT_BALANCE_, QOF_TYPE_NUMERIC,
5816 ACCOUNT_CLEARED_, QOF_TYPE_NUMERIC,
5820 ACCOUNT_RECONCILED_, QOF_TYPE_NUMERIC,
5824 ACCOUNT_TYPE_, QOF_TYPE_STRING,
5829 ACCOUNT_FUTURE_MINIMUM_, QOF_TYPE_NUMERIC,
5830 (
QofAccessFunc) xaccAccountGetProjectedMinimumBalance,
nullptr 5833 ACCOUNT_TAX_RELATED, QOF_TYPE_BOOLEAN,
5838 ACCOUNT_OPENING_BALANCE_, QOF_TYPE_BOOLEAN,
5843 ACCOUNT_SCU, QOF_TYPE_INT32,
5848 ACCOUNT_NSCU, QOF_TYPE_BOOLEAN,
5853 ACCOUNT_PARENT, GNC_ID_ACCOUNT,
5862 QOF_PARAM_GUID, QOF_TYPE_GUID,
5877 utest_account_get_private (
Account *acc)
5879 return GET_PRIVATE (acc);
5883 _utest_account_fill_functions(
void)
5887 func->get_private = utest_account_get_private;
5888 func->coll_get_root_account = gnc_coll_get_root_account;
5889 func->xaccFreeAccountChildren = xaccFreeAccountChildren;
5890 func->xaccFreeAccount = xaccFreeAccount;
5891 func->qofAccountSetParent = qofAccountSetParent;
5892 func->gnc_account_lookup_by_full_name_helper =
5893 gnc_account_lookup_by_full_name_helper;
void xaccAccountSetType(Account *acc, GNCAccountType tip)
Set the account's type.
int qof_instance_version_cmp(const QofInstance *left, const QofInstance *right)
Compare two instances, based on their last update times.
gnc_commodity * gnc_commodity_table_insert(gnc_commodity_table *table, gnc_commodity *comm)
Add a new commodity to the commodity table.
Account * gnc_account_get_parent(const Account *acc)
This routine returns a pointer to the parent of the specified account.
void xaccAccountSetFilter(Account *acc, const char *str)
Set the account's Filter.
void xaccAccountSetSortOrder(Account *acc, const char *str)
Set the account's Sort Order.
gint xaccAccountForEachTransaction(const Account *acc, TransactionCallback proc, void *data)
The xaccAccountForEachTransaction() routine will traverse all of the transactions in account and call...
int xaccAccountTreeForEachTransaction(Account *acc, TransactionCallback proc, void *data)
Traverse all of the transactions in the given account group.
gint xaccSplitOrder(const Split *sa, const Split *sb)
The xaccSplitOrder(sa,sb) method is useful for sorting.
This is the private header for the account structure.
gnc_commodity_table * gnc_commodity_table_get_table(QofBook *book)
Returns the commodity table associated with a book.
gboolean gnc_numeric_equal(gnc_numeric a, gnc_numeric b)
Equivalence predicate: Returns TRUE (1) if a and b represent the same number.
int gnc_account_tree_staged_transaction_traversal(const Account *acc, unsigned int stage, TransactionCallback thunk, void *cb_data)
gnc_account_tree_staged_transaction_traversal() calls thunk on each transaction in the group whose cu...
gboolean xaccAccountGetAutoInterest(const Account *acc)
Get the "auto interest" flag for an account.
holds an account guid and its corresponding integer probability the integer probability is some facto...
const char * xaccAccountGetLastNum(const Account *acc)
Get the last num field of an Account.
GNCAccountType xaccAccountTypeGetFundamental(GNCAccountType t)
Convenience function to return the fundamental type asset/liability/income/expense/equity given an ac...
gchar * gnc_account_get_map_entry(Account *acc, const char *head, const char *category)
Returns the text string pointed to by head and category for the Account, free the returned text...
gboolean gnc_commodity_is_currency(const gnc_commodity *cm)
Checks to see if the specified commodity is an ISO 4217 recognized currency or a legacy currency...
GList LotList
GList of GNCLots.
int gnc_commodity_get_fraction(const gnc_commodity *cm)
Retrieve the fraction for the specified commodity.
gboolean xaccAccountGetSortReversed(const Account *acc)
Get the account's Sort Order direction.
guint32 xaccAccountTypesCompatibleWith(GNCAccountType type)
Return the bitmask of account types compatible with a given type.
void gnc_account_imap_info_destroy(GncImapInfo *imapInfo)
Clean destructor for the imap_info structure of Bayesian mappings.
void gnc_account_append_child(Account *new_parent, Account *child)
This function will remove from the child account any pre-existing parent relationship, and will then add the account as a child of the new parent.
const GncGUID * qof_instance_get_guid(gconstpointer inst)
Return the GncGUID of this instance.
gpointer xaccAccountForEachLot(const Account *acc, gpointer(*proc)(GNCLot *lot, gpointer user_data), gpointer user_data)
The xaccAccountForEachLot() method will apply the function 'proc' to each lot in the account...
time64 xaccTransGetDate(const Transaction *trans)
Retrieve the posted date of the transaction.
GList * gnc_account_get_descendants_sorted(const Account *account)
This function returns a GList containing all the descendants of the specified account, sorted at each level.
gint gnc_account_n_descendants(const Account *account)
Return the number of descendants of the specified account.
gint64 xaccAccountGetTaxUSCopyNumber(const Account *acc)
DOCUMENT ME!
gboolean gnc_account_is_root(const Account *account)
This routine indicates whether the specified account is the root node of an account tree...
SplitList * xaccAccountGetSplitList(const Account *acc)
The xaccAccountGetSplitList() routine returns a pointer to a GList of the splits in the account...
const char * gnc_commodity_get_mnemonic(const gnc_commodity *cm)
Retrieve the mnemonic for the specified commodity.
void xaccAccountSetAssociatedAccount(Account *acc, const char *tag, const Account *assoc_acct)
Set the account's associated account e.g.
gboolean xaccAccountGetNonStdSCU(const Account *acc)
Return boolean, indicating whether this account uses a non-standard SCU.
int xaccAccountGetCommoditySCUi(const Account *acc)
Return the 'internal' SCU setting.
#define GNC_COMMODITY_MAX_FRACTION
Max fraction is 10^9 because 10^10 would require changing it to an int64_t.
const char * qof_string_cache_replace(char const *dst, char const *src)
Same as CACHE_REPLACE below, but safe to call from C++.
gchar * gnc_g_list_stringjoin(GList *list_of_strings, const gchar *sep)
Return a string joining a GList whose elements are gchar* strings.
gnc_commodity * DxaccAccountGetCurrency(const Account *acc)
void gnc_account_foreach_descendant(const Account *acc, AccountCb thunk, gpointer user_data)
This method will traverse all children of this accounts and their descendants, calling 'func' on each...
void xaccAccountSetNotes(Account *acc, const char *str)
Set the account's notes.
QofBook * qof_instance_get_book(gconstpointer inst)
Return the book pointer.
gboolean xaccAccountIsPriced(const Account *acc)
Returns true if the account is a stock, mutual fund or currency, otherwise false. ...
gboolean qof_collection_is_dirty(const QofCollection *col)
Return value of 'dirty' flag on collection.
void gnc_account_delete_map_entry(Account *acc, char *head, char *category, char *match_string, gboolean empty)
Delete the entry for Account pointed to by head,category and match_string, if empty is TRUE then use ...
gboolean xaccTransIsOpen(const Transaction *trans)
The xaccTransIsOpen() method returns TRUE if the transaction is open for editing. ...
a simple price database for gnucash
QofInstance * qof_collection_lookup_entity(const QofCollection *col, const GncGUID *guid)
Find the entity going only from its guid.
Expense accounts are used to denote expenses.
int safe_utf8_collate(const char *da, const char *db)
Collate two UTF-8 strings.
#define PINFO(format, args...)
Print an informational note.
const char * xaccAccountGetFilter(const Account *acc)
Get the account's filter.
gnc_numeric xaccSplitGetReconciledBalance(const Split *s)
Returns the reconciled-balance of this split.
GNCAccountType xaccAccountGetType(const Account *acc)
Returns the account's account type.
gboolean xaccSplitDestroy(Split *split)
Destructor.
void xaccAccountSetMark(Account *acc, short m)
Set a mark on the account.
QofBackendError
The errors that can be reported to the GUI & other front-end users.
int xaccAccountGetCommoditySCU(const Account *acc)
Return the SCU for the account.
const char * xaccAccountGetCode(const Account *acc)
Get the account's accounting code.
gboolean xaccAccountGetAppendText(const Account *acc)
Get the "import-append-text" flag for an account.
void xaccAccountSetReconcileLastDate(Account *acc, time64 last_date)
DOCUMENT ME!
total_count and the token_count for a given account let us calculate the probability of a given accou...
Account * gnc_account_create_root(QofBook *book)
Create a new root level account.
void gnc_commodity_decrement_usage_count(gnc_commodity *cm)
Decrement a commodity's internal counter that tracks how many accounts are using that commodity...
GncGUID * guid_copy(const GncGUID *guid)
Returns a newly allocated GncGUID that matches the passed-in GUID.
void xaccAccountSetTaxRelated(Account *acc, gboolean tax_related)
DOCUMENT ME!
gboolean qof_instance_get_destroying(gconstpointer ptr)
Retrieve the flag that indicates whether or not this object is about to be destroyed.
All arguments are required to have the same denominator, that denominator is to be used in the output...
Mutual Fund accounts will typically be shown in registers which show three columns: price...
void gnc_features_set_used(QofBook *book, const gchar *feature)
Indicate that the current book uses the given feature.
void qof_class_register(QofIdTypeConst obj_name, QofSortFunc default_sort_function, const QofParam *params)
This function registers a new object class with the Qof subsystem.
gboolean gnc_commodity_equal(const gnc_commodity *a, const gnc_commodity *b)
This routine returns TRUE if the two commodities are equal.
void xaccAccountSortSplits(Account *acc, gboolean force)
The xaccAccountSortSplits() routine will resort the account's splits if the sort is dirty...
void xaccAccountSetCode(Account *acc, const char *str)
Set the account's accounting code.
gpointer gnc_account_foreach_descendant_until(const Account *acc, AccountCb2 thunk, gpointer user_data)
This method will traverse all children of this accounts and their descendants, calling 'func' on each...
void gnc_account_set_policy(Account *acc, GNCPolicy *policy)
Set the account's lot order policy.
void xaccAccountSetReconcileLastInterval(Account *acc, int months, int days)
DOCUMENT ME!
gnc_numeric gnc_numeric_add(gnc_numeric a, gnc_numeric b, gint64 denom, gint how)
Return a+b.
gboolean gnc_account_remove_split(Account *acc, Split *s)
Remove the given split from an account.
gnc_numeric xaccAccountGetBalanceAsOfDateInCurrency(Account *acc, time64 date, gnc_commodity *report_commodity, gboolean include_children)
This function gets the balance at the end of the given date in the desired commodity.
guint32 xaccAccountTypesValid(void)
Returns the bitmask of the account type enums that are valid.
gboolean gnc_numeric_zero_p(gnc_numeric a)
Returns 1 if the given gnc_numeric is 0 (zero), else returns 0.
const char * xaccAccountTypeEnumAsString(GNCAccountType type)
Conversion routines for the account types to/from strings that are used in persistent storage...
stop here; the following types just aren't ready for prime time
GList * gnc_account_list_name_violations(QofBook *book, const gchar *separator)
Runs through all the accounts and returns a list of account names that contain the provided separator...
void xaccAccountSetHigherBalanceLimit(Account *acc, gnc_numeric balance)
Set the higher balance limit for the account.
void xaccAccountInsertLot(Account *acc, GNCLot *lot)
The xaccAccountInsertLot() method will register the indicated lot with this account.
Transaction * xaccSplitGetParent(const Split *split)
Returns the parent transaction of the split.
API for Transactions and Splits (journal entries)
gchar * guid_to_string_buff(const GncGUID *guid, gchar *str)
The guid_to_string_buff() routine puts a null-terminated string encoding of the id into the memory po...
int(* QofSortFunc)(gconstpointer, gconstpointer)
This function is the default sort function for a particular object type.
int gnc_numeric_compare(gnc_numeric a, gnc_numeric b)
Returns 1 if a>b, -1 if b>a, 0 if a == b.
#define QOF_OBJECT_VERSION
Defines the version of the core object object registration interface.
gchar * gnc_numeric_to_string(gnc_numeric n)
Convert to string.
void xaccAccountMoveAllSplits(Account *accfrom, Account *accto)
The xaccAccountMoveAllSplits() routine reassigns each of the splits in accfrom to accto...
gboolean qof_commit_edit(QofInstance *inst)
commit_edit helpers
#define PERR(format, args...)
Log a serious error.
void gnc_account_set_sort_dirty(Account *acc)
Tell the account believes that the splits may be incorrectly sorted and need to be resorted...
#define ENTER(format, args...)
Print a function entry debugging message.
gnc_numeric gnc_pricedb_convert_balance_nearest_before_price_t64(GNCPriceDB *pdb, gnc_numeric balance, const gnc_commodity *balance_currency, const gnc_commodity *new_currency, time64 t)
Convert a balance from one currency to another using the price nearest to before the given time...
The cash account type is used to denote a shoe-box or pillowcase stuffed with * cash.
const char * gnc_account_get_debit_string(GNCAccountType acct_type)
Get the debit string associated with this account type.
void gnc_account_imap_add_account_bayes(Account *acc, GList *tokens, Account *added_acc)
Updates the imap for a given account using a list of tokens.
gnc_numeric xaccSplitGetBalance(const Split *s)
Returns the running balance up to and including the indicated split.
#define QOF_PARAM_BOOK
"Known" Object Parameters – all objects must support these
void xaccAccountSetLastNum(Account *acc, const char *num)
Set the last num field of an Account.
const char * qof_string_cache_insert(const char *key)
You can use this function with g_hash_table_insert(), for the key (or value), as long as you use the ...
gnc_numeric xaccAccountGetClearedBalance(const Account *acc)
Get the current balance of the account, only including cleared transactions.
void(* QofSetterFunc)(gpointer, gpointer)
The QofSetterFunc defines an function pointer for parameter setters.
GNCPriceDB * gnc_pricedb_get_db(QofBook *book)
Return the pricedb associated with the book.
gnc_numeric gnc_pricedb_convert_balance_latest_price(GNCPriceDB *pdb, gnc_numeric balance, const gnc_commodity *balance_currency, const gnc_commodity *new_currency)
Convert a balance from one currency to another using the most recent price between the two...
gboolean xaccAccountGetReconcilePostponeDate(const Account *acc, time64 *postpone_date)
DOCUMENT ME!
intermediate values used to calculate the bayes probability of a given account where p(AB) = (a*b)/[a...
Account used to record multiple commodity transactions.
gboolean xaccAccountGetLowerBalanceLimit(const Account *acc, gnc_numeric *balance)
Get the lower balance limit for the account.
void xaccAccountDestroy(Account *acc)
The xaccAccountDestroy() routine can be used to get rid of an account.
gboolean xaccAccountIsHidden(const Account *acc)
Should this account be "hidden".
gboolean xaccSplitEqual(const Split *sa, const Split *sb, gboolean check_guids, gboolean check_balances, gboolean check_txn_splits)
Equality.
Account * gnc_account_lookup_by_name(const Account *parent, const char *name)
The gnc_account_lookup_by_name() subroutine fetches the account by name from the descendants of the s...
#define PWARN(format, args...)
Log a warning.
void gnc_account_remove_child(Account *parent, Account *child)
This function will remove the specified child account from the specified parent account.
int xaccAccountOrder(const Account *aa, const Account *ab)
The xaccAccountOrder() subroutine defines a sorting order on accounts.
Stock accounts will typically be shown in registers which show three columns: price, number of shares, and value.
const char * xaccAccountGetColor(const Account *acc)
Get the account's color.
Split * xaccAccountFindSplitByDesc(const Account *acc, const char *description)
Returns a pointer to the split, not a copy.
void qof_instance_init_data(QofInstance *inst, QofIdType type, QofBook *book)
Initialise the settings associated with an instance.
gboolean qof_begin_edit(QofInstance *inst)
begin_edit
#define xaccAccountGetGUID(X)
gboolean xaccAccountIsAssetLiabType(GNCAccountType t)
Convenience function to check if the account is a valid Asset or Liability type, but not a business a...
void xaccClearMarkDown(Account *acc, short val)
The xaccClearMarkDown will clear the mark only in this and in sub-accounts.
GList SplitList
GList of Split.
GNCAccountType xaccAccountStringToEnum(const char *str)
Conversion routines for the account types to/from strings that are used in persistent storage...
bank account type – don't use this for now, see NUM_ACCOUNT_TYPES
void xaccSplitSetAmount(Split *split, gnc_numeric amt)
The xaccSplitSetAmount() method sets the amount in the account's commodity that the split should have...
gchar * gnc_account_get_full_name(const Account *account)
The gnc_account_get_full_name routine returns the fully qualified name of the account using the given...
gnc_numeric xaccAccountGetReconciledBalanceAsOfDate(Account *acc, time64 date)
Get the reconciled balance of the account at the end of the day of the date specified.
void xaccAccountSetPlaceholder(Account *acc, gboolean val)
Set the "placeholder" flag for an account.
gboolean xaccAccountTypesCompatible(GNCAccountType parent_type, GNCAccountType child_type)
Return TRUE if accounts of type parent_type can have accounts of type child_type as children...
gnc_numeric xaccAccountGetNoclosingBalanceAsOfDateInCurrency(Account *acc, time64 date, gnc_commodity *report_commodity, gboolean include_children)
This function gets the balance at the end of the given date, ignoring closing entries, in the desired commodity.
gchar * gnc_account_name_violations_errmsg(const gchar *separator, GList *invalid_account_names)
Composes a translatable error message showing which account names clash with the current account sepa...
void xaccAccountClearLowerBalanceLimit(Account *acc)
Clear the lower balance limit for the account.
gboolean xaccTransactionTraverse(Transaction *trans, int stage)
xaccTransactionTraverse() checks the stage of the given transaction.
void xaccAccountSetColor(Account *acc, const char *str)
Set the account's Color.
Transaction * xaccAccountFindTransByDesc(const Account *acc, const char *description)
Returns a pointer to the transaction, not a copy.
void xaccAccountSetIncludeSubAccountBalances(Account *acc, gboolean inc_sub)
Set whether to include balances of sub accounts.
void gnc_account_set_balance_dirty(Account *acc)
Tell the account that the running balances may be incorrect and need to be recomputed.
Income accounts are used to denote income.
void gnc_account_foreach_child(const Account *acc, AccountCb thunk, gpointer user_data)
This method will traverse the immediate children of this accounts, calling 'func' on each account...
Account public routines (C++ api)
#define YREC
The Split has been reconciled.
Account * gnc_account_lookup_by_code(const Account *parent, const char *code)
The gnc_account_lookup_by_code() subroutine works like gnc_account_lookup_by_name, but uses the account code.
void gnc_account_tree_begin_staged_transaction_traversals(Account *account)
gnc_account_tree_begin_staged_transaction_traversals() resets the traversal marker inside every trans...
void dxaccAccountSetPriceSrc(Account *acc, const char *src)
Set a string that identifies the Finance::Quote backend that should be used to retrieve online prices...
#define GUID_ENCODING_LENGTH
Number of characters needed to encode a guid as a string not including the null terminator.
void xaccAccountBeginStagedTransactionTraversals(const Account *account)
xaccAccountBeginStagedTransactionTraversals() resets the traversal marker for each transaction which ...
void gnc_commodity_increment_usage_count(gnc_commodity *cm)
Increment a commodity's internal counter that tracks how many accounts are using that commodity...
#define FREC
frozen into accounting period
GNCPlaceholderType xaccAccountGetDescendantPlaceholder(const Account *acc)
Returns PLACEHOLDER_NONE if account is NULL or neither account nor any descendant of account is a pla...
const char * xaccAccountGetDescription(const Account *acc)
Get the account's description.
void gnc_account_set_start_reconciled_balance(Account *acc, const gnc_numeric start_baln)
This function will set the starting reconciled commodity balance for this account.
void gnc_account_delete_all_bayes_maps(Account *acc)
Delete all bayes entries for Account.
const char * dxaccAccountGetQuoteTZ(const Account *acc)
Get the timezone to be used when interpreting the results from a given Finance::Quote backend...
line of credit – don't use this for now, see NUM_ACCOUNT_TYPES
void xaccAccountClearReconcilePostpone(Account *acc)
DOCUMENT ME!
const char * xaccAccountGetTaxUSPayerNameSource(const Account *acc)
DOCUMENT ME!
gnc_numeric xaccSplitGetNoclosingBalance(const Split *s)
The noclosing-balance is the currency-denominated balance of all transactions except 'closing' transa...
gint null_strcmp(const gchar *da, const gchar *db)
The null_strcmp compares strings a and b the same way that strcmp() does, except that either may be n...
void gnc_account_reset_convert_bayes_to_flat(void)
Reset the flag that indicates the function imap_convert_bayes_to_flat has been run.
GList * gnc_account_get_children_sorted(const Account *account)
This routine returns a GList of all children accounts of the specified account, ordered by xaccAccoun...
The bank account type denotes a savings or checking account held at a bank.
LotList * xaccAccountGetLotList(const Account *acc)
The xaccAccountGetLotList() routine returns a list of all lots in this account.
void xaccAccountRecomputeBalance(Account *acc)
The following recompute the partial balances (stored with the transaction) and the total balance...
GList * gnc_account_imap_get_info_bayes(Account *acc)
Returns a GList of structure imap_info of all Bayesian mappings for required Account.
GList * gnc_account_imap_get_info(Account *acc, const char *category)
Returns a GList of structure imap_info of all Non Bayesian mappings for required Account.
const char * xaccTransGetDescription(const Transaction *trans)
Gets the transaction Description.
Account * gnc_account_lookup_by_full_name(const Account *any_acc, const gchar *name)
The gnc_account_lookup_full_name() subroutine works like gnc_account_lookup_by_name, but uses fully-qualified names using the given separator.
gboolean gnc_account_get_defer_bal_computation(Account *acc)
Get the account's flag for deferred balance computation.
void xaccAccountSetReconcilePostponeDate(Account *acc, time64 postpone_date)
DOCUMENT ME!
gboolean qof_commit_edit_part2(QofInstance *inst, void(*on_error)(QofInstance *, QofBackendError), void(*on_done)(QofInstance *), void(*on_free)(QofInstance *))
part2 – deal with the backend
gpointer(* QofAccessFunc)(gpointer object, const QofParam *param)
The QofAccessFunc defines an arbitrary function pointer for access functions.
const char * xaccAccountGetTaxUSCode(const Account *acc)
DOCUMENT ME!
gboolean xaccAccountIsAPARType(GNCAccountType t)
Convenience function to check if the account is a valid business account type (meaning an Accounts Pa...
void qof_collection_insert_entity(QofCollection *, QofInstance *)
Take entity, remove it from whatever collection its currently in, and place it in a new collection...
bank account type – don't use this for now, see NUM_ACCOUNT_TYPES
void qof_collection_mark_clean(QofCollection *)
reset value of dirty flag
gboolean xaccAccountStringToType(const char *str, GNCAccountType *type)
Conversion routines for the account types to/from strings that are used in persistent storage...
void xaccTransCommitEdit(Transaction *trans)
The xaccTransCommitEdit() method indicates that the changes to the transaction and its splits are com...
Additional event handling code.
void xaccAccountSetIsOpeningBalance(Account *acc, gboolean val)
Set the "opening-balance" flag for an account.
void xaccAccountSetReconcilePostponeBalance(Account *acc, gnc_numeric balance)
DOCUMENT ME!
gboolean xaccAccountEqual(const Account *aa, const Account *ab, gboolean check_guids)
Compare two accounts for equality - this is a deep compare.
gboolean xaccAccountGetTaxRelated(const Account *acc)
DOCUMENT ME!
void gnc_account_set_start_cleared_balance(Account *acc, const gnc_numeric start_baln)
This function will set the starting cleared commodity balance for this account.
Account * xaccCloneAccount(const Account *from, QofBook *book)
The xaccCloneAccount() routine makes a simple copy of the indicated account, placing it in the indica...
void xaccTransBeginEdit(Transaction *trans)
The xaccTransBeginEdit() method must be called before any changes are made to a transaction or any of...
gnc_numeric xaccAccountGetReconciledBalance(const Account *acc)
Get the current balance of the account, only including reconciled transactions.
asset (and liability) accounts indicate generic, generalized accounts that are none of the above...
gint gnc_account_n_children(const Account *account)
Return the number of children of the specified account.
void gnc_account_join_children(Account *to_parent, Account *from_parent)
The gnc_account_join_children() subroutine will move (reparent) all child accounts from the from_pare...
gnc_numeric xaccAccountGetBalanceAsOfDate(Account *acc, time64 date)
Get the balance of the account at the end of the day before the date specified.
gnc_numeric xaccAccountGetBalance(const Account *acc)
Get the current balance of the account, which may include future splits.
gboolean xaccAccountGetReconcileLastDate(const Account *acc, time64 *last_date)
DOCUMENT ME!
void dxaccAccountSetQuoteTZ(Account *acc, const char *tz)
Set the timezone to be used when interpreting the results from a given Finance::Quote backend...
The currency account type indicates that the account is a currency trading account.
void xaccAccountSetCommoditySCU(Account *acc, int scu)
Set the SCU for the account.
gboolean qof_instance_books_equal(gconstpointer ptr1, gconstpointer ptr2)
See if two QofInstances share the same book.
GNCAccountType
The account types are used to determine how the transaction data in the account is displayed...
gnc_commodity * gnc_account_get_currency_or_parent(const Account *account)
Returns a gnc_commodity that is a currency, suitable for being a Transaction's currency.
Account * xaccAccountGetAssociatedAccount(const Account *acc, const char *tag)
Get the account's associated account e.g.
gboolean xaccAccountGetHidden(const Account *acc)
Get the "hidden" flag for an account.
void xaccAccountSetAppendText(Account *acc, gboolean val)
Set the "import-append-text" flag for an account.
Generic api to store and retrieve preferences.
gnc_numeric gnc_numeric_sub(gnc_numeric a, gnc_numeric b, gint64 denom, gint how)
Return a-b.
gboolean gnc_account_insert_split(Account *acc, Split *s)
Insert the given split from an account.
GList * gnc_account_get_descendants(const Account *account)
This routine returns a flat list of all of the accounts that are descendants of the specified account...
void xaccAccountSetAutoInterest(Account *acc, gboolean val)
Set the "auto interest" flag for an account.
void xaccAccountSetTaxUSCode(Account *acc, const char *code)
DOCUMENT ME!
GNCPlaceholderType
DOCUMENT ME!
gboolean xaccAccountGetIsOpeningBalance(const Account *acc)
Get the "opening-balance" flag for an account.
guint32 xaccParentAccountTypesCompatibleWith(GNCAccountType type)
Return the bitmask of parent account types compatible with a given type.
gboolean xaccAccountGetReconcileChildrenStatus(const Account *acc)
DOCUMENT ME!
gboolean xaccAccountGetReconcileLastInterval(const Account *acc, int *months, int *days)
DOCUMENT ME!
gboolean xaccAccountGetIncludeSubAccountBalances(const Account *acc)
Get whether to include balances of sub accounts.
const char * dxaccAccountGetPriceSrc(const Account *acc)
Get a string that identifies the Finance::Quote backend that should be used to retrieve online prices...
liability (and asset) accounts indicate generic, generalized accounts that are none of the above...
const char * gnc_account_get_credit_string(GNCAccountType acct_type)
Get the credit string associated with this account type.
gboolean gnc_lot_is_closed(GNCLot *lot)
Returns closed status of the given lot.
GList * gnc_account_get_children(const Account *account)
This routine returns a GList of all children accounts of the specified account.
Split * gnc_account_find_split(const Account *acc, std::function< bool(const Split *)> predicate, bool reverse)
scans account split list (in forward or reverse order) until predicate split->bool returns true...
void xaccAccountSetHidden(Account *acc, gboolean val)
Set the "hidden" flag for an account.
void xaccAccountBeginEdit(Account *acc)
The xaccAccountBeginEdit() subroutine is the first phase of a two-phase-commit wrapper for account up...
gboolean xaccAccountHasAncestor(const Account *acc, const Account *ancestor)
Returns true if the account is 'ancestor' or has 'ancestor' as an ancestor.
Account * xaccSplitGetAccount(const Split *split)
Returns the account of this split, which was set through xaccAccountInsertSplit().
gchar * guid_to_string(const GncGUID *guid)
The guid_to_string() routine returns a null-terminated string encoding of the id. ...
gnc_commodity * xaccAccountGetCommodity(const Account *acc)
Get the account's commodity.
gboolean xaccTransGetIsClosingTxn(const Transaction *trans)
Returns whether this transaction is a "closing transaction".
gint qof_instance_guid_compare(gconstpointer ptr1, gconstpointer ptr2)
Compare the GncGUID values of two instances.
gboolean xaccAccountGetPlaceholder(const Account *acc)
Get the "placeholder" flag for an account.
time64 gnc_time64_get_today_end(void)
The gnc_time64_get_today_end() routine returns a time64 value corresponding to the last second of tod...
gint gnc_account_get_current_depth(const Account *account)
Return the number of levels of this account below the root account.
gboolean gnc_prefs_get_bool(const gchar *group, const gchar *pref_name)
Get a boolean value from the preferences backend.
void xaccAccountSetSortReversed(Account *acc, gboolean sortreversed)
Set the account's Sort Order direction.
bank account type – don't use this for now, see NUM_ACCOUNT_TYPES
#define LEAVE(format, args...)
Print a function exit debugging message.
Account * xaccAccountGainsAccount(Account *acc, gnc_commodity *curr)
Retrieve the gains account used by this account for the indicated currency, creating and recording a ...
void xaccAccountSetLowerBalanceLimit(Account *acc, gnc_numeric balance)
Set the lower balance limit for the account.
const char * gnc_commodity_get_unique_name(const gnc_commodity *cm)
Retrieve the 'unique' name for the specified commodity.
gboolean xaccAccountGetHigherBalanceLimit(const Account *acc, gnc_numeric *balance)
Get the higher balance limit for the account.
Round to the nearest integer, rounding away from zero when there are two equidistant nearest integers...
Account * gnc_account_nth_child(const Account *parent, gint num)
Return the n'th child account of the specified parent account.
Account * xaccMallocAccount(QofBook *book)
Constructor.
gint gnc_account_child_index(const Account *parent, const Account *child)
Return the index of the specified child within the list of the parent's children. ...
GNCNumericErrorCode gnc_numeric_check(gnc_numeric in)
Check for error signal in value.
QofCollection * qof_book_get_collection(const QofBook *book, QofIdType entity_type)
Return The table of entities of the given type.
gint64 time64
Most systems that are currently maintained, including Microsoft Windows, BSD-derived Unixes and Linux...
void xaccAccountSetTaxUSPayerNameSource(Account *acc, const char *source)
DOCUMENT ME!
Account * gnc_lot_get_account(const GNCLot *lot)
Returns the account with which this lot is associated.
gboolean qof_object_register(const QofObject *object)
Register new types of object objects.
void xaccAccountSetDescription(Account *acc, const char *str)
Set the account's description.
void DxaccAccountSetCurrency(Account *acc, gnc_commodity *currency)
gpointer qof_collection_get_data(const QofCollection *col)
Store and retrieve arbitrary object-defined data.
void gnc_account_set_start_balance(Account *acc, const gnc_numeric start_baln)
This function will set the starting commodity balance for this account.
void xaccAccountSetNonStdSCU(Account *acc, gboolean flag)
Set the flag indicating that this account uses a non-standard SCU.
LotList * xaccAccountFindOpenLots(const Account *acc, gboolean(*match_func)(GNCLot *lot, gpointer user_data), gpointer user_data, GCompareFunc sort_func)
Find a list of open lots that match the match_func.
Account * gnc_account_get_root(Account *acc)
This routine returns the root account of the account tree that the specified account belongs to...
Account * gnc_account_lookup_by_opening_balance(Account *account, gnc_commodity *commodity)
Find the opening balance account for the currency.
void xaccAccountClearHigherBalanceLimit(Account *acc)
Clear the higher balance limit for the account.
void gnc_account_set_defer_bal_computation(Account *acc, gboolean defer)
Set the defer balance flag.
gboolean qof_book_shutting_down(const QofBook *book)
Is the book shutting down?
const char * xaccAccountGetName(const Account *acc)
Get the account's name.
Equity account is used to balance the balance sheet.
void qof_event_gen(QofInstance *entity, QofEventId event_id, gpointer event_data)
Invoke all registered event handlers using the given arguments.
const char * xaccAccountGetTypeStr(GNCAccountType type)
The xaccAccountGetTypeStr() routine returns a string suitable for use in the GUI/Interface.
#define GNC_EVENT_ITEM_ADDED
These events are used when a split is added to an account.
const char * xaccAccountGetSortOrder(const Account *acc)
Get the account's Sort Order.
#define GNC_DENOM_AUTO
Values that can be passed as the 'denom' argument.
API for Transactions and Splits (journal entries)
The type used to store guids in C.
int xaccAccountStagedTransactionTraversal(const Account *acc, unsigned int stage, TransactionCallback thunk, void *cb_data)
xaccAccountStagedTransactionTraversal() calls thunk on each transaction in account a whose current ma...
void xaccAccountCommitEdit(Account *acc)
ThexaccAccountCommitEdit() subroutine is the second phase of a two-phase-commit wrapper for account u...
void xaccClearMark(Account *acc, short val)
Get the mark set by xaccAccountSetMark short xaccAccountGetMark (const Account *account);.
void xaccAccountSetName(Account *acc, const char *str)
Set the account's name.
The hidden root account of an account tree.
gnc_commodity * gnc_commodity_obtain_twin(const gnc_commodity *from, QofBook *book)
Given the commodity 'findlike', this routine will find and return the equivalent commodity (commodity...
GNCPolicy * gnc_account_get_policy(Account *acc)
Get the account's lot order policy.
void qof_string_cache_remove(const char *key)
You can use this function as a destroy notifier for a GHashTable that uses common strings as keys (or...
gboolean gnc_commodity_equiv(const gnc_commodity *a, const gnc_commodity *b)
This routine returns TRUE if the two commodities are equivalent.
void gnc_account_merge_children(Account *parent)
The gnc_account_merge_children() subroutine will go through an account, merging all child accounts th...
gboolean xaccAccountIsEquityType(GNCAccountType t)
Convenience function to check if the account is a valid Equity type.
void xaccAccountSetReconcileChildrenStatus(Account *acc, gboolean status)
DOCUMENT ME!
The Credit card account is used to denote credit (e.g.
const gchar * gnc_get_account_separator_string(void)
Returns the account separation character chosen by the user.
void xaccAccountSetCommodity(Account *acc, gnc_commodity *com)
Set the account's commodity.
#define NREC
not reconciled or cleared
gnc_numeric xaccSplitGetAmount(const Split *split)
Returns the amount of the split in the account's commodity.
GList * gnc_account_lookup_by_type_and_commodity(Account *root, const char *name, GNCAccountType acctype, gnc_commodity *commodity)
Find a direct child account matching name, GNCAccountType, and/or commodity.
const char * xaccAccountGetNotes(const Account *acc)
Get the account's notes.
gboolean xaccAccountGetReconcilePostponeBalance(const Account *acc, gnc_numeric *balance)
DOCUMENT ME!
gint gnc_account_get_tree_depth(const Account *account)
Return the number of levels of descendants accounts below the specified account.
GNCPolicy * xaccGetFIFOPolicy(void)
First-in, First-out Policy This policy will create FIFO Lots.
Utility functions for file access.
Account * gnc_account_imap_find_account_bayes(Account *acc, GList *tokens)
Look up an Account in the map.
Account * xaccAccountLookup(const GncGUID *guid, QofBook *book)
The xaccAccountLookup() subroutine will return the account associated with the given id...
void xaccAccountSetTaxUSCopyNumber(Account *acc, gint64 copy_number)
DOCUMENT ME!