This file is indexed.

/usr/include/gnucash/Account.h is in gnucash-common 1:2.6.15-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

   1
   2
   3
   4
   5
   6
   7
   8
   9
  10
  11
  12
  13
  14
  15
  16
  17
  18
  19
  20
  21
  22
  23
  24
  25
  26
  27
  28
  29
  30
  31
  32
  33
  34
  35
  36
  37
  38
  39
  40
  41
  42
  43
  44
  45
  46
  47
  48
  49
  50
  51
  52
  53
  54
  55
  56
  57
  58
  59
  60
  61
  62
  63
  64
  65
  66
  67
  68
  69
  70
  71
  72
  73
  74
  75
  76
  77
  78
  79
  80
  81
  82
  83
  84
  85
  86
  87
  88
  89
  90
  91
  92
  93
  94
  95
  96
  97
  98
  99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 147
 148
 149
 150
 151
 152
 153
 154
 155
 156
 157
 158
 159
 160
 161
 162
 163
 164
 165
 166
 167
 168
 169
 170
 171
 172
 173
 174
 175
 176
 177
 178
 179
 180
 181
 182
 183
 184
 185
 186
 187
 188
 189
 190
 191
 192
 193
 194
 195
 196
 197
 198
 199
 200
 201
 202
 203
 204
 205
 206
 207
 208
 209
 210
 211
 212
 213
 214
 215
 216
 217
 218
 219
 220
 221
 222
 223
 224
 225
 226
 227
 228
 229
 230
 231
 232
 233
 234
 235
 236
 237
 238
 239
 240
 241
 242
 243
 244
 245
 246
 247
 248
 249
 250
 251
 252
 253
 254
 255
 256
 257
 258
 259
 260
 261
 262
 263
 264
 265
 266
 267
 268
 269
 270
 271
 272
 273
 274
 275
 276
 277
 278
 279
 280
 281
 282
 283
 284
 285
 286
 287
 288
 289
 290
 291
 292
 293
 294
 295
 296
 297
 298
 299
 300
 301
 302
 303
 304
 305
 306
 307
 308
 309
 310
 311
 312
 313
 314
 315
 316
 317
 318
 319
 320
 321
 322
 323
 324
 325
 326
 327
 328
 329
 330
 331
 332
 333
 334
 335
 336
 337
 338
 339
 340
 341
 342
 343
 344
 345
 346
 347
 348
 349
 350
 351
 352
 353
 354
 355
 356
 357
 358
 359
 360
 361
 362
 363
 364
 365
 366
 367
 368
 369
 370
 371
 372
 373
 374
 375
 376
 377
 378
 379
 380
 381
 382
 383
 384
 385
 386
 387
 388
 389
 390
 391
 392
 393
 394
 395
 396
 397
 398
 399
 400
 401
 402
 403
 404
 405
 406
 407
 408
 409
 410
 411
 412
 413
 414
 415
 416
 417
 418
 419
 420
 421
 422
 423
 424
 425
 426
 427
 428
 429
 430
 431
 432
 433
 434
 435
 436
 437
 438
 439
 440
 441
 442
 443
 444
 445
 446
 447
 448
 449
 450
 451
 452
 453
 454
 455
 456
 457
 458
 459
 460
 461
 462
 463
 464
 465
 466
 467
 468
 469
 470
 471
 472
 473
 474
 475
 476
 477
 478
 479
 480
 481
 482
 483
 484
 485
 486
 487
 488
 489
 490
 491
 492
 493
 494
 495
 496
 497
 498
 499
 500
 501
 502
 503
 504
 505
 506
 507
 508
 509
 510
 511
 512
 513
 514
 515
 516
 517
 518
 519
 520
 521
 522
 523
 524
 525
 526
 527
 528
 529
 530
 531
 532
 533
 534
 535
 536
 537
 538
 539
 540
 541
 542
 543
 544
 545
 546
 547
 548
 549
 550
 551
 552
 553
 554
 555
 556
 557
 558
 559
 560
 561
 562
 563
 564
 565
 566
 567
 568
 569
 570
 571
 572
 573
 574
 575
 576
 577
 578
 579
 580
 581
 582
 583
 584
 585
 586
 587
 588
 589
 590
 591
 592
 593
 594
 595
 596
 597
 598
 599
 600
 601
 602
 603
 604
 605
 606
 607
 608
 609
 610
 611
 612
 613
 614
 615
 616
 617
 618
 619
 620
 621
 622
 623
 624
 625
 626
 627
 628
 629
 630
 631
 632
 633
 634
 635
 636
 637
 638
 639
 640
 641
 642
 643
 644
 645
 646
 647
 648
 649
 650
 651
 652
 653
 654
 655
 656
 657
 658
 659
 660
 661
 662
 663
 664
 665
 666
 667
 668
 669
 670
 671
 672
 673
 674
 675
 676
 677
 678
 679
 680
 681
 682
 683
 684
 685
 686
 687
 688
 689
 690
 691
 692
 693
 694
 695
 696
 697
 698
 699
 700
 701
 702
 703
 704
 705
 706
 707
 708
 709
 710
 711
 712
 713
 714
 715
 716
 717
 718
 719
 720
 721
 722
 723
 724
 725
 726
 727
 728
 729
 730
 731
 732
 733
 734
 735
 736
 737
 738
 739
 740
 741
 742
 743
 744
 745
 746
 747
 748
 749
 750
 751
 752
 753
 754
 755
 756
 757
 758
 759
 760
 761
 762
 763
 764
 765
 766
 767
 768
 769
 770
 771
 772
 773
 774
 775
 776
 777
 778
 779
 780
 781
 782
 783
 784
 785
 786
 787
 788
 789
 790
 791
 792
 793
 794
 795
 796
 797
 798
 799
 800
 801
 802
 803
 804
 805
 806
 807
 808
 809
 810
 811
 812
 813
 814
 815
 816
 817
 818
 819
 820
 821
 822
 823
 824
 825
 826
 827
 828
 829
 830
 831
 832
 833
 834
 835
 836
 837
 838
 839
 840
 841
 842
 843
 844
 845
 846
 847
 848
 849
 850
 851
 852
 853
 854
 855
 856
 857
 858
 859
 860
 861
 862
 863
 864
 865
 866
 867
 868
 869
 870
 871
 872
 873
 874
 875
 876
 877
 878
 879
 880
 881
 882
 883
 884
 885
 886
 887
 888
 889
 890
 891
 892
 893
 894
 895
 896
 897
 898
 899
 900
 901
 902
 903
 904
 905
 906
 907
 908
 909
 910
 911
 912
 913
 914
 915
 916
 917
 918
 919
 920
 921
 922
 923
 924
 925
 926
 927
 928
 929
 930
 931
 932
 933
 934
 935
 936
 937
 938
 939
 940
 941
 942
 943
 944
 945
 946
 947
 948
 949
 950
 951
 952
 953
 954
 955
 956
 957
 958
 959
 960
 961
 962
 963
 964
 965
 966
 967
 968
 969
 970
 971
 972
 973
 974
 975
 976
 977
 978
 979
 980
 981
 982
 983
 984
 985
 986
 987
 988
 989
 990
 991
 992
 993
 994
 995
 996
 997
 998
 999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
/********************************************************************\
 * This program is free software; you can redistribute it and/or    *
 * modify it under the terms of the GNU General Public License as   *
 * published by the Free Software Foundation; either version 2 of   *
 * the License, or (at your option) any later version.              *
 *                                                                  *
 * This program is distributed in the hope that it will be useful,  *
 * but WITHOUT ANY WARRANTY; without even the implied warranty of   *
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *
 * GNU General Public License for more details.                     *
 *                                                                  *
 * You should have received a copy of the GNU General Public License*
 * along with this program; if not, contact:                        *
 *                                                                  *
 * Free Software Foundation           Voice:  +1-617-542-5942       *
 * 51 Franklin Street, Fifth Floor    Fax:    +1-617-542-2652       *
 * Boston, MA  02110-1301,  USA       gnu@gnu.org                   *
 *                                                                  *
\********************************************************************/
/** @addtogroup Engine
    @{ */
/** @addtogroup Account
    Splits are grouped into Accounts which are also known
    as "Ledgers" in accounting practice. Each Account consists of a list of
    Splits that debit that Account. To ensure consistency, if a Split points
    to an Account, then the Account must point to the Split, and vice-versa.
    A Split can belong to at most one Account. Besides merely containing a
    list of Splits, the Account structure also gives the Account a name, a
    code number, description and notes fields, a key-value frame, a pointer
    to the commodity that is used for all splits in this account. The
    commodity can be the name of anything traded and tradeable: a stock
    (e.g. "IBM", "McDonald's"), a currency (e.g. "USD", "GBP"), or
    anything added to the commodity table.

    Accounts can be arranged in a hierarchical tree.  By accounting
    convention, the value of an Account is equal to the value of all of its
    Splits plus the value of all of its sub-Accounts.
    @{ */
/** @file Account.h
    @brief Account handling public routines
    @author Copyright (C) 1997 Robin D. Clark
    @author Copyright (C) 1997-2003 Linas Vepstas <linas@linas.org>
*/

#ifndef XACC_ACCOUNT_H
#define XACC_ACCOUNT_H
#include "qof.h"
#include "gnc-engine.h"
#include "policy.h"

typedef gnc_numeric (*xaccGetBalanceFn)( const Account *account );

typedef gnc_numeric (*xaccGetBalanceInCurrencyFn) (
    const Account *account, const gnc_commodity *report_commodity,
    gboolean include_children);

typedef gnc_numeric (*xaccGetBalanceAsOfDateFn) (
    Account *account, time64 date);

typedef void (*AccountCb)(Account *a, gpointer data);
typedef gpointer (*AccountCb2)(Account *a, gpointer data);

typedef struct
{
    QofInstanceClass parent_class;
} AccountClass;

/* --- type macros --- */
#define GNC_TYPE_ACCOUNT            (gnc_account_get_type ())
#define GNC_ACCOUNT(o)              \
     (G_TYPE_CHECK_INSTANCE_CAST ((o), GNC_TYPE_ACCOUNT, Account))
#define GNC_ACCOUNT_CLASS(k)        \
     (G_TYPE_CHECK_CLASS_CAST((k), GNC_TYPE_ACCOUNT, AccountClass))
#define GNC_IS_ACCOUNT(o)           \
     (G_TYPE_CHECK_INSTANCE_TYPE ((o), GNC_TYPE_ACCOUNT))
#define GNC_IS_ACCOUNT_CLASS(k)     \
     (G_TYPE_CHECK_CLASS_TYPE ((k), GNC_TYPE_ACCOUNT))
#define GNC_ACCOUNT_GET_CLASS(o)    \
     (G_TYPE_INSTANCE_GET_CLASS ((o), GNC_TYPE_ACCOUNT, AccountClass))
/** Returns the GType type system description of the Account class.
 *
 * This must not be confused with the \ref GNCAccountType as returned
 * by xaccAccountGetType(). */
GType gnc_account_get_type(void);

/** The account types are used to determine how the transaction data
 * in the account is displayed.   These values can be safely changed
 * from one release to the next.  Note that if values are added,
 * the file IO translation routines need to be updated. Note
 * also that GUI code depends on these numbers.
 *
 * @note ***IMPORTANT***: If you do change the enumeration names (not the
 * numbers), you need to update xaccAccountTypeEnumAsString --- used
 * for text file exports */

typedef enum
{
    ACCT_TYPE_INVALID = -1, /**< Not a type */
    ACCT_TYPE_NONE = -1,/**< Not a type */

    ACCT_TYPE_BANK = 0,	/**< The bank account type denotes a savings
			 *   or checking account held at a bank.
			 *   Often interest bearing. */
    ACCT_TYPE_CASH = 1,	/**< The cash account type is used to denote a
			 *   shoe-box or pillowcase stuffed with *
			 *   cash. */
    ACCT_TYPE_CREDIT = 3,	/**< The Credit card account is used to denote
			 *   credit (e.g. amex) and debit (e.g. visa,
			 *   mastercard) card accounts */
    ACCT_TYPE_ASSET = 2,	/**< asset (and liability) accounts indicate
			 *   generic, generalized accounts that are
			 *   none of the above. */
    ACCT_TYPE_LIABILITY = 4,/**< liability (and asset) accounts indicate
			   *   generic, generalized accounts that are
			   *   none of the above. */
    ACCT_TYPE_STOCK = 5,	/**< Stock accounts will typically be shown in
			 *   registers which show three columns:
			 *   price, number of shares, and value. */
    ACCT_TYPE_MUTUAL = 6,	/**< Mutual Fund accounts will typically be
			 *   shown in registers which show three
			 *   columns: price, number of shares, and
			 *   value. */
    ACCT_TYPE_CURRENCY = 7,/**< The currency account type indicates that
			  *   the account is a currency trading
			  *   account.  In many ways, a currency
			  *   trading account is like a stock *
			  *   trading account. It is shown in the
			  *   register with three columns: price,
			  *   number of shares, and value. Note:
			  *   Since version 1.7.0, this account is *
			  *   no longer needed to exchange currencies
			  *   between accounts, so this type is
			  *   DEPRECATED. */
    ACCT_TYPE_INCOME = 8,	/**< Income accounts are used to denote
			 *   income */

    ACCT_TYPE_EXPENSE = 9,/**< Expense accounts are used to denote
			 *   expenses. */

    ACCT_TYPE_EQUITY = 10,/**< Equity account is used to balance the
			 *   balance sheet. */

    ACCT_TYPE_RECEIVABLE = 11,/**< A/R account type */

    ACCT_TYPE_PAYABLE = 12,  /**< A/P account type */

    ACCT_TYPE_ROOT = 13, /**< The hidden root account of an account tree. */

    ACCT_TYPE_TRADING = 14, /**< Account used to record multiple commodity transactions.
                           *   This is not the same as ACCT_TYPE_CURRENCY above.
                           *   Multiple commodity transactions have splits in these
                           *   accounts to make the transaction balance in each
                           *   commodity as well as in total value.  */

    NUM_ACCOUNT_TYPES = 15,  /**< stop here; the following types
			    * just aren't ready for prime time */

    /* bank account types */
    ACCT_TYPE_CHECKING = 15, /**< bank account type -- don't use this
			    *   for now, see NUM_ACCOUNT_TYPES  */
    ACCT_TYPE_SAVINGS = 16, /**< bank account type -- don't use this for
			   *   now, see NUM_ACCOUNT_TYPES  */
    ACCT_TYPE_MONEYMRKT = 17, /**< bank account type -- don't use this
			     *   for now, see NUM_ACCOUNT_TYPES  */
    ACCT_TYPE_CREDITLINE = 18, /**< line of credit -- don't use this for
			      *   now, see NUM_ACCOUNT_TYPES  */
    ACCT_TYPE_LAST
} GNCAccountType;



/** @name Account Constructors, Edit/Commit, Comparison
 @{ */

/** Constructor */
Account * xaccMallocAccount (QofBook *book);

/** Create a new root level account.  */
Account * gnc_account_create_root (QofBook *book);

/** The xaccCloneAccount() routine makes a simple copy of the
 *  indicated account, placing it in the indicated book.  It copies
 *  the account type, name, description, and the kvp values;
 *  it does not copy splits/transactions.  The book should have
 *  a commodity table in it that has commodities with the same
 *  unique name as the ones being copied in the account (the
 *  commodities in the clone will be those from the book).
 */
Account * xaccCloneAccount (const Account *source, QofBook *book);

/** The xaccAccountBeginEdit() subroutine is the first phase of
 *    a two-phase-commit wrapper for account updates. */
void xaccAccountBeginEdit (Account *account);

/** ThexaccAccountCommitEdit() subroutine is the second phase of
 *    a two-phase-commit wrapper for account updates. */
void xaccAccountCommitEdit (Account *account);

/** The xaccAccountDestroy() routine can be used to get rid of an
 *    account.  The account should have been opened for editing
 *    (by calling xaccAccountBeginEdit()) before calling this routine.*/
void xaccAccountDestroy (Account *account);

/** Compare two accounts for equality - this is a deep compare. */
gboolean xaccAccountEqual(const Account *a, const Account* b,
                          gboolean check_guids);

/** The xaccAccountOrder() subroutine defines a sorting order on
 *    accounts.  It takes pointers to two accounts, and returns an int < 0 if
 *    the first account is "less than" the second, returns an int > 0 if the
 *    first is "greater than" the second, and 0 if they are equal.  To
 *    determine the sort order, first the account codes are compared,
 *    and if these are equal, then account types, then account
 *    names. If still equal, it compares GUID to ensure that there
 *    aren't any ties.
 */
int xaccAccountOrder (const Account *account_1, const Account *account_2);

/** @} */

/* ------------------ */

/** @name Account lookup and GncGUID routines
 @{ */

/** Returns the account separation character chosen by the user.
 *
 *  @return The character to use.
 */
const gchar *gnc_get_account_separator_string (void);
gunichar gnc_get_account_separator (void);
void gnc_set_account_separator (const gchar *separator);

/*@ dependent @*/
Account *gnc_book_get_root_account(QofBook *book);
void gnc_book_set_root_account(QofBook *book, Account *root);

/** @deprecated */
#define xaccAccountGetGUID(X)     qof_entity_get_guid(QOF_INSTANCE(X))
#define xaccAccountReturnGUID(X) (X ? *(qof_entity_get_guid(QOF_INSTANCE(X))) : *(guid_null()))

/** The xaccAccountLookup() subroutine will return the
 *    account associated with the given id, or NULL
 *    if there is no such account. */
/*@ dependent @*/ Account * xaccAccountLookup (const GncGUID *guid, QofBook *book);
#define xaccAccountLookupDirect(g,b) xaccAccountLookup(&(g),b)

/** @} */

/** Composes a translatable error message showing which account
 *  names clash with the current account separator. Can be called
 *  after gnc_account_list_name_violations to have a consistent
 *  error message in different parts of GnuCash
 *
 *  @param separator The separator character that was verified against
 *  @param invalid_account_names A GList of invalid account names.
 *
 *  @return An error message that can be displayed to the user or logged.
 *          This message string should be freed with g_free when no longer
 *          needed.
 */
gchar *gnc_account_name_violations_errmsg (const gchar *separator, GList* invalid_account_names);

/** Runs through all the accounts and returns a list of account names
 *  that contain the provided separator character. This can be used to
 *  check if certain account names are invalid.
 *
 *  @param book Pointer to the book with accounts to verify
 *  @param separator The separator character to verify against
 *
 *  @return A GList of invalid account names. Should be freed with g_list_free
 *          if no longer needed.
 */
GList *gnc_account_list_name_violations (QofBook *book, const gchar *separator);

/* ------------------ */

/** @name Account general setters/getters
 @{ */

QofBook *gnc_account_get_book(const Account *account);
/** Set the account's type */
void xaccAccountSetType (Account *account, GNCAccountType);
/** Set the account's name */
void xaccAccountSetName (Account *account, const char *name);
/** Set the account's accounting code */
void xaccAccountSetCode (Account *account, const char *code);
/** Set the account's description */
void xaccAccountSetDescription (Account *account, const char *desc);
/** Set the account's Color */
void xaccAccountSetColor (Account *account, const char *color);
/** Set the account's Filter */
void xaccAccountSetFilter (Account *account, const char *filter);
/** Set the account's Sort Order */
void xaccAccountSetSortOrder (Account *account, const char *sortorder);
/** Set the account's Sort Order direction */
void xaccAccountSetSortReversed (Account *account, gboolean sortreversed);
/** Set the account's notes */
void xaccAccountSetNotes (Account *account, const char *notes);
/** Set the last num field of an Account */
void xaccAccountSetLastNum (Account *account, const char *num);
/** Set the account's lot order policy */
void gnc_account_set_policy (Account *account, GNCPolicy *policy);
/** Returns the account's account type.
 *
 * This must not be confused with the \ref GType as returned by
 * gnc_account_get_type(), which is related to glib's type system. */
GNCAccountType xaccAccountGetType (const Account *account);
/** Returns true if the account is a stock, mutual fund or currency,
 * otherwise false. */
gboolean xaccAccountIsPriced(const Account *acc);

/** This function will set the starting commodity balance for this
 *  account.  This routine is intended for use with backends that do
 *  not return the complete list of splits for an account, but rather
 *  return a partial list.  In such a case, the backend will typically
 *  return all of the splits after some certain date, and the
 *  'starting balance' will represent the summation of the splits up
 *  to that date. */
void gnc_account_set_start_balance (Account *acc,
                                    const gnc_numeric start_baln);

/** This function will set the starting cleared commodity balance for
 *  this account.  This routine is intended for use with backends that
 *  do not return the complete list of splits for an account, but
 *  rather return a partial list.  In such a case, the backend will
 *  typically return all of the splits after some certain date, and
 *  the 'starting balance' will represent the summation of the splits
 *  up to that date. */
void gnc_account_set_start_cleared_balance (Account *acc,
        const gnc_numeric start_baln);

/** This function will set the starting reconciled commodity balance
 *  for this account.  This routine is intended for use with backends
 *  that do not return the complete list of splits for an account, but
 *  rather return a partial list.  In such a case, the backend will
 *  typically return all of the splits after some certain date, and
 *  the 'starting balance' will represent the summation of the splits
 *  up to that date. */
void gnc_account_set_start_reconciled_balance (Account *acc,
        const gnc_numeric start_baln);

/** Tell the account that the running balances may be incorrect and
 *  need to be recomputed.
 *
 *  @param acc Set the flag on this account. */
void gnc_account_set_balance_dirty (Account *acc);

/** Tell the account believes that the splits may be incorrectly
 *  sorted and need to be resorted.
 *
 *  @param acc Set the flag on this account. */
void gnc_account_set_sort_dirty (Account *acc);

/** Insert the given split from an account.
 *
 *  @param acc The account to which the split should be added.
 *
 *  @param s The split to be added.
 *
 *  @result TRUE is the split is successfully added to the set of
 *  splits in the account.  FALSE if the addition fails for any reason
 *  (including that the split is already in the account). */
gboolean gnc_account_insert_split (Account *acc, Split *s);

/** Remove the given split from an account.
 *
 *  @param acc The account from which the split should be removed.
 *
 *  @param s The split to be removed.
 *
 *  @result TRUE is the split is successfully removed from the set of
 *  splits in the account.  FALSE if the removal fails for any
 *  reason. */
gboolean gnc_account_remove_split (Account *acc, Split *s);

/** Get the account's name */
const char * xaccAccountGetName (const Account *account);
/** Get the account's accounting code */
const char * xaccAccountGetCode (const Account *account);
/** Get the account's description */
const char * xaccAccountGetDescription (const Account *account);
/** Get the account's color */
const char * xaccAccountGetColor (const Account *account);
/** Get the account's filter */
const char * xaccAccountGetFilter (const Account *account);
/** Get the account's Sort Order */
const char * xaccAccountGetSortOrder (const Account *account);
/** Get the account's Sort Order direction */
gboolean xaccAccountGetSortReversed (const Account *account);
/** Get the account's notes */
const char * xaccAccountGetNotes (const Account *account);
/** Get the last num field of an Account */
const char * xaccAccountGetLastNum (const Account *account);
/** Get the account's lot order policy */
GNCPolicy *gnc_account_get_policy (Account *account);

/** The following recompute the partial balances (stored with the
 *  transaction) and the total balance, for this account
 */
void xaccAccountRecomputeBalance (Account *);

/** The xaccAccountSortSplits() routine will resort the account's
 *  splits if the sort is dirty. If 'force' is true, the account
 *  is sorted even if the editlevel is not zero.
 */
void xaccAccountSortSplits (Account *acc, gboolean force);

/** The gnc_account_get_full_name routine returns the fully qualified name
 * of the account using the given separator char. The name must be
 * g_free'd after use. The fully qualified name of an account is the
 * concatenation of the names of the account and all its ancestor
 * accounts starting with the topmost account and ending with the
 * given account. Each name is separated by the given character.
 *
 * @note: WAKE UP!
 * Unlike all other gets, the string returned by gnc_account_get_full_name()
 * must be freed by you the user !!!
 * hack alert -- since it breaks the rule of string allocation, maybe this
 * routine should not be in this library, but some utility library?
 */
gchar * gnc_account_get_full_name (const Account *account);

/** Set a string that identifies the Finance::Quote backend that
 *  should be used to retrieve online prices.  See price-quotes.scm
 *  for more information
 *
 *  @deprecated Price quote information is now stored on the
 *  commodity, not the account. */
void dxaccAccountSetPriceSrc (Account *account, const char *src);
/** Get a string that identifies the Finance::Quote backend that
 *  should be used to retrieve online prices.  See price-quotes.scm
 *  for more information.
 *
 *  @deprecated Price quote information is now stored on the
 *  commodity, not the account. */
const char * dxaccAccountGetPriceSrc (const Account *account);

/** Returns a per-account flag: Prior to reconciling an account which
    charges or pays interest, this flag tells whether to prompt the
    user to enter a transaction for the interest charge or
    payment. This per-account flag overrides the global preference. */
gboolean xaccAccountGetAutoInterestXfer (const Account *account,
        gboolean default_value);
/** Sets a per-account flag: Prior to reconciling an account which
    charges or pays interest, this flag tells whether to prompt the
    user to enter a transaction for the interest charge or
    payment. This per-account flag overrides the global preference. */
void xaccAccountSetAutoInterestXfer (Account *account, gboolean value);
/** @} */

/** @name Account Commodity setters/getters

 *   Accounts are used to store an amount of 'something', that 'something'
 *   is called the 'commodity'.  An account can only hold one kind of
 *   commodity.  The following are used to get and set the commodity,
 *   and also to set the SCU, the 'Smallest Commodity Unit'.
 *
 * Note that when we say that a 'split' holds an 'amount', that amount
 *   is denominated in the account commodity.  Do not confuse 'amount'
 *   and 'value'.  The 'value' of a split is the value of the amount
 *   expressed in the currency of the transaction.  Thus, for example,
 *   the 'amount' may be 12 apples, where the account commodity is
 *   'apples'.  The value of these 12 apples may be 12 dollars, where
 *   the transaction currency is 'dollars'.
 *
 * The SCU is the 'Smallest Commodity Unit', signifying the smallest
 *   non-zero amount that can be stored in the account.  It is
 *   represented as the integer denominator of a fraction.  Thus,
 *   for example, a SCU of 12 means that 1/12 of something is the
 *   smallest amount that can be stored in the account.  SCU's can
 *   be any value; they do not need to be decimal.  This allows
 *   the use of accounts with unusual, non-decimal commodities and
 *   currencies.
 *
 *   Normally, the SCU is determined by the commodity of the account.
 *   However, this default SCU can be over-ridden and set to an
 *   account-specific value.  This is account-specific value is
 *   called the 'non-standard' value in the documentation below.
 @{
*/

/** Set the account's commodity */
void xaccAccountSetCommodity (Account *account, gnc_commodity *comm);

/** Get the account's commodity  */
/*@ dependent @*/
gnc_commodity * xaccAccountGetCommodity (const Account *account);

/** Returns a gnc_commodity that is a currency, suitable for being a
Transaction's currency. The gnc_commodity is taken either from the current
account, or from the next parent account that has a gnc_commodity that is a
currency. If neither this account nor any of its parent has such a commodity
that is a currency, NULL is returned. In that case, you can use
gnc_default_currency() but you might want to show a warning dialog first. */
gnc_commodity * gnc_account_get_currency_or_parent(const Account* account);

/** Return the SCU for the account.  If a non-standard SCU has been
 *   set for the account, that is returned; else the default SCU for
 *   the account commodity is returned.
 */
int xaccAccountGetCommoditySCU (const Account *account);

/** Return the 'internal' SCU setting.  This returns the over-ride
 *   SCU for the account (which might not be set, and might be zero).  */
int xaccAccountGetCommoditySCUi (const Account *account);

/** Set the SCU for the account. Normally, this routine is not
 *   required, as the default SCU for an account is given by its
 *   commodity.
 */
void xaccAccountSetCommoditySCU (Account *account, int frac);

/** Set the flag indicating that this account uses a non-standard SCU. */
void xaccAccountSetNonStdSCU (Account *account, gboolean flag);

/** Return boolean, indicating whether this account uses a
 *   non-standard SCU. */
gboolean  xaccAccountGetNonStdSCU (const Account *account);
/**@}*/


/** @name Account Balance
 @{
*/
/** Get the current balance of the account, which may include future
    splits */
gnc_numeric xaccAccountGetBalance (const Account *account);
/** Get the current balance of the account, only including cleared
    transactions */
gnc_numeric xaccAccountGetClearedBalance (const Account *account);
/** Get the current balance of the account, only including reconciled
    transactions */
gnc_numeric xaccAccountGetReconciledBalance (const Account *account);
gnc_numeric xaccAccountGetPresentBalance (const Account *account);
gnc_numeric xaccAccountGetProjectedMinimumBalance (const Account *account);
/** Get the balance of the account as of the date specified */
gnc_numeric xaccAccountGetBalanceAsOfDate (Account *account,
        time64 date);

/* These two functions convert a given balance from one commodity to
   another.  The account argument is only used to get the Book, and
   may have nothing to do with the supplied balance.  Likewise, the
   date argument is only used for commodity conversion and may have
   nothing to do with supplied balance.

   Since they really have nothing to do with Accounts, there's
   probably some better place for them, but where?  gnc-commodity.h?
*/
gnc_numeric xaccAccountConvertBalanceToCurrency(
    const Account *account, /* for book */
    gnc_numeric balance,
    const gnc_commodity *balance_currency,
    const gnc_commodity *new_currency);
gnc_numeric xaccAccountConvertBalanceToCurrencyAsOfDate(
    const Account *account, /* for book */
    gnc_numeric balance, gnc_commodity *balance_currency,
    gnc_commodity *new_currency, time64 date);

/* These functions get some type of balance in the desired commodity.
   'report_commodity' may be NULL to use the account's commodity. */
gnc_numeric xaccAccountGetBalanceInCurrency (
    const Account *account, const gnc_commodity *report_commodity,
    gboolean include_children);
gnc_numeric xaccAccountGetClearedBalanceInCurrency (
    const Account *account, const gnc_commodity *report_commodity,
    gboolean include_children);
gnc_numeric xaccAccountGetReconciledBalanceInCurrency (
    const Account *account, const gnc_commodity *report_commodity,
    gboolean include_children);
gnc_numeric xaccAccountGetPresentBalanceInCurrency (
    const Account *account, const gnc_commodity *report_commodity,
    gboolean include_children);
gnc_numeric xaccAccountGetProjectedMinimumBalanceInCurrency (
    const Account *account, const gnc_commodity *report_commodity,
    gboolean include_children);

/* This function gets the balance as of the given date in the desired
   commodity. */
gnc_numeric xaccAccountGetBalanceAsOfDateInCurrency(
    Account *account, time64 date, gnc_commodity *report_commodity,
    gboolean include_children);

gnc_numeric xaccAccountGetBalanceChangeForPeriod (
    Account *acc, time64 date1, time64 date2, gboolean recurse);

/** @} */

/** @name Account Children and Parents.

 * The set of accounts is represented as a doubly-linked tree, so that given
 * any account, both its parent and its children can be easily found.
 * At the top of the tree hierarchy lies a single root node, the root account.
 *
 * The account tree hierarchy is unique, in that a given account can
 * have only one parent account.
 @{
*/

/** 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.  The exception to this is when the old and new
 *  parent accounts are the same, in which case this function does
 *  nothing.
 *
 *  If the child account belongs to a different book than the
 *  specified new parent account, the child will be removed from the
 *  other book (and thus, the other book's entity tables, generating a
 *  destroy event), and will be added to the new book (generating a
 *  create event).
 *
 *  @param new_parent The new parent account to which the child should
 *  be attached.
 *
 *  @param child The account to attach.
 */
void gnc_account_append_child (Account *new_parent, Account *child);

/** This function will remove the specified child account from the
 *  specified parent account. It will NOT free the associated memory
 *  or otherwise alter the account: the account can now be reparented
 *  to a new location.  Note, however, that it will mark the old
 *  parents as having been modified.
 *
 *  @param parent The parent account from which the child should be
 *  removed.
 *
 *  @param child The child account to remove. */
void gnc_account_remove_child (Account *parent, Account *child);

/** This routine returns a pointer to the parent of the specified
 *  account.  If the account has no parent, i.e it is either the root
 *  node or is a disconnected account, then its parent will be NULL.
 *
 *  @param account A pointer to any exiting account.
 *
 *  @return A pointer to the parent account node, or NULL if there is
 *  no parent account. */
/*@ dependent @*/
Account * gnc_account_get_parent (const Account *account);

/** This routine returns the root account of the account tree that the
 *  specified account belongs to.  It is the equivalent of repeatedly
 *  calling the gnc_account_get_parent() routine until that routine
 *  returns NULL.
 *
 *  @param account A pointer to any existing account.
 *
 *  @return The root node of the account tree to which this account
 *  belongs.  NULL if the account is not part of any account tree. */
Account * gnc_account_get_root (Account *account);

/** This routine indicates whether the specified account is the root
 *  node of an account tree.
 *
 *  @param account A pointer to any account.
 *
 *  @return TRUE if this account is of type ROOT.  FALSE otherwise. */
gboolean gnc_account_is_root (const Account *account);

/** This routine returns a GList of all children accounts of the specified
 *  account.  This function only returns the immediate children of the
 *  specified account.  For a list of all descendant accounts, use the
 *  gnc_account_get_descendants() function.
 *
 *  If you are looking for the splits of this account, use
 *  xaccAccountGetSplitList() instead. This function here deals with
 *  children accounts inside the account tree.
 *
 *  @param account The account whose children should be returned.
 *
 *  @return A GList of account pointers, or NULL if there are no
 *  children accounts. It is the callers responsibility to free any returned
 *  list with the g_list_free() function. */
GList *gnc_account_get_children (const Account *account);

/** This routine returns a GList of all children accounts of the specified
 *  account, ordered by xaccAccountOrder().  \sa gnc_account_get_children()
 */
GList *gnc_account_get_children_sorted (const Account *account);

/** Return the number of children of the specified account.  The
 *  returned number does not include the account itself.
 *
 *  @param account The account to query.
 *
 *  @return The number of children of the specified account. */
gint gnc_account_n_children (const Account *account);

/** Return the index of the specified child within the list of the
 *  parent's children.  The first child index is 0.  This function
 *  returns -1 if the parent account is NULL of if the specified child
 *  does not belong to the parent account.
 *
 *  @param parent The parent account to check.
 *
 *  @param child The child account to find.
 *
 *  @return The index of the child account within the specified
 *  parent, or -1. */
gint gnc_account_child_index (const Account *parent, const Account *child);

/** Return the n'th child account of the specified parent account.  If
 *  the parent account is not specified or the child index number is
 *  invalid, this function returns NULL.
 *
 *  @param parent The parent account to check.
 *
 *  @param num The index number of the child account that should be
 *  returned.
 *
 *  @return A pointer to the specified child account, or NULL */
Account *gnc_account_nth_child (const Account *parent, gint num);

/** This routine returns a flat list of all of the accounts that are
 *  descendants of the specified account.  This includes not only the
 *  the children, but the children of the children, etc. For a list of
 *  only the immediate child accounts, use the
 *  gnc_account_get_children() function.  Within each set of child
 *  accounts, the accounts returned by this function are unordered.
 *  For a list of descendants where each set of children is sorted via
 *  the standard account sort function, use the
 *  gnc_account_get_descendants_sorted() function.
 *
 *  @param account The account whose descendants should be returned.
 *
 *  @return A GList of account pointers, or NULL if there are no
 *  descendants. It is the callers responsibility to free any returned
 *  list with the g_list_free() function. */
GList * gnc_account_get_descendants (const Account *account);

/** This function returns a GList containing all the descendants of
 *  the specified account, sorted at each level.  This includes not
 *  only the the children, but the children of the children, etc.
 *  Within each set of child accounts, the accounts returned by this
 *  function are ordered via the standard account sort function.  For
 *  a list of descendants where each set of children is unordered, use
 *  the gnc_account_get_descendants() function.
 *
 *  Note: Use this function where the results are intended for display
 *  to the user.  If the results are internal to GnuCash or will be
 *  resorted at som later point in time you should use the
 *  gnc_account_get_descendants() function.
 *
 *  @param account The account whose descendants should be returned.
 *
 *  @return A GList of account pointers, or NULL if there are no
 *  descendants. It is the callers responsibility to free any returned
 *  list with the g_list_free() function. */
GList *gnc_account_get_descendants_sorted (const Account *account);

/** Return the number of descendants of the specified account.  The
 *  returned number does not include the account itself.
 *
 *  @param account The account to query.
 *
 *  @return The number of descendants of the specified account. */
gint gnc_account_n_descendants (const Account *account);

/** Return the number of levels of this account below the root
 *  account.
 *
 *  @param account The account to query.
 *
 *  @return The number of levels below the root. */
gint gnc_account_get_current_depth (const Account *account);

/** Return the number of levels of descendants accounts below the
 *  specified account.  The returned number does not include the
 *  specifed account itself.
 *
 *  @param account The account to query.
 *
 *  @return The number of levels of descendants. */
gint gnc_account_get_tree_depth (const Account *account);

/** @name ForEach
 @{
*/

/** This method will traverse the immediate children of this accounts,
 *  calling 'func' on each account.  This function traverses all
 *  children nodes.  To traverse only a subset of the child nodes use
 *  the gnc_account_foreach_child_until() function.
 *
 *  @param account A pointer to the account on whose children the
 *  function should be called.
 *
 *  @param func A function taking two arguments, an Account and a
 *  gpointer.
 *
 *  @param user_data This data will be passed to each call of func. */
void gnc_account_foreach_child (const Account *account,
                                AccountCb func, /*@ null @*/ gpointer user_data);

/** This method will traverse all children of this accounts and their
 *  descendants, calling 'func' on each account.  This function
 *  traverses all descendant nodes.  To traverse only a subset of the
 *  descendant nodes use the gnc_account_foreach_descendant_until()
 *  function.
 *
 *  @param account A pointer to the account on whose descendants the
 *  function should be called.
 *
 *  @param func A function taking two arguments, an Account and a
 *  gpointer.
 *
 *  @param user_data This data will be passed to each call of func. */
void gnc_account_foreach_descendant (const Account *account,
                                     AccountCb func, /*@ null @*/ gpointer user_data);

/** This method will traverse all children of this accounts and their
 *  descendants, calling 'func' on each account.  Traversal will stop
 *  when func returns a non-null value, and the routine will return
 *  with that value.  Therefore, this function will return null if
 *  func returns null for every account.  For a simpler function that
 *  always traverses all children nodes, use the
 *  gnc_account_foreach_descendant() function.
 *
 *  @param account A pointer to the account on whose descendants the
 *  function should be called.
 *
 *  @param func A function taking two arguments, an Account and a
 *  gpointer.
 *
 *  @param user_data This data will be passed to each call of func. */
gpointer gnc_account_foreach_descendant_until (const Account *account,
        AccountCb2 func, /*@ null @*/ gpointer user_data);


/** @} */

/** @name Concatenation, Merging
 @{
*/

/** The gnc_account_join_children() subroutine will move (reparent)
 *  all child accounts from the from_parent account to the to_parent
 *  account, preserving the account hierarchy.  It will also take care
 *  that the moved accounts will have the to_parent's book parent
 *  as well.
 */
void gnc_account_join_children (Account *to_parent, Account *from_parent);

/** The gnc_account_merge_children() subroutine will go through an
 *  account, merging all child accounts that have the same name and
 *  description.  This function is useful when importing Quicken(TM)
 *  files.
 */
void gnc_account_merge_children (Account *parent);

/** @} */

/** DOCUMENT ME! */
void xaccAccountSetReconcileChildrenStatus(Account *account, gboolean status);

/** DOCUMENT ME! */
gboolean xaccAccountGetReconcileChildrenStatus(const Account *account);

/** Returns true if the account is 'ancestor' or has 'ancestor' as an
 *  ancestor.  An ancestor account may be the accounts parent, its
 *  parent's parent, its parent's parent's parent, etc.  Returns false
 *  if either one is NULL.
 */
gboolean xaccAccountHasAncestor(const Account *acc, const Account *ancestor);

#define xaccAccountGetSlots(X) qof_instance_get_slots(QOF_INSTANCE(X))

/** @} */

/** @name Lookup Accounts and Subaccounts by name or code
 @{
*/
/** The gnc_account_lookup_by_name() subroutine fetches the account by
 *  name from the descendants of the specified account.  The immediate
 *  children are searched first.  If there is no match,, then a
 *  recursive search of all descendants is performed looking for a
 *  match.
 *
 *  @return A pointer to the account with the specified name, or NULL
 *  if the account was not found.
 */
Account *gnc_account_lookup_by_name (const Account *parent, const char *name);

/** The gnc_account_lookup_full_name() subroutine works like
 *  gnc_account_lookup_by_name, but uses fully-qualified names using the
 *  given separator.
 */
Account *gnc_account_lookup_by_full_name (const Account *any_account,
        const gchar *name);

/** The gnc_account_lookup_full_name() subroutine works like
 *  gnc_account_lookup_by_name, but uses the account code.
 */
Account *gnc_account_lookup_by_code (const Account *parent,
                                     const char *code);

/** @} */

/* ------------------ */

/** @name GNCAccountType conversion/checking
 @{
*/
/**
 * Conversion routines for the account types to/from strings
 * that are used in persistent storage, communications.  These
 * strings should *not* be translated to the local language.
 * Typical conversion is ACCT_TYPE_INCOME -> "INCOME". */
const char * xaccAccountTypeEnumAsString (GNCAccountType type);
/**
 * Conversion routines for the account types to/from strings
 * that are used in persistent storage, communications.  These
 * strings should *not* be translated to the local language.
 * Typical conversion is "INCOME" -> ACCT_TYPE_INCOME. */
gboolean xaccAccountStringToType (const char* str, GNCAccountType *type);
/**
 * Conversion routines for the account types to/from strings
 * that are used in persistent storage, communications.  These
 * strings should *not* be translated to the local language.
 * Typical conversion is "INCOME" -> ACCT_TYPE_INCOME. */
GNCAccountType xaccAccountStringToEnum (const char* str);

/** The xaccAccountGetTypeStr() routine returns a string suitable for
 *  use in the GUI/Interface.  These strings should be translated
 *  to the local language. */
const char * xaccAccountGetTypeStr (GNCAccountType type);

/** Return the bitmask of parent account types compatible with a given type. */
guint32 xaccParentAccountTypesCompatibleWith (GNCAccountType type);

/** Return TRUE if accounts of type parent_type can have accounts
 * of type child_type as children. */
gboolean xaccAccountTypesCompatible (GNCAccountType parent_type,
                                     GNCAccountType child_type);

/** Returns the bitmask of the account type enums that are valid.  Deprecated and
 *  root account types are stripped. */
guint32 xaccAccountTypesValid(void);

/** Convenience function to check if the account is a valid
 *  Asset or Liability type, but not a business account type
 *  (meaning not an Accounts Payable/Accounts Receivable). */
gboolean xaccAccountIsAssetLiabType(GNCAccountType t);

/** Convenience function to check if the account is a valid
 *  business account type
 *  (meaning an Accounts Payable/Accounts Receivable). */
gboolean xaccAccountIsAPARType(GNCAccountType t);

/** Convenience function to check if the account is a valid
 *  Equity type. */
gboolean xaccAccountIsEquityType(GNCAccountType t);


/** @} */

/* ------------------ */

/** @name Account split/transaction list management
@{
*/
/** The xaccAccountInsertSplit() method will insert the indicated
 *    split into the indicated account.  If the split already
 *    belongs to another account, it will be removed from that
 *    account first.*/
#define xaccAccountInsertSplit(acc, s)  xaccSplitSetAccount((s), (acc))

/** The xaccAccountGetSplitList() routine returns a pointer to a GList of
 *    the splits in the account.
 * @note This GList is the account's internal
 *    data structure: do not delete it when done; treat it as a read-only
 *    structure.  Note that some routines (such as xaccAccountRemoveSplit())
 *    modify this list directly, and could leave you with a corrupted
 *    pointer.
 * @note This should be changed so that the returned value is a copy
 * of the list. No other part of the code should have access to the
 * internal data structure used by this object.
 */
SplitList* xaccAccountGetSplitList (const Account *account);

/** The xaccAccountMoveAllSplits() routine reassigns each of the splits
 *  in accfrom to accto. */
void xaccAccountMoveAllSplits (Account *accfrom, Account *accto);

/** The xaccAccountForEachTransaction() routine will traverse all of
 * the transactions in @a account and call the callback
 * function @a proc on each transaction.  Processing will continue
 * if-and-only-if @a proc returns 0. The user data pointer
 * @a data will be passed on to the callback function @a proc.
 *
 * This function does not descend recursively to traverse transactions
 * in child accounts.
 *
 * @a proc will be called exactly once for each transaction that is
 * pointed to by at least one split in the given account.
 *
 * The result of this function will be 0 <em>if and only if</em>
 * every relevant transaction was traversed exactly once.
 * Else the return value is the last non-zero value returned by proc.
 *
 * \warning For performance reasons, the transaction callback @a proc
 * must never destroy any of the transaction's splits, nor assign any
 * of them to a different account. <b>To do so risks a crash.</b>
 *
 * \warning The traversal occurs only over the transactions that
 * are locally cached in the local gnucash engine.  If the gnucash
 * engine is attached to a remote database, the database may contain
 * (many) transactions that are not mirrored in the local cache.
 * This routine will not cause an SQL database query to be performed;
 * it will not traverse transactions present only in the remote
 * database.
 */
gint xaccAccountForEachTransaction(const Account *account,
                                   TransactionCallback proc,
                                   void *data);

/** Returns a pointer to the transaction, not a copy. */
Transaction * xaccAccountFindTransByDesc(const Account *account,
        const char *description);

/** Returns a pointer to the split, not a copy. */
Split * xaccAccountFindSplitByDesc(const Account *account,
                                   const char *description);

/** @} */

/* ------------------ */

/** @name Account lots
@{
*/
/** The xaccAccountInsertLot() method will register the indicated lot
 *    with this account.   Any splits later inserted into this lot must
 *    belong to this account.  If the lot is already in another account,
 *    the lot, and all of the splits in it, will be moved from that
 *    account to this account. */
void xaccAccountInsertLot (Account *, GNCLot *);
void xaccAccountRemoveLot (Account *, GNCLot *);

/** The xaccAccountGetLotList() routine returns a list of all lots in
 *  this account.
 *
 *  @param account The account whose lots should be returned.
 *
 *  @return A GList of lot pointers, or NULL if there are no lots in
 *  this account children. It is the callers responsibility to free
 *  any returned list with the g_list_free() function. */
LotList* xaccAccountGetLotList (const Account *account);

/** The xaccAccountForEachLot() method will apply the function 'proc'
 *    to each lot in the account.  If 'proc' returns a non-NULL value,
 *    further application will be stopped, and the resulting value
 *    will be returned.  There is no guaranteed order over which
 *    the Lots will be traversed.
 */
gpointer xaccAccountForEachLot(
    const Account *acc,
    gpointer (*proc)(GNCLot *lot, gpointer user_data), /*@ null @*/ gpointer user_data);


/** Find a list of open lots that match the match_func.  Sort according
 * to sort_func.  If match_func is NULL, then all open lots are returned.
 * If sort_func is NULL, then the returned list has no particular order.
 * The caller must free to returned list.
 */
LotList * xaccAccountFindOpenLots (const Account *acc,
                                   gboolean (*match_func)(GNCLot *lot,
                                           gpointer user_data),
                                   /*@ null @*/ gpointer user_data, GCompareFunc sort_func);

/** @} */
/* ------------------ */

/** @name Account Reconciliation information getters/setters
@{
*/
/** DOCUMENT ME! */
gboolean xaccAccountGetReconcileLastDate (const Account *account,
        time64 *last_date);
/** DOCUMENT ME! */
void xaccAccountSetReconcileLastDate (Account *account, time64 last_date);

/** DOCUMENT ME! */
gboolean xaccAccountGetReconcileLastInterval (const Account *account,
        int *months, int *days);
/** DOCUMENT ME! */
void xaccAccountSetReconcileLastInterval (Account *account,
        int months, int days);
/** DOCUMENT ME! */
gboolean xaccAccountGetReconcilePostponeDate (const Account *account,
        time64 *postpone_date);
/** DOCUMENT ME! */
void xaccAccountSetReconcilePostponeDate (Account *account,
        time64 postpone_date);

/** DOCUMENT ME! */
gboolean xaccAccountGetReconcilePostponeBalance (const Account *account,
        gnc_numeric *balance);
/** DOCUMENT ME! */
void xaccAccountSetReconcilePostponeBalance (Account *account,
        gnc_numeric balance);

/** DOCUMENT ME! */
void xaccAccountClearReconcilePostpone (Account *account);
/** @} */


/** DOCUMENT ME! */
typedef enum
{
    PLACEHOLDER_NONE,
    PLACEHOLDER_THIS,
    PLACEHOLDER_CHILD,
} GNCPlaceholderType;

/** @name Account Placeholder flag
 @{
*/

/** Get the "placeholder" flag for an account.  If this flag is set
 *  then the account may not be modified by the user.
 *
 *  @param account The account whose flag should be retrieved.
 *
 *  @return The current state of the account's "placeholder" flag. */
gboolean xaccAccountGetPlaceholder (const Account *account);

/** Set the "placeholder" flag for an account.  If this flag is set
 *  then the account may not be modified by the user.
 *
 *  @param account The account whose flag should be retrieved.
 *
 *  @param val The new state for the account's "placeholder" flag. */
void xaccAccountSetPlaceholder (Account *account, gboolean val);

/** Returns PLACEHOLDER_NONE if account is NULL or neither account nor
 *  any descendant of account is a placeholder.  If account is a
 *  placeholder, returns PLACEHOLDER_THIS.  Otherwise, if any
 *  descendant of account is a placeholder, return PLACEHOLDER_CHILD.
 */
GNCPlaceholderType xaccAccountGetDescendantPlaceholder(const Account *account);
/** @} */

/** @name Account Hidden flag
 @{
*/

/** Get the "hidden" flag for an account.  If this flag is set then
 *  the account (and any children) will be hidden from the user unless
 *  they explicitly ask to see them.
 *
 *  @param acc The account whose flag should be retrieved.
 *
 *  @return The current state of the account's "hidden" flag. */
gboolean xaccAccountGetHidden (const Account *acc);

/** Set the "hidden" flag for an account.  If this flag is set then
 *  the account (and any children) will be hidden from the user unless
 *  they explicitly ask to see them.
 *
 *  @param acc The account whose flag should be retrieved.
 *
 *  @param val The new state for the account's "hidden" flag. */
void xaccAccountSetHidden (Account *acc, gboolean val);

/** Should this account be "hidden".  If this flag is set for this
 *  account (or any parent account) then the account should be hidden
 *  from the user unless they explicitly ask to see it.  This function
 *  is different from the xaccAccountGetHidden() function because it
 *  checks the flag in parent accounts in addition to this account.
 *
 *  @param acc The account whose flag should be retrieved.
 *
 *  @return Whether or not this account should be "hidden". */
gboolean xaccAccountIsHidden (const Account *acc);
/** @} */

/** @name Account Tax related getters/setters
 @{
*/

/** DOCUMENT ME! */
gboolean xaccAccountGetTaxRelated (const Account *account);
/** DOCUMENT ME! */
void xaccAccountSetTaxRelated (Account *account, gboolean tax_related);
/** DOCUMENT ME! */
const char * xaccAccountGetTaxUSCode (const Account *account);
/** DOCUMENT ME! */
void xaccAccountSetTaxUSCode (Account *account, const char *code);
/** DOCUMENT ME! */
const char * xaccAccountGetTaxUSPayerNameSource (const Account *account);
/** DOCUMENT ME! */
void xaccAccountSetTaxUSPayerNameSource (Account *account, const char *source);
/** DOCUMENT ME! */
gint64 xaccAccountGetTaxUSCopyNumber (const Account *account);
/** DOCUMENT ME! */
void xaccAccountSetTaxUSCopyNumber (Account *account, gint64 copy_number);
/** @} */


/** @name Account marking
@{
*/
/** Set a mark on the account.  The meaning of this mark is
 * completely undefined. Its presented here as a utility for the
 * programmer, to use as desired.  Handy for performing customer traversals
 * over the account tree.  The mark is *not* stored in the database/file
 * format.  When accounts are newly created, the mark is set to zero.
 */
void xaccAccountSetMark (Account *account, short mark);

/** Get the mark set by xaccAccountSetMark
short xaccAccountGetMark (const Account *account);
*/
/** The xaccClearMark will find the root account, and clear the mark in
 * the entire account tree.  */
void xaccClearMark (Account *account, short val);

/** The xaccClearMarkDown will clear the mark only in this and in
 * sub-accounts.*/
void xaccClearMarkDown (Account *account, short val);
/** @} */

/** @name Staged Traversal

 * The following functions provide support for "staged traversals"
 * over all of the transactions in an account or group.  The idea
 * is to be able to perform a sequence of traversals ("stages"),
 * and perform an operation on each transaction exactly once
 * for that stage.
 *
 * Only transactions whose current "stage" is less than the
 * stage of the current traversal will be affected, and they will
 * be "brought up" to the current stage when they are processed.
 *
 * For example, you could perform a stage 1 traversal of all the
 * transactions in an account, and then perform a stage 1 traversal of
 * the transactions in a second account.  Presuming the traversal of
 * the first account didn't abort prematurely, any transactions shared
 * by both accounts would be ignored during the traversal of the
 * second account since they had been processed while traversing the
 * first account.
 *
 * However, if you had traversed the second account using a stage
 * of 2, then all the transactions in the second account would have
 * been processed.
 *
 * Traversal can be aborted by having the callback function return
 * a non-zero value.  The traversal is aborted immediately, and the
 * non-zero value is returned.  Note that an aborted traversal can
 * be restarted; no information is lost due to an abort.
 *
 * The initial impetus for this particular approach came from
 * generalizing a mark/sweep practice that was already being
 * used in FileIO.c.
 *
 * Note that currently, there is a hard limit of 256 stages, which
 * can be changed by enlarging "marker" in the transaction struct.
 *
 @{
*/
/** gnc_account_tree_begin_staged_transaction_traversals()
 *  resets the traversal marker inside every transactions of every
 *  account in the account tree originating with the specified node.
 *  This is done so that a new sequence of staged traversals can
 *  begin.
 */
void gnc_account_tree_begin_staged_transaction_traversals(Account *acc);

/** xaccSplitsBeginStagedTransactionTraversals() resets the traversal
 *    marker for each transaction which is a parent of one of the
 *    splits in the list.
 */
void xaccSplitsBeginStagedTransactionTraversals(SplitList *splits);

/** xaccAccountBeginStagedTransactionTraversals() resets the traversal
 *    marker for each transaction which is a parent of one of the
 *    splits in the account.
 */
void xaccAccountBeginStagedTransactionTraversals(const Account *account);

/** xaccTransactionTraverse() checks the stage of the given transaction.
 *    If the transaction hasn't reached the given stage, the transaction
 *    is updated to that stage and the function returns TRUE. Otherwise
 *    no change is made and the function returns FALSE.
 */
gboolean xaccTransactionTraverse(Transaction *trans, int stage);

/** xaccAccountStagedTransactionTraversal() calls @a thunk on each
 *    transaction in account @a a whose current marker is less than the
 *    given @a stage and updates each transaction's marker to be @a stage.
 *    The traversal will stop if @a thunk returns a non-zero value.
 *    xaccAccountStagedTransactionTraversal() function will return zero
 *    or the non-zero value returned by @a thunk.
 *    This API does not handle handle recursive traversals.
 *
 *    \warning For performance reasons, the transaction callback @a thunk
 *    must never destroy any of the transaction's splits, nor assign any
 *    of them to a different account. <b>To do so risks a crash.</b>
 */

int xaccAccountStagedTransactionTraversal(const Account *a,
        unsigned int stage,
        TransactionCallback thunk,
        void *data);

/** gnc_account_tree_staged_transaction_traversal() calls @a thunk on each
 *    transaction in the group whose current marker is less than the
 *    given @a stage and updates each transaction's marker to be @a stage.
 *    The traversal will stop if @a thunk returns a non-zero value.
 *    gnc_account_tree_staged_transaction_traversal() function will return zero
 *    or the non-zero value returned by @a thunk.  This
 *    API does not handle handle recursive traversals.
 *
 *    \warning For performance reasons, the transaction callback @a thunk
 *    must never destroy any of the transaction's splits, nor assign any
 *    of them to a different account. <b>To do so risks a crash.</b>
 */

int gnc_account_tree_staged_transaction_traversal(const Account *account,
        unsigned int stage,
        TransactionCallback thunk,
        void *data);

/** Traverse all of the transactions in the given account group.
 * Continue processing IF @a proc returns 0. This function
 * will descend recursively to traverse transactions in the
 * children of the accounts in the group.
 *
 * @a Proc will be called exactly once for each transaction that is
 * pointed to by at least one split in any account in the hierarchy
 * topped by the root Account @a acc.
 *
 * The result of this function will be 0 IF every relevant
 * transaction was traversed exactly once; otherwise, the return
 * value is the last non-zero value returned by the callback.
 *
 * \warning For performance reasons, the transaction callback @a proc
 * must never destroy any of the transaction's splits, nor assign any
 * of them to a different account. <b>To do so risks a crash.</b>
 *
 * \warning The traversal occurs only over the transactions that
 * are locally cached in the local gnucash engine.  If the gnucash
 * engine is attached to a remote database, the database may contain
 * (many) transactions that are not mirrored in the local cache.
 * This routine will not cause an SQL database query to be performed;
 * it will not traverse transactions present only in the remote
 * database.
 *
 * Note that this routine is just a trivial wrapper for
 *
 * gnc_account_tree_begin_staged_transaction_traversals(g);
 * gnc_account_tree_staged_transaction_traversal(g, 42, proc, data);
 */

int xaccAccountTreeForEachTransaction(Account *acc,
                                      TransactionCallback proc, void *data);

/** @} */


/** @name Deprecated Routines.
 @{
*/

/** @deprecated The current API associates only one thing with an
 * account: the 'commodity'. Use xaccAccountGetCommodity() to fetch
 * it.
 *
 * These two funcs take control of their gnc_commodity args. Don't free */
void DxaccAccountSetCurrency (Account *account, gnc_commodity *currency);

/** @deprecated The current API associates only one thing with an
 * account: the 'commodity'. Use xaccAccountGetCommodity() to fetch
 * it. */
gnc_commodity * DxaccAccountGetCurrency (const Account *account);

/** Set the timezone to be used when interpreting the results from a
 *  given Finance::Quote backend.  Unfortunately, the upstream sources
 *  don't label their output, so the user has to specify this bit.
 *
 *  @deprecated Price quote information is now stored on the
 *  commodity, not the account. */

void dxaccAccountSetQuoteTZ (Account *account, const char *tz);
/** Get the timezone to be used when interpreting the results from a
 *  given Finance::Quote backend.  Unfortunately, the upstream sources
 *  don't label their output, so the user has to specify this bit.
 *
 *  @deprecated Price quote information is now stored on the
 *  commodity, not the account. */
const char * dxaccAccountGetQuoteTZ (const Account *account);
/** @} */


/** @name Account parameter names
 @{
*/
#define ACCOUNT_KVP		"kvp"
#define ACCOUNT_NAME_		"name"
#define ACCOUNT_CODE_		"code"
#define ACCOUNT_DESCRIPTION_	"desc"
#define ACCOUNT_COLOR_		"color"
#define ACCOUNT_FILTER_		"filter"
#define ACCOUNT_SORT_ORDER_	"sort-order"
#define ACCOUNT_SORT_REVERSED_ "sort-reversed"
#define ACCOUNT_NOTES_		"notes"
#define ACCOUNT_BALANCE_	"balance"
#define ACCOUNT_CLEARED_	"cleared"
#define ACCOUNT_RECONCILED_	"reconciled"
#define ACCOUNT_PRESENT_	"present"
#define ACCOUNT_FUTURE_MINIMUM_ "future-minimum"
#define ACCOUNT_TAX_RELATED	"tax-related-p"
#define ACCOUNT_TYPE_		"account-type"
#define ACCOUNT_SCU		"smallest-commodity-unit"
#define ACCOUNT_NSCU		"non-standard-scu"
#define ACCOUNT_PARENT		"parent-account"

/** @} */

/** This is the type-override when you want to match all accounts.  Used
 * in the gnome-search parameter list.  Be careful when you use this. */
#define ACCOUNT_MATCH_ALL_TYPE	"account-match-all"

#endif /* XACC_ACCOUNT_H */
/** @} */
/** @} */