162 from enum
import IntEnum
163 from urllib.parse
import urlparse
165 from gnucash
import gnucash_core_c
166 from gnucash
import _sw_core_utils
168 from gnucash.function_class
import \
169 ClassFromFunctions, extract_attributes_with_prefix, \
170 default_arguments_decorator, method_function_returns_instance, \
171 methods_return_instance, process_list_convert_to_instance, \
172 method_function_returns_instance_list, methods_return_instance_lists
174 from gnucash.gnucash_core_c
import gncInvoiceLookup, gncInvoiceGetInvoiceFromTxn, \
175 gncInvoiceGetInvoiceFromLot, gncEntryLookup, gncInvoiceLookup, \
176 gncCustomerLookup, gncVendorLookup, gncJobLookup, gncEmployeeLookup, \
177 gncTaxTableLookup, gncTaxTableLookupByName, gnc_search_invoice_on_id, \
178 gnc_search_customer_on_id, gnc_search_bill_on_id , \
179 gnc_search_vendor_on_id, gncInvoiceNextID, gncCustomerNextID, \
180 gncVendorNextID, gncTaxTableGetTables, gnc_numeric_zero, \
181 gnc_numeric_create, double_to_gnc_numeric, gnc_numeric_from_string, \
182 gnc_numeric_to_string, gnc_numeric_check
184 from gnucash.deprecation
import (
185 deprecated_args_session,
186 deprecated_args_session_init,
187 deprecated_args_session_begin,
194 _localedir = _sw_core_utils.gnc_path_get_localedir()
195 gettext.install(_sw_core_utils.GETTEXT_PACKAGE, _localedir)
198 print(
"Problem importing gettext!")
201 exc_type, exc_value, exc_traceback = sys.exc_info()
202 traceback.print_exception(exc_type, exc_value, exc_traceback)
206 """Null translator function, gettext not available""" 210 builtins.__dict__[
'_'] = _
213 _module = gnucash_core_c
215 def do_lookup_create_oo_instance(self, lookup_function, cls, *args):
216 thing = lookup_function(self.get_instance(), *args)
218 thing = cls(instance=thing)
223 def __init__(self, msg, errors):
224 Exception.__init__(self, msg)
229 """Mode for opening sessions. 231 This replaces three booleans that were passed in order: ignore_lock, create, 232 and force. It's structured so that one can use it as a bit field with the 233 values in the same order, i.e. ignore_lock = 1 << 2, create_new = 1 << 1, and 239 SESSION_NORMAL_OPEN = 0 (All False) 240 Open will fail if the URI doesn't exist or is locked. 242 SESSION_NEW_STORE = 2 (False, True, False (create)) 243 Create a new store at the URI. It will fail if the store already exists and is found to contain data that would be overwritten. 245 SESSION_NEW_OVERWRITE = 3 (False, True, True (create | force)) 246 Create a new store at the URI even if a store already exists there. 248 SESSION_READ_ONLY = 4, (True, False, False (ignore_lock)) 249 Open the session read-only, ignoring any existing lock and not creating one if the URI isn't locked. 251 SESSION_BREAK_LOCK = 5 (True, False, True (ignore_lock | force)) 252 Open the session, taking over any existing lock. 254 source: lignucash/engine/qofsession.h 257 SESSION_NORMAL_OPEN = gnucash_core_c.SESSION_NORMAL_OPEN
259 Open will fail if the URI doesn't exist or is locked.""" 261 SESSION_NEW_STORE = gnucash_core_c.SESSION_NEW_STORE
262 """False, True, False (create) 263 Create a new store at the URI. It will fail if the store already exists and is found to contain data that would be overwritten.""" 265 SESSION_NEW_OVERWRITE = gnucash_core_c.SESSION_NEW_OVERWRITE
266 """False, True, True (create | force) 267 Create a new store at the URI even if a store already exists there.""" 269 SESSION_READ_ONLY = gnucash_core_c.SESSION_READ_ONLY
270 """True, False, False (ignore_lock) 271 Open the session read-only, ignoring any existing lock and not creating one if the URI isn't locked.""" 273 SESSION_BREAK_LOCK = gnucash_core_c.SESSION_BREAK_LOCK
274 """True, False, True (ignore_lock | force) 275 Open the session, taking over any existing lock.""" 279 """A GnuCash book editing session 281 To commit changes to the session you may need to call save, 282 (this is always the case with the file backend). 284 When you're down with a session you may need to call end() 286 Every Session has a Book in the book attribute, which you'll definitely 287 be interested in, as every GnuCash entity (Transaction, Split, Vendor, 288 Invoice..) is associated with a particular book where it is stored. 291 @deprecated_args_session_init
292 def __init__(self, book_uri=None, mode=None, instance=None, book=None):
294 A convenient constructor that allows you to specify a book URI, 295 begin the session, and load the book. 297 This can give you the power of calling 298 qof_session_new, qof_session_begin, and qof_session_load all in one! 300 qof_session_load is only called if url scheme is "xml" and 301 mode is SESSION_NEW_STORE or SESSION_NEW_OVERWRITE 303 @param book_uri must be a string in the form of a URI/URL. The access 304 method specified depends on the loaded backends. Paths may be relative 305 or absolute. If the path is relative, that is if the argument is 306 "file://somefile.xml", then the current working directory is 307 assumed. Customized backends can choose to search other 308 application-specific directories or URI schemes as well. 309 It be None to skip the calls to qof_session_begin and 312 @param instance argument can be passed if new Session is used as a 313 wrapper for an existing session instance 315 @param mode The SessionOpenMode. 316 @note SessionOpenMode replaces deprecated ignore_lock, is_new and force_new. 319 `SESSION_NORMAL_OPEN`: Find an existing file or database at the provided uri and 320 open it if it is unlocked. If it is locked post a QOF_BACKEND_LOCKED error. 322 `SESSION_NEW_STORE`: Check for an existing file or database at the provided 323 uri and if none is found, create it. If the file or database exists post a 324 QOF_BACKED_STORE_EXISTS and return. 326 `SESSION_NEW_OVERWRITE`: Create a new file or database at the provided uri, 327 deleting any existing file or database. 329 `SESSION_READ_ONLY`: Find an existing file or database and open it without 330 disturbing the lock if it exists or setting one if not. This will also set a 331 flag on the book that will prevent many elements from being edited and will 332 prevent the backend from saving any edits. 334 `SESSION_BREAK_LOCK`: Find an existing file or database, lock it, and open 335 it. If there is already a lock replace it with a new one for this session. 338 qof_session_begin() signals failure by queuing errors. After it completes use 339 qof_session_get_error() and test that the value is `ERROR_BACKEND_NONE` to 340 determine that the session began successfully. 342 @exception as begin() and load() are wrapped with raise_backend_errors_after_call() 343 this function can raise a GnuCashBackendException. If it does, 344 you don't need to cleanup and call end() and destroy(), that is handled 345 for you, and the exception is raised. 347 if instance
is not None:
348 GnuCashCoreClass.__init__(self, instance=instance)
352 GnuCashCoreClass.__init__(self, book)
354 if book_uri
is not None:
357 mode = SessionOpenMode.SESSION_NORMAL_OPEN
358 self.begin(book_uri, mode)
359 except GnuCashBackendException
as backend_exception:
367 def __exit__(self, exc_type, exc_value, traceback):
374 """Raises a GnuCashBackendException if there are outstanding 377 set called_function to name the function that was last called 382 "call to %s resulted in the " 383 "following errors, %s" % (called_function, backend_error_dict[errors[0]]),
387 """A generator that yields any outstanding QofBackend errors 389 while self.get_error()
is not ERR_BACKEND_NO_ERR:
390 error = self.pop_error()
394 """Returns any accumulated qof backend errors as a tuple 401 """A function decorator that results in a call to 402 raise_backend_errors after execution. 404 def new_function(self, *args, **kwargs):
405 return_value = function(self, *args, **kwargs)
411 """A Book encapsulates all of the GnuCash data, it is the place where 412 all GnuCash entities (Transaction, Split, Vendor, Invoice...), are 413 stored. You'll notice that all of the constructors for those entities 414 need a book to be associated with. 416 The most common way to get a book is through the book property in the 417 Session class, that is, create a session that connects to some storage, 418 such as through 'my_session = Session('file:my_books.xac')', and access 419 the book via the book property, 'my_session.book' 421 If you would like to create a Book without any backing storage, call the 422 Book constructor without any parameters, 'Book()'. You can later merge 423 such a book into a book with actual store by using merge_init. 426 get_root_account -- Returns the root level Account 427 get_table -- Returns a commodity lookup table, of type GncCommodityTable 429 def InvoiceLookup(self, guid):
430 from gnucash.gnucash_business
import Invoice
432 gncInvoiceLookup, Invoice, guid.get_instance() )
434 def EntryLookup(self, guid):
435 from gnucash.gnucash_business
import Entry
437 gncEntryLookup, Entry, guid.get_instance() )
439 def CustomerLookup(self, guid):
440 from gnucash.gnucash_business
import Customer
442 gncCustomerLookup, Customer, guid.get_instance())
444 def JobLookup(self, guid):
445 from gnucash.gnucash_business
import Job
447 gncJobLookup, Job, guid.get_instance() )
449 def VendorLookup(self, guid):
450 from gnucash.gnucash_business
import Vendor
452 gncVendorLookup, Vendor, guid.get_instance() )
454 def EmployeeLookup(self, guid):
455 from gnucash.gnucash_business
import Employee
457 gncEmployeeLookup, Employee, guid.get_instance() )
459 def TaxTableLookup(self, guid):
460 from gnucash.gnucash_business
import TaxTable
462 gncTaxTableLookup, TaxTable, guid.get_instance() )
464 def TaxTableLookupByName(self, name):
465 from gnucash.gnucash_business
import TaxTable
467 gncTaxTableLookupByName, TaxTable, name)
469 def TaxTableGetTables(self):
470 from gnucash.gnucash_business
import TaxTable
471 return [ TaxTable(instance=item)
for item
in gncTaxTableGetTables(self.instance) ]
473 def BillLookupByID(self, id):
474 from gnucash.gnucash_business
import Bill
476 gnc_search_bill_on_id, Bill, id)
478 def InvoiceLookupByID(self, id):
479 from gnucash.gnucash_business
import Invoice
481 gnc_search_invoice_on_id, Invoice, id)
483 def CustomerLookupByID(self, id):
484 from gnucash.gnucash_business
import Customer
486 gnc_search_customer_on_id, Customer, id)
488 def VendorLookupByID(self, id):
489 from gnucash.gnucash_business
import Vendor
491 gnc_search_vendor_on_id, Vendor, id)
494 ''' Return the next invoice ID. 496 from gnucash.gnucash_core_c
import gncInvoiceNextID
497 return gncInvoiceNextID(self.get_instance(),customer.GetEndOwner().get_instance()[1])
500 ''' Return the next Bill ID. ''' 501 from gnucash.gnucash_core_c
import gncInvoiceNextID
502 return gncInvoiceNextID(self.get_instance(),vendor.GetEndOwner().get_instance()[1])
505 ''' Return the next Customer ID. ''' 506 from gnucash.gnucash_core_c
import gncCustomerNextID
507 return gncCustomerNextID(self.get_instance())
510 ''' Return the next Vendor ID. ''' 511 from gnucash.gnucash_core_c
import gncVendorNextID
512 return gncVendorNextID(self.get_instance())
515 """Object used by GnuCash to store all numbers. Always consists of a 516 numerator and denominator. 518 The constants GNC_DENOM_AUTO, 519 GNC_HOW_RND_FLOOR, GNC_HOW_RND_CEIL, GNC_HOW_RND_TRUNC, 520 GNC_HOW_RND_PROMOTE, GNC_HOW_RND_ROUND_HALF_DOWN, 521 GNC_HOW_RND_ROUND_HALF_UP, GNC_HOW_RND_ROUND, GNC_HOW_RND_NEVER, 522 GNC_HOW_DENOM_EXACT, GNC_HOW_DENOM_REDUCE, GNC_HOW_DENOM_LCD, 523 and GNC_HOW_DENOM_FIXED are available for arithmetic 524 functions like GncNumeric.add 526 Look at gnc-numeric.h to see how to use these 530 """Constructor that supports the following formats: 531 * No arguments defaulting to zero: eg. GncNumeric() == 0/1 532 * A integer: e.g. GncNumeric(1) == 1/1 533 * Numerator and denominator intager pair: eg. GncNumeric(1, 2) == 1/2 534 * A floating point number: e.g. GncNumeric(0.5) == 1/2 535 * A floating point number with defined conversion: e.g. 536 GncNumeric(0.5, GNC_DENOM_AUTO, 537 GNC_HOW_DENOM_FIXED | GNC_HOW_RND_NEVER) == 1/2 538 * A string: e.g. GncNumeric("1/2") == 1/2 540 if 'instance' not in kargs:
541 kargs[
'instance'] = GncNumeric.__args_to_instance(args)
542 GnuCashCoreClass.__init__(self, [], **kargs)
545 def __args_to_instance(args):
547 return gnc_numeric_zero()
550 if isinstance(arg, int):
551 return gnc_numeric_create(arg, 1)
552 elif isinstance(arg, float):
554 elif isinstance(arg, str):
557 raise TypeError(
'Failed to convert to GncNumeric: ' + str(args))
559 elif isinstance(arg, GncNumeric):
562 raise TypeError(
'Only single int/float/str/GncNumeric allowed: ' + str(args))
564 if isinstance(args[0], int)
and isinstance(args[1], int):
565 return gnc_numeric_create(*args)
567 raise TypeError(
'Only two ints allowed: ' + str(args))
569 if isinstance(args[0], float) \
570 and isinstance(args[1], int) \
571 and type(args[2]) == type(GNC_HOW_DENOM_FIXED):
574 raise TypeError(
'Only (float, int, GNC_HOW_RND_*) allowed: ' + str(args))
576 raise TypeError(
'Required single int/float/str or two ints: ' + str(args))
581 def _operator_fallbacks(monomorphic_operator, fallback_operator):
582 """fallbacks are not needed except for method name, 583 keep for possible later use""" 585 if isinstance(b, GncNumeric):
586 return monomorphic_operator(a, b)
587 if isinstance(b, (int, float)):
590 return NotImplemented
591 forward.__name__ =
'__' + fallback_operator.__name__ +
'__' 592 forward.__doc__ = monomorphic_operator.__doc__
595 if isinstance(a, (GncNumeric, int, float)):
598 return NotImplemented
599 reverse.__name__ =
'__r' + fallback_operator.__name__ +
'__' 600 reverse.__doc__ = monomorphic_operator.__doc__
602 return forward, reverse
605 return a.add(b, GNC_DENOM_AUTO, GNC_HOW_RND_ROUND)
608 return a.sub(b, GNC_DENOM_AUTO, GNC_HOW_RND_ROUND)
611 return a.mul(b, GNC_DENOM_AUTO, GNC_HOW_RND_ROUND)
614 return a.div(b, GNC_DENOM_AUTO, GNC_HOW_RND_ROUND)
617 return a.div(b, 1, GNC_HOW_RND_TRUNC)
619 __add__, __radd__ = _operator_fallbacks(_add, operator.add)
621 __sub__, __rsub__ = _operator_fallbacks(_sub, operator.sub)
623 __mul__, __rmul__ = _operator_fallbacks(_mul, operator.mul)
625 __truediv__, __rtruediv__ = _operator_fallbacks(_div, operator.truediv)
626 __itruediv__ = __truediv__
627 __floordiv__, __rfloordiv__ = _operator_fallbacks(_floordiv, operator.floordiv)
628 __ifloordiv__ = __floordiv__
632 return a.compare(b) == -1
635 return a.compare(b) == 1
638 return a.compare(b)
in (0,-1)
641 return a.compare(b)
in (0,1)
644 return a.compare(b) == 0
646 def _richcmp(self, other, op):
647 """Helper for comparison operators, for internal use only. 648 Implement comparison between a GncNumeric instance `self`, 649 and either another GncNumeric instance, an int or a float 650 `other`. If `other` is not an instance of that kind, return 651 NotImplemented. `op` should be one of the six standard 652 comparison operators. The comparisons are based on 653 GncNumeric.compare(). 656 if isinstance(other, GncNumeric):
658 elif isinstance(other, (int, float)):
661 return NotImplemented
665 return a._richcmp(b, a._lt)
669 return a._richcmp(b, a._gt)
673 return a._richcmp(b, a._le)
677 return a._richcmp(b, a._ge)
681 return a._richcmp(b, a._eq)
688 return self.to_double()
691 return int(self.to_double())
705 def to_fraction(self):
706 from fractions
import Fraction
707 return Fraction(self.num(), self.denom())
710 """Returns a human readable numeric value string as UTF8.""" 715 Each priceEach price in the database represents an "instantaneous" 716 quote for a given commodity with respect to another commodity. 717 For example, a given price might represent the value of LNUX in USD on 2001-02-03. 720 * commodity: the item being priced. 721 * currency: the denomination of the value of the item being priced. 722 * value: the value of the item being priced. 723 * time: the time the price was valid. 724 * source: a string describing the source of the quote. These strings will be something like this: 725 "Finance::Quote", "user:misc", "user:foo", etc. If the quote came from a user, as a matter of policy, 726 you *must* prefix the string you give with "user:". For now, the only other reserved values are 727 "Finance::Quote" and "old-file-import". Any string used must be added to the source_list array in 728 dialog-price-edit-db.c so that it can be properly translated. (There are unfortunately many strings 729 in users' databases, so this string must be translated on output instead of always being used in untranslated form). 730 * type: the type of quote - types possible right now are bid, ask, last, nav, and 731 unknown.Each price in the database represents an "instantaneous" quote for a given 732 commodity with respect to another commodity. 733 For example, a given price might represent the value of LNUX in USD on 2001-02-03. 735 See also https://code.gnucash.org/docs/head/group__Price.html 737 _new_instance =
'gnc_price_create' 738 GncPrice.add_methods_with_prefix(
'gnc_price_')
743 a simple price database for gnucash. 744 The PriceDB is intended to be a database of price quotes, or more specifically, 745 a database of GNCPrices. For the time being, it is still a fairly simple 746 database supporting only fairly simple queries. It is expected that new 747 queries will be added as needed, and that there is some advantage to delaying 748 complex queries for now in the hope that we get a real DB implementation 749 before they're really needed. 751 Every QofBook contains a GNCPriceDB, accessible via gnc_pricedb_get_db. 753 Definition in file gnc-pricedb.h. 754 See also https://code.gnucash.org/docs/head/gnc-pricedb_8h.html 757 @deprecated(
"Use gnc_pricedb_latest_before_t64")
758 def gnc_pricedb_lookup_latest_before_t64(self, commodity, currency, date):
759 return self.lookup_nearest_before_t64(commodity, currency, date)
761 GncPriceDB.add_method(
'gnc_pricedb_lookup_latest_before_t64',
'lookup_latest_before_t64')
763 GncPriceDB.lookup_latest_before_t64 = method_function_returns_instance(GncPriceDB.lookup_latest_before_t64, GncPrice)
765 GncPriceDB.add_methods_with_prefix(
'gnc_pricedb_')
767 'lookup_latest' : GncPrice,
768 'lookup_nearest_in_time64' : GncPrice,
769 'lookup_nearest_before_t64' : GncPrice,
770 'convert_balance_latest_price' : GncNumeric,
771 'convert_balance_nearest_price_t64' : GncNumeric,
773 methods_return_instance(GncPriceDB,PriceDB_dict)
774 GncPriceDB.get_prices = method_function_returns_instance_list(
775 GncPriceDB.get_prices, GncPrice )
780 """A CommodityTable provides a way to store and lookup commodities. 781 Commodities are primarily currencies, but other tradable things such as 782 stocks, mutual funds, and material substances are possible. 784 Users of this library should not create their own CommodityTable, instead 785 the get_table method from the Book class should be used. 787 This table is automatically populated with the GnuCash default commodity's 788 which includes most of the world's currencies. 791 def _get_namespaces_py(self):
792 return [ns.get_name()
for ns
in self.get_namespaces_list()]
797 class GncLot(GnuCashCoreClass):
798 def GetInvoiceFromLot(self):
799 from gnucash.gnucash_business
import Invoice
800 return self.do_lookup_create_oo_instance(
801 gncInvoiceGetInvoiceFromLot, Invoice )
804 """A GnuCash Transaction 806 Consists of at least one (generally two) splits to represent a transaction 807 between two accounts. 810 Has a GetImbalance() method that returns a list of all the imbalanced 811 currencies. Each list item is a two element tuple, the first element is 812 the imbalanced commodity, the second element is the value. 814 Warning, the commodity.get_instance() value can be None when there 815 is no currency set for the transaction. 817 _new_instance =
'xaccMallocTransaction' 818 def GetNthSplit(self, n):
819 return self.GetSplitList().pop(n)
821 def GetInvoiceFromTxn(self):
822 from gnucash.gnucash_business
import Transaction
824 gncInvoiceGetInvoiceFromTxn, Transaction )
826 def __eq__(self, other):
827 return self.Equal(other,
True,
False,
False,
False)
829 def decorate_monetary_list_returning_function(orig_function):
830 def new_function(self, *args):
831 """decorate function that returns list of gnc_monetary to return tuples of GncCommodity and GncNumeric 834 *args: Variable length argument list. Will get passed to orig_function 837 array of tuples: (GncCommodity, GncNumeric) 840 Maybe this function should better reside in module function_class (?)""" 845 for item
in orig_function(self, *args) ]
851 The most basic representation of a movement of currency from one account to 854 _new_instance =
'xaccMallocSplit' 856 def __eq__(self, other):
857 return self.Equal(other,
True,
False,
False)
860 """A GnuCash Account. 862 A fundamental entity in accounting, an Account provides representation 863 for a financial object, such as a ACCT_TYPE_BANK account, an 864 ACCT_TYPE_ASSET (like a building), 865 a ACCT_TYPE_LIABILITY (such as a bank loan), a summary of some type of 866 ACCT_TYPE_EXPENSE, or a summary of some source of ACCT_TYPE_INCOME . 868 The words in upper case are the constants that GnuCash and this library uses 869 to describe account type. Here is the full list: 870 ACCT_TYPE_ASSET, ACCT_TYPE_BANK, ACCT_TYPE_CASH, ACCT_TYPE_CHECKING, \ 871 ACCT_TYPE_CREDIT, ACCT_TYPE_EQUITY, ACCT_TYPE_EXPENSE, ACCT_TYPE_INCOME, \ 872 ACCT_TYPE_LIABILITY, ACCT_TYPE_MUTUAL, ACCT_TYPE_PAYABLE, \ 873 ACCT_TYPE_RECEIVABLE, ACCT_TYPE_STOCK, ACCT_TYPE_ROOT, ACCT_TYPE_TRADING 875 These are not strings, they are attributes you can import from this 878 _new_instance =
'xaccMallocAccount' 881 _new_instance =
'guid_new_return' 884 Session.add_constructor_and_methods_with_prefix(
'qof_session_',
'new')
886 def one_arg_default_none(function):
887 return default_arguments_decorator(function,
None,
None)
888 Session.decorate_functions(one_arg_default_none,
"load",
"save")
890 Session.decorate_functions( Session.raise_backend_errors_after_call,
891 "begin",
"load",
"save",
"end")
892 Session.decorate_method(default_arguments_decorator,
"begin",
None, mode=SessionOpenMode.SESSION_NORMAL_OPEN)
893 Session.decorate_functions(deprecated_args_session_begin,
"begin")
895 Session.get_book = method_function_returns_instance(
896 Session.get_book, Book )
898 Session.book = property( Session.get_book )
901 this_module_dict = globals()
902 for error_name, error_value, error_name_after_prefix
in \
903 extract_attributes_with_prefix(gnucash_core_c,
'ERR_'):
904 this_module_dict[ error_name ] = error_value
907 backend_error_dict = {}
908 for error_name, error_value, error_name_after_prefix
in \
909 extract_attributes_with_prefix(gnucash_core_c,
'ERR_'):
910 backend_error_dict[ error_value ] = error_name
914 from gnucash.gnucash_core_c
import GNC_DENOM_AUTO
918 from gnucash.gnucash_core_c
import \
919 GNC_HOW_RND_FLOOR, GNC_HOW_RND_CEIL, GNC_HOW_RND_TRUNC, \
920 GNC_HOW_RND_PROMOTE, GNC_HOW_RND_ROUND_HALF_DOWN, \
921 GNC_HOW_RND_ROUND_HALF_UP, GNC_HOW_RND_ROUND, GNC_HOW_RND_NEVER
925 from gnucash.gnucash_core_c
import \
926 GNC_HOW_DENOM_EXACT, GNC_HOW_DENOM_REDUCE, GNC_HOW_DENOM_LCD, \
927 GNC_HOW_DENOM_FIXED, GNC_HOW_DENOM_SIGFIG
930 from gnucash.gnucash_core_c
import \
931 ACCT_TYPE_ASSET, ACCT_TYPE_BANK, ACCT_TYPE_CASH, ACCT_TYPE_CHECKING, \
932 ACCT_TYPE_CREDIT, ACCT_TYPE_EQUITY, ACCT_TYPE_EXPENSE, ACCT_TYPE_INCOME, \
933 ACCT_TYPE_LIABILITY, ACCT_TYPE_MUTUAL, ACCT_TYPE_PAYABLE, \
934 ACCT_TYPE_RECEIVABLE, ACCT_TYPE_STOCK, ACCT_TYPE_ROOT, ACCT_TYPE_TRADING
937 Book.add_constructor_and_methods_with_prefix(
'qof_book_',
'new')
938 Book.add_method(
'gnc_book_get_root_account',
'get_root_account')
939 Book.add_method(
'gnc_book_set_root_account',
'set_root_account')
940 Book.add_method(
'gnc_commodity_table_get_table',
'get_table')
941 Book.add_method(
'gnc_pricedb_get_db',
'get_price_db')
942 Book.add_method(
'qof_book_increment_and_format_counter',
'increment_and_format_counter')
945 Book.get_root_account = method_function_returns_instance(
946 Book.get_root_account, Account )
948 Book.get_table = method_function_returns_instance(
949 Book.get_table, GncCommodityTable )
951 Book.get_price_db = method_function_returns_instance(
952 Book.get_price_db, GncPriceDB)
955 GncNumeric.add_constructor_and_methods_with_prefix(
'gnc_numeric_',
'create')
965 'add_fixed' : GncNumeric,
966 'sub_fixed' : GncNumeric,
967 'convert' : GncNumeric,
968 'reduce' : GncNumeric,
969 'invert' : GncNumeric
971 methods_return_instance(GncNumeric, gncnumeric_dict)
974 GncCommodity.add_constructor_and_methods_with_prefix(
'gnc_commodity_',
'new')
976 GncCommodity.clone = method_function_returns_instance(
977 GncCommodity.clone, GncCommodity )
980 GncCommodityTable.add_methods_with_prefix(
'gnc_commodity_table_')
981 commoditytable_dict = {
982 'lookup' : GncCommodity,
983 'lookup_unique' : GncCommodity,
984 'find_full' : GncCommodity,
985 'insert' : GncCommodity,
986 'add_namespace': GncCommodityNamespace,
987 'find_namespace': GncCommodityNamespace,
989 methods_return_instance(GncCommodityTable, commoditytable_dict)
991 methods_return_instance_lists(
992 GncCommodityTable, {
'get_namespaces_list': GncCommodityNamespace,
993 'get_commodities': GncCommodity,
994 'get_quotable_commodities': GncCommodity,
997 setattr(GncCommodityTable,
'get_namespaces', getattr(GncCommodityTable,
'_get_namespaces_py'))
1000 GncCommodityNamespace.add_methods_with_prefix(
'gnc_commodity_namespace_')
1001 GncCommodityNamespace.get_commodity_list = \
1002 method_function_returns_instance_list(
1003 GncCommodityNamespace.get_commodity_list, GncCommodity )
1006 GncLot.add_constructor_and_methods_with_prefix(
'gnc_lot_',
'new')
1009 'get_account' : Account,
1011 'get_earliest_split' : Split,
1012 'get_latest_split' : Split,
1013 'get_balance' : GncNumeric,
1015 'make_default' : GncLot
1017 methods_return_instance(GncLot, gnclot_dict)
1020 Transaction.add_methods_with_prefix(
'xaccTrans')
1021 Transaction.add_method(
'gncTransGetGUID',
'GetGUID')
1023 Transaction.add_method(
'xaccTransGetDescription',
'GetDescription')
1024 Transaction.add_method(
'xaccTransDestroy',
'Destroy')
1028 'FindSplitByAccount': Split,
1029 'Clone': Transaction,
1030 'Reverse': Transaction,
1031 'GetReversedBy': Transaction,
1032 'GetImbalanceValue': GncNumeric,
1033 'GetAccountValue': GncNumeric,
1034 'GetAccountAmount': GncNumeric,
1035 'GetAccountConvRate': GncNumeric,
1036 'GetAccountBalance': GncNumeric,
1037 'GetCurrency': GncCommodity,
1041 methods_return_instance(Transaction, trans_dict)
1042 methods_return_instance_lists(
1043 Transaction, {
'GetSplitList': Split,
1045 Transaction.decorate_functions(
1046 decorate_monetary_list_returning_function,
'GetImbalance')
1049 Split.add_methods_with_prefix(
'xaccSplit')
1050 Split.add_method(
'gncSplitGetGUID',
'GetGUID')
1051 Split.add_method(
'xaccSplitDestroy',
'Destroy')
1055 'GetAccount': Account,
1056 'GetParent': Transaction,
1058 'GetOtherSplit': Split,
1059 'GetAmount': GncNumeric,
1060 'GetValue': GncNumeric,
1061 'GetSharePrice': GncNumeric,
1062 'ConvertAmount': GncNumeric,
1063 'GetBaseValue': GncNumeric,
1064 'GetBalance': GncNumeric,
1065 'GetClearedBalance': GncNumeric,
1066 'GetReconciledBalance': GncNumeric,
1067 'VoidFormerAmount': GncNumeric,
1068 'VoidFormerValue': GncNumeric,
1071 methods_return_instance(Split, split_dict)
1073 Split.account = property( Split.GetAccount, Split.SetAccount )
1074 Split.parent = property( Split.GetParent, Split.SetParent )
1077 Account.add_methods_with_prefix(
'xaccAccount')
1078 Account.add_methods_with_prefix(
'gnc_account_')
1079 Account.add_method(
'gncAccountGetGUID',
'GetGUID')
1080 Account.add_method(
'xaccAccountGetPlaceholder',
'GetPlaceholder')
1085 'get_parent' : Account,
1086 'get_root' : Account,
1087 'nth_child' : Account,
1088 'lookup_by_code' : Account,
1089 'lookup_by_name' : Account,
1090 'lookup_by_full_name' : Account,
1091 'FindTransByDesc' : Transaction,
1092 'FindSplitByDesc' : Split,
1093 'GetBalance' : GncNumeric,
1094 'GetClearedBalance' : GncNumeric,
1095 'GetReconciledBalance' : GncNumeric,
1096 'GetPresentBalance' : GncNumeric,
1097 'GetProjectedMinimumBalance' : GncNumeric,
1098 'GetBalanceAsOfDate' : GncNumeric,
1099 'ConvertBalanceToCurrency' : GncNumeric,
1100 'ConvertBalanceToCurrencyAsOfDate' : GncNumeric,
1101 'GetBalanceInCurrency' : GncNumeric,
1102 'GetClearedBalanceInCurrency' : GncNumeric,
1103 'GetReconciledBalanceInCurrency' : GncNumeric,
1104 'GetPresentBalanceInCurrency' : GncNumeric,
1105 'GetProjectedMinimumBalanceInCurrency' : GncNumeric,
1106 'GetBalanceAsOfDateInCurrency' : GncNumeric,
1107 'GetBalanceChangeForPeriod' : GncNumeric,
1108 'GetCommodity' : GncCommodity,
1111 methods_return_instance(Account, account_dict)
1112 methods_return_instance_lists(
1113 Account, {
'GetSplitList': Split,
1114 'get_children': Account,
1115 'get_children_sorted': Account,
1116 'get_descendants': Account,
1117 'get_descendants_sorted': Account
1119 Account.name = property( Account.GetName, Account.SetName )
1122 GUID.add_methods_with_prefix(
'guid_')
1123 GUID.add_method(
'xaccAccountLookup',
'AccountLookup')
1124 GUID.add_method(
'xaccTransLookup',
'TransLookup')
1125 GUID.add_method(
'xaccSplitLookup',
'SplitLookup')
1128 GUID.add_method(
'guid_to_string',
'to_string')
1133 'TransLookup': Transaction,
1134 'AccountLookup': Account,
1135 'SplitLookup': Split
1137 methods_return_instance(GUID, guid_dict)
1143 GUIDString.add_constructor_and_methods_with_prefix(
'string_',
'to_guid')
1146 from gnucash.gnucash_core_c
import \
1153 from gnucash.gnucash_core_c
import \
1154 QOF_STRING_MATCH_NORMAL, \
1155 QOF_STRING_MATCH_CASEINSENSITIVE
1157 from gnucash.gnucash_core_c
import \
1160 QOF_COMPARE_EQUAL, \
1164 QOF_COMPARE_CONTAINS, \
1165 QOF_COMPARE_NCONTAINS
1167 from gnucash.gnucash_core_c
import \
1168 QOF_DATE_MATCH_NORMAL, \
1171 from gnucash.gnucash_core_c
import \
1172 QOF_NUMERIC_MATCH_DEBIT, \
1173 QOF_NUMERIC_MATCH_CREDIT, \
1174 QOF_NUMERIC_MATCH_ANY
1176 from gnucash.gnucash_core_c
import \
1177 QOF_GUID_MATCH_ANY, \
1178 QOF_GUID_MATCH_NONE, \
1179 QOF_GUID_MATCH_NULL, \
1180 QOF_GUID_MATCH_ALL, \
1181 QOF_GUID_MATCH_LIST_ANY
1183 from gnucash.gnucash_core_c
import \
1184 QOF_CHAR_MATCH_ANY, \
1187 from gnucash.gnucash_core_c
import \
1190 from gnucash.gnucash_core_c
import \
1196 """Set search_for to obj_type 1198 calls qof_query_search_for. Buffers search string for queries lifetime. 1199 @see https://bugs.gnucash.org/show_bug.cgi?id=796137""" 1203 Query.add_constructor_and_methods_with_prefix(
'qof_query_',
'create', exclude=[
"qof_query_search_for"])
1205 Query.add_method(
'qof_query_set_book',
'set_book')
1206 Query.add_method(
'qof_query_search_for',
'_search_for')
1207 Query.add_method(
'qof_query_run',
'run')
1208 Query.add_method(
'qof_query_add_term',
'add_term')
1209 Query.add_method(
'qof_query_add_boolean_match',
'add_boolean_match')
1210 Query.add_method(
'qof_query_add_guid_list_match',
'add_guid_list_match')
1211 Query.add_method(
'qof_query_add_guid_match',
'add_guid_match')
1212 Query.add_method(
'qof_query_destroy',
'destroy')
1217 QueryStringPredicate.add_constructor_and_methods_with_prefix(
1218 'qof_query_',
'string_predicate')
1223 QueryBooleanPredicate.add_constructor_and_methods_with_prefix(
1224 'qof_query_',
'boolean_predicate')
1229 QueryInt32Predicate.add_constructor_and_methods_with_prefix(
1230 'qof_query_',
'int32_predicate')
1235 QueryDatePredicate.add_constructor_and_methods_with_prefix(
1236 'qof_query_',
'date_predicate', exclude=[
"qof_query_date_predicate_get_date"])
1237 QueryDatePredicate.add_method(
'qof_query_date_predicate_get_date',
'get_date')
1242 QueryGuidPredicate.add_constructor_and_methods_with_prefix(
1243 'qof_query_',
'guid_predicate')
1248 QueryNumericPredicate.add_constructor_and_methods_with_prefix(
1249 'qof_query_',
'numeric_predicate')
gnc_numeric double_to_gnc_numeric(double in, gint64 denom, gint how)
Convert a floating-point number to a gnc_numeric.
def search_for(self, obj_type)
def raise_backend_errors_after_call(function, args, kwargs)
gchar * gnc_numeric_to_string(gnc_numeric n)
Convert to string.
def BillNextID(self, vendor)
def raise_backend_errors(self, called_function="qof_session function")
def do_lookup_create_oo_instance(self, lookup_function, cls, args)
def InvoiceNextID(self, customer)
def generate_errors(self)
def __init__(self, args, kargs)
gnc_numeric gnc_numeric_from_string(const gchar *str)
Read a gnc_numeric from str, skipping any leading whitespace.
def __init__(self, book_uri=None, mode=None, instance=None, book=None)
A convenient constructor that allows you to specify a book URI, begin the session, and load the book.
GNCNumericErrorCode gnc_numeric_check(gnc_numeric in)
Check for error signal in value.