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 is_new = mode
in (SessionOpenMode.SESSION_NEW_STORE, SessionOpenMode.SESSION_NEW_OVERWRITE)
362 except GnuCashBackendException
as backend_exception:
370 def __exit__(self, exc_type, exc_value, traceback):
377 """Raises a GnuCashBackendException if there are outstanding 380 set called_function to name the function that was last called 385 "call to %s resulted in the " 386 "following errors, %s" % (called_function, backend_error_dict[errors[0]]),
390 """A generator that yields any outstanding QofBackend errors 392 while self.get_error()
is not ERR_BACKEND_NO_ERR:
393 error = self.pop_error()
397 """Returns any accumulated qof backend errors as a tuple 404 """A function decorator that results in a call to 405 raise_backend_errors after execution. 407 def new_function(self, *args, **kwargs):
408 return_value = function(self, *args, **kwargs)
414 """A Book encapsulates all of the GnuCash data, it is the place where 415 all GnuCash entities (Transaction, Split, Vendor, Invoice...), are 416 stored. You'll notice that all of the constructors for those entities 417 need a book to be associated with. 419 The most common way to get a book is through the book property in the 420 Session class, that is, create a session that connects to some storage, 421 such as through 'my_session = Session('file:my_books.xac')', and access 422 the book via the book property, 'my_session.book' 424 If you would like to create a Book without any backing storage, call the 425 Book constructor without any parameters, 'Book()'. You can later merge 426 such a book into a book with actual store by using merge_init. 429 get_root_account -- Returns the root level Account 430 get_table -- Returns a commodity lookup table, of type GncCommodityTable 432 def InvoiceLookup(self, guid):
433 from gnucash.gnucash_business
import Invoice
435 gncInvoiceLookup, Invoice, guid.get_instance() )
437 def EntryLookup(self, guid):
438 from gnucash.gnucash_business
import Entry
440 gncEntryLookup, Entry, guid.get_instance() )
442 def CustomerLookup(self, guid):
443 from gnucash.gnucash_business
import Customer
445 gncCustomerLookup, Customer, guid.get_instance())
447 def JobLookup(self, guid):
448 from gnucash.gnucash_business
import Job
450 gncJobLookup, Job, guid.get_instance() )
452 def VendorLookup(self, guid):
453 from gnucash.gnucash_business
import Vendor
455 gncVendorLookup, Vendor, guid.get_instance() )
457 def EmployeeLookup(self, guid):
458 from gnucash.gnucash_business
import Employee
460 gncEmployeeLookup, Employee, guid.get_instance() )
462 def TaxTableLookup(self, guid):
463 from gnucash.gnucash_business
import TaxTable
465 gncTaxTableLookup, TaxTable, guid.get_instance() )
467 def TaxTableLookupByName(self, name):
468 from gnucash.gnucash_business
import TaxTable
470 gncTaxTableLookupByName, TaxTable, name)
472 def TaxTableGetTables(self):
473 from gnucash.gnucash_business
import TaxTable
474 return [ TaxTable(instance=item)
for item
in gncTaxTableGetTables(self.instance) ]
476 def BillLookupByID(self, id):
477 from gnucash.gnucash_business
import Bill
479 gnc_search_bill_on_id, Bill, id)
481 def InvoiceLookupByID(self, id):
482 from gnucash.gnucash_business
import Invoice
484 gnc_search_invoice_on_id, Invoice, id)
486 def CustomerLookupByID(self, id):
487 from gnucash.gnucash_business
import Customer
489 gnc_search_customer_on_id, Customer, id)
491 def VendorLookupByID(self, id):
492 from gnucash.gnucash_business
import Vendor
494 gnc_search_vendor_on_id, Vendor, id)
497 ''' Return the next invoice ID. 499 from gnucash.gnucash_core_c
import gncInvoiceNextID
500 return gncInvoiceNextID(self.get_instance(),customer.GetEndOwner().get_instance()[1])
503 ''' Return the next Bill ID. ''' 504 from gnucash.gnucash_core_c
import gncInvoiceNextID
505 return gncInvoiceNextID(self.get_instance(),vendor.GetEndOwner().get_instance()[1])
508 ''' Return the next Customer ID. ''' 509 from gnucash.gnucash_core_c
import gncCustomerNextID
510 return gncCustomerNextID(self.get_instance())
513 ''' Return the next Vendor ID. ''' 514 from gnucash.gnucash_core_c
import gncVendorNextID
515 return gncVendorNextID(self.get_instance())
518 """Object used by GnuCash to store all numbers. Always consists of a 519 numerator and denominator. 521 The constants GNC_DENOM_AUTO, 522 GNC_HOW_RND_FLOOR, GNC_HOW_RND_CEIL, GNC_HOW_RND_TRUNC, 523 GNC_HOW_RND_PROMOTE, GNC_HOW_RND_ROUND_HALF_DOWN, 524 GNC_HOW_RND_ROUND_HALF_UP, GNC_HOW_RND_ROUND, GNC_HOW_RND_NEVER, 525 GNC_HOW_DENOM_EXACT, GNC_HOW_DENOM_REDUCE, GNC_HOW_DENOM_LCD, 526 and GNC_HOW_DENOM_FIXED are available for arithmetic 527 functions like GncNumeric.add 529 Look at gnc-numeric.h to see how to use these 533 """Constructor that supports the following formats: 534 * No arguments defaulting to zero: eg. GncNumeric() == 0/1 535 * A integer: e.g. GncNumeric(1) == 1/1 536 * Numerator and denominator intager pair: eg. GncNumeric(1, 2) == 1/2 537 * A floating point number: e.g. GncNumeric(0.5) == 1/2 538 * A floating point number with defined conversion: e.g. 539 GncNumeric(0.5, GNC_DENOM_AUTO, 540 GNC_HOW_DENOM_FIXED | GNC_HOW_RND_NEVER) == 1/2 541 * A string: e.g. GncNumeric("1/2") == 1/2 543 if 'instance' not in kargs:
544 kargs[
'instance'] = GncNumeric.__args_to_instance(args)
545 GnuCashCoreClass.__init__(self, [], **kargs)
548 def __args_to_instance(args):
550 return gnc_numeric_zero()
553 if isinstance(arg, int):
554 return gnc_numeric_create(arg, 1)
555 elif isinstance(arg, float):
557 elif isinstance(arg, str):
560 raise TypeError(
'Failed to convert to GncNumeric: ' + str(args))
562 elif isinstance(arg, GncNumeric):
565 raise TypeError(
'Only single int/float/str/GncNumeric allowed: ' + str(args))
567 if isinstance(args[0], int)
and isinstance(args[1], int):
568 return gnc_numeric_create(*args)
570 raise TypeError(
'Only two ints allowed: ' + str(args))
572 if isinstance(args[0], float) \
573 and isinstance(args[1], int) \
574 and type(args[2]) == type(GNC_HOW_DENOM_FIXED):
577 raise TypeError(
'Only (float, int, GNC_HOW_RND_*) allowed: ' + str(args))
579 raise TypeError(
'Required single int/float/str or two ints: ' + str(args))
584 def _operator_fallbacks(monomorphic_operator, fallback_operator):
585 """fallbacks are not needed except for method name, 586 keep for possible later use""" 588 if isinstance(b, GncNumeric):
589 return monomorphic_operator(a, b)
590 if isinstance(b, (int, float)):
593 return NotImplemented
594 forward.__name__ =
'__' + fallback_operator.__name__ +
'__' 595 forward.__doc__ = monomorphic_operator.__doc__
598 if isinstance(a, (GncNumeric, int, float)):
601 return NotImplemented
602 reverse.__name__ =
'__r' + fallback_operator.__name__ +
'__' 603 reverse.__doc__ = monomorphic_operator.__doc__
605 return forward, reverse
608 return a.add(b, GNC_DENOM_AUTO, GNC_HOW_RND_ROUND)
611 return a.sub(b, GNC_DENOM_AUTO, GNC_HOW_RND_ROUND)
614 return a.mul(b, GNC_DENOM_AUTO, GNC_HOW_RND_ROUND)
617 return a.div(b, GNC_DENOM_AUTO, GNC_HOW_RND_ROUND)
620 return a.div(b, 1, GNC_HOW_RND_TRUNC)
622 __add__, __radd__ = _operator_fallbacks(_add, operator.add)
624 __sub__, __rsub__ = _operator_fallbacks(_sub, operator.sub)
626 __mul__, __rmul__ = _operator_fallbacks(_mul, operator.mul)
628 __truediv__, __rtruediv__ = _operator_fallbacks(_div, operator.truediv)
629 __itruediv__ = __truediv__
630 __floordiv__, __rfloordiv__ = _operator_fallbacks(_floordiv, operator.floordiv)
631 __ifloordiv__ = __floordiv__
635 return a.compare(b) == -1
638 return a.compare(b) == 1
641 return a.compare(b)
in (0,-1)
644 return a.compare(b)
in (0,1)
647 return a.compare(b) == 0
649 def _richcmp(self, other, op):
650 """Helper for comparison operators, for internal use only. 651 Implement comparison between a GncNumeric instance `self`, 652 and either another GncNumeric instance, an int or a float 653 `other`. If `other` is not an instance of that kind, return 654 NotImplemented. `op` should be one of the six standard 655 comparison operators. The comparisons are based on 656 GncNumeric.compare(). 659 if isinstance(other, GncNumeric):
661 elif isinstance(other, (int, float)):
664 return NotImplemented
668 return a._richcmp(b, a._lt)
672 return a._richcmp(b, a._gt)
676 return a._richcmp(b, a._le)
680 return a._richcmp(b, a._ge)
684 return a._richcmp(b, a._eq)
691 return self.to_double()
694 return int(self.to_double())
708 def to_fraction(self):
709 from fractions
import Fraction
710 return Fraction(self.num(), self.denom())
713 """Returns a human readable numeric value string as UTF8.""" 718 Each priceEach price in the database represents an "instantaneous" 719 quote for a given commodity with respect to another commodity. 720 For example, a given price might represent the value of LNUX in USD on 2001-02-03. 723 * commodity: the item being priced. 724 * currency: the denomination of the value of the item being priced. 725 * value: the value of the item being priced. 726 * time: the time the price was valid. 727 * source: a string describing the source of the quote. These strings will be something like this: 728 "Finance::Quote", "user:misc", "user:foo", etc. If the quote came from a user, as a matter of policy, 729 you *must* prefix the string you give with "user:". For now, the only other reserved values are 730 "Finance::Quote" and "old-file-import". Any string used must be added to the source_list array in 731 dialog-price-edit-db.c so that it can be properly translated. (There are unfortunately many strings 732 in users' databases, so this string must be translated on output instead of always being used in untranslated form). 733 * type: the type of quote - types possible right now are bid, ask, last, nav, and 734 unknown.Each price in the database represents an "instantaneous" quote for a given 735 commodity with respect to another commodity. 736 For example, a given price might represent the value of LNUX in USD on 2001-02-03. 738 See also https://code.gnucash.org/docs/head/group__Price.html 740 _new_instance =
'gnc_price_create' 741 GncPrice.add_methods_with_prefix(
'gnc_price_')
746 a simple price database for gnucash. 747 The PriceDB is intended to be a database of price quotes, or more specifically, 748 a database of GNCPrices. For the time being, it is still a fairly simple 749 database supporting only fairly simple queries. It is expected that new 750 queries will be added as needed, and that there is some advantage to delaying 751 complex queries for now in the hope that we get a real DB implementation 752 before they're really needed. 754 Every QofBook contains a GNCPriceDB, accessible via gnc_pricedb_get_db. 756 Definition in file gnc-pricedb.h. 757 See also https://code.gnucash.org/docs/head/gnc-pricedb_8h.html 760 @deprecated(
"Use gnc_pricedb_latest_before_t64")
761 def gnc_pricedb_lookup_latest_before_t64(self, commodity, currency, date):
762 return self.lookup_nearest_before_t64(commodity, currency, date)
764 GncPriceDB.add_method(
'gnc_pricedb_lookup_latest_before_t64',
'lookup_latest_before_t64')
766 GncPriceDB.lookup_latest_before_t64 = method_function_returns_instance(GncPriceDB.lookup_latest_before_t64, GncPrice)
768 GncPriceDB.add_methods_with_prefix(
'gnc_pricedb_')
770 'lookup_latest' : GncPrice,
771 'lookup_nearest_in_time64' : GncPrice,
772 'lookup_nearest_before_t64' : GncPrice,
773 'nth_price' : GncPrice,
774 'lookup_day_t64' : GncPrice,
775 'convert_balance_latest_price' : GncNumeric,
776 'convert_balance_nearest_price_t64' : GncNumeric,
777 'convert_balance_nearest_before_price_t64' : GncNumeric,
778 'get_latest_price' : GncNumeric,
779 'get_nearest_price' : GncNumeric,
780 'get_nearest_before_price' : GncNumeric,
782 methods_return_instance(GncPriceDB,PriceDB_dict)
783 methods_return_instance_lists(
784 GncPriceDB, {
'get_prices': GncPrice,
785 'lookup_latest_any_currency': GncPrice,
786 'lookup_nearest_before_any_currency_t64': GncPrice,
787 'lookup_nearest_in_time_any_currency_t64': GncPrice,
793 """A CommodityTable provides a way to store and lookup commodities. 794 Commodities are primarily currencies, but other tradable things such as 795 stocks, mutual funds, and material substances are possible. 797 Users of this library should not create their own CommodityTable, instead 798 the get_table method from the Book class should be used. 800 This table is automatically populated with the GnuCash default commodity's 801 which includes most of the world's currencies. 804 def _get_namespaces_py(self):
805 return [ns.get_name()
for ns
in self.get_namespaces_list()]
810 class GncLot(GnuCashCoreClass):
811 def GetInvoiceFromLot(self):
812 from gnucash.gnucash_business
import Invoice
813 return self.do_lookup_create_oo_instance(
814 gncInvoiceGetInvoiceFromLot, Invoice )
817 """A GnuCash Transaction 819 Consists of at least one (generally two) splits to represent a transaction 820 between two accounts. 823 Has a GetImbalance() method that returns a list of all the imbalanced 824 currencies. Each list item is a two element tuple, the first element is 825 the imbalanced commodity, the second element is the value. 827 Warning, the commodity.get_instance() value can be None when there 828 is no currency set for the transaction. 830 _new_instance =
'xaccMallocTransaction' 831 def GetNthSplit(self, n):
832 return self.GetSplitList().pop(n)
834 def GetInvoiceFromTxn(self):
835 from gnucash.gnucash_business
import Invoice
837 gncInvoiceGetInvoiceFromTxn, Invoice )
839 def __eq__(self, other):
840 return self.Equal(other,
True,
False,
False,
False)
842 def decorate_monetary_list_returning_function(orig_function):
843 def new_function(self, *args):
844 """decorate function that returns list of gnc_monetary to return tuples of GncCommodity and GncNumeric 847 *args: Variable length argument list. Will get passed to orig_function 850 array of tuples: (GncCommodity, GncNumeric) 853 Maybe this function should better reside in module function_class (?)""" 858 for item
in orig_function(self, *args) ]
864 The most basic representation of a movement of currency from one account to 867 _new_instance =
'xaccMallocSplit' 869 def __eq__(self, other):
870 return self.Equal(other,
True,
False,
False)
873 """A GnuCash Account. 875 A fundamental entity in accounting, an Account provides representation 876 for a financial object, such as a ACCT_TYPE_BANK account, an 877 ACCT_TYPE_ASSET (like a building), 878 a ACCT_TYPE_LIABILITY (such as a bank loan), a summary of some type of 879 ACCT_TYPE_EXPENSE, or a summary of some source of ACCT_TYPE_INCOME . 881 The words in upper case are the constants that GnuCash and this library uses 882 to describe account type. Here is the full list: 883 ACCT_TYPE_ASSET, ACCT_TYPE_BANK, ACCT_TYPE_CASH, ACCT_TYPE_CHECKING, \ 884 ACCT_TYPE_CREDIT, ACCT_TYPE_EQUITY, ACCT_TYPE_EXPENSE, ACCT_TYPE_INCOME, \ 885 ACCT_TYPE_LIABILITY, ACCT_TYPE_MUTUAL, ACCT_TYPE_PAYABLE, \ 886 ACCT_TYPE_RECEIVABLE, ACCT_TYPE_STOCK, ACCT_TYPE_ROOT, ACCT_TYPE_TRADING 888 These are not strings, they are attributes you can import from this 891 _new_instance =
'xaccMallocAccount' 894 _new_instance =
'guid_new_return' 897 Session.add_constructor_and_methods_with_prefix(
'qof_session_',
'new')
899 def one_arg_default_none(function):
900 return default_arguments_decorator(function,
None,
None)
901 Session.decorate_functions(one_arg_default_none,
"load",
"save")
903 Session.decorate_functions( Session.raise_backend_errors_after_call,
904 "begin",
"load",
"save",
"end")
905 Session.decorate_method(default_arguments_decorator,
"begin",
None, mode=SessionOpenMode.SESSION_NORMAL_OPEN)
906 Session.decorate_functions(deprecated_args_session_begin,
"begin")
908 Session.get_book = method_function_returns_instance(
909 Session.get_book, Book )
911 Session.book = property( Session.get_book )
914 this_module_dict = globals()
915 for error_name, error_value, error_name_after_prefix
in \
916 extract_attributes_with_prefix(gnucash_core_c,
'ERR_'):
917 this_module_dict[ error_name ] = error_value
920 backend_error_dict = {}
921 for error_name, error_value, error_name_after_prefix
in \
922 extract_attributes_with_prefix(gnucash_core_c,
'ERR_'):
923 backend_error_dict[ error_value ] = error_name
927 from gnucash.gnucash_core_c
import GNC_DENOM_AUTO
931 from gnucash.gnucash_core_c
import \
932 GNC_HOW_RND_FLOOR, GNC_HOW_RND_CEIL, GNC_HOW_RND_TRUNC, \
933 GNC_HOW_RND_PROMOTE, GNC_HOW_RND_ROUND_HALF_DOWN, \
934 GNC_HOW_RND_ROUND_HALF_UP, GNC_HOW_RND_ROUND, GNC_HOW_RND_NEVER
938 from gnucash.gnucash_core_c
import \
939 GNC_HOW_DENOM_EXACT, GNC_HOW_DENOM_REDUCE, GNC_HOW_DENOM_LCD, \
940 GNC_HOW_DENOM_FIXED, GNC_HOW_DENOM_SIGFIG
943 from gnucash.gnucash_core_c
import \
944 ACCT_TYPE_ASSET, ACCT_TYPE_BANK, ACCT_TYPE_CASH, ACCT_TYPE_CHECKING, \
945 ACCT_TYPE_CREDIT, ACCT_TYPE_EQUITY, ACCT_TYPE_EXPENSE, ACCT_TYPE_INCOME, \
946 ACCT_TYPE_LIABILITY, ACCT_TYPE_MUTUAL, ACCT_TYPE_PAYABLE, \
947 ACCT_TYPE_RECEIVABLE, ACCT_TYPE_STOCK, ACCT_TYPE_ROOT, ACCT_TYPE_TRADING
950 Book.add_constructor_and_methods_with_prefix(
'qof_book_',
'new')
951 Book.add_method(
'gnc_book_get_root_account',
'get_root_account')
952 Book.add_method(
'gnc_book_set_root_account',
'set_root_account')
953 Book.add_method(
'gnc_commodity_table_get_table',
'get_table')
954 Book.add_method(
'gnc_pricedb_get_db',
'get_price_db')
955 Book.add_method(
'qof_book_increment_and_format_counter',
'increment_and_format_counter')
958 Book.get_root_account = method_function_returns_instance(
959 Book.get_root_account, Account )
961 Book.get_table = method_function_returns_instance(
962 Book.get_table, GncCommodityTable )
964 Book.get_price_db = method_function_returns_instance(
965 Book.get_price_db, GncPriceDB)
968 GncNumeric.add_constructor_and_methods_with_prefix(
'gnc_numeric_',
'create')
978 'add_fixed' : GncNumeric,
979 'sub_fixed' : GncNumeric,
980 'convert' : GncNumeric,
981 'reduce' : GncNumeric,
982 'invert' : GncNumeric
984 methods_return_instance(GncNumeric, gncnumeric_dict)
987 GncCommodity.add_constructor_and_methods_with_prefix(
'gnc_commodity_',
'new')
988 gnc_commodity_dict = {
989 'clone': GncCommodity,
990 'obtain_twin': GncCommodity,
991 'get_namespace_ds': GncCommodityNamespace,
993 methods_return_instance(GncCommodity, gnc_commodity_dict)
997 'get_commodity': GncCommodity,
998 'get_currency': GncCommodity,
1000 'get_value': GncNumeric,
1002 methods_return_instance(GncPrice, gnc_price_dict)
1005 GncCommodityTable.add_methods_with_prefix(
'gnc_commodity_table_')
1006 commoditytable_dict = {
1007 'lookup' : GncCommodity,
1008 'lookup_unique' : GncCommodity,
1009 'find_full' : GncCommodity,
1010 'insert' : GncCommodity,
1011 'add_namespace': GncCommodityNamespace,
1012 'find_namespace': GncCommodityNamespace,
1014 methods_return_instance(GncCommodityTable, commoditytable_dict)
1016 methods_return_instance_lists(
1017 GncCommodityTable, {
'get_namespaces_list': GncCommodityNamespace,
1018 'get_commodities': GncCommodity,
1019 'get_quotable_commodities': GncCommodity,
1022 setattr(GncCommodityTable,
'get_namespaces', getattr(GncCommodityTable,
'_get_namespaces_py'))
1025 GncCommodityNamespace.add_methods_with_prefix(
'gnc_commodity_namespace_')
1026 GncCommodityNamespace.get_commodity_list = \
1027 method_function_returns_instance_list(
1028 GncCommodityNamespace.get_commodity_list, GncCommodity )
1031 GncLot.add_constructor_and_methods_with_prefix(
'gnc_lot_',
'new')
1034 'get_account' : Account,
1036 'get_earliest_split' : Split,
1037 'get_latest_split' : Split,
1038 'get_balance' : GncNumeric,
1040 'make_default' : GncLot
1042 methods_return_instance(GncLot, gnclot_dict)
1043 methods_return_instance_lists(
1044 GncLot, {
'get_split_list': Split,
1048 Transaction.add_methods_with_prefix(
'xaccTrans')
1049 Transaction.add_method(
'gncTransGetGUID',
'GetGUID')
1051 Transaction.add_method(
'xaccTransGetDescription',
'GetDescription')
1052 Transaction.add_method(
'xaccTransDestroy',
'Destroy')
1056 'FindSplitByAccount': Split,
1057 'Clone': Transaction,
1058 'Reverse': Transaction,
1059 'GetReversedBy': Transaction,
1060 'GetImbalanceValue': GncNumeric,
1061 'GetAccountValue': GncNumeric,
1062 'GetAccountAmount': GncNumeric,
1063 'GetAccountConvRate': GncNumeric,
1064 'GetAccountBalance': GncNumeric,
1065 'GetCurrency': GncCommodity,
1069 methods_return_instance(Transaction, trans_dict)
1070 methods_return_instance_lists(
1071 Transaction, {
'GetSplitList': Split,
1073 Transaction.decorate_functions(
1074 decorate_monetary_list_returning_function,
'GetImbalance')
1077 Split.add_methods_with_prefix(
'xaccSplit')
1078 Split.add_method(
'gncSplitGetGUID',
'GetGUID')
1079 Split.add_method(
'xaccSplitDestroy',
'Destroy')
1083 'GetAccount': Account,
1084 'GetParent': Transaction,
1086 'GetOtherSplit': Split,
1087 'GetAmount': GncNumeric,
1088 'GetValue': GncNumeric,
1089 'GetSharePrice': GncNumeric,
1090 'ConvertAmount': GncNumeric,
1091 'GetBaseValue': GncNumeric,
1092 'GetBalance': GncNumeric,
1093 'GetClearedBalance': GncNumeric,
1094 'GetReconciledBalance': GncNumeric,
1095 'VoidFormerAmount': GncNumeric,
1096 'VoidFormerValue': GncNumeric,
1097 'GetNoclosingBalance': GncNumeric,
1098 'GetCapGains': GncNumeric,
1101 methods_return_instance(Split, split_dict)
1103 Split.account = property( Split.GetAccount, Split.SetAccount )
1104 Split.parent = property( Split.GetParent, Split.SetParent )
1107 Account.add_methods_with_prefix(
'xaccAccount')
1108 Account.add_methods_with_prefix(
'gnc_account_')
1109 Account.add_method(
'gncAccountGetGUID',
'GetGUID')
1110 Account.add_method(
'xaccAccountGetPlaceholder',
'GetPlaceholder')
1115 'get_parent' : Account,
1116 'get_root' : Account,
1117 'nth_child' : Account,
1118 'lookup_by_code' : Account,
1119 'lookup_by_name' : Account,
1120 'lookup_by_full_name' : Account,
1121 'FindTransByDesc' : Transaction,
1122 'FindSplitByDesc' : Split,
1123 'GetBalance' : GncNumeric,
1124 'GetClearedBalance' : GncNumeric,
1125 'GetReconciledBalance' : GncNumeric,
1126 'GetPresentBalance' : GncNumeric,
1127 'GetProjectedMinimumBalance' : GncNumeric,
1128 'GetBalanceAsOfDate' : GncNumeric,
1129 'ConvertBalanceToCurrency' : GncNumeric,
1130 'ConvertBalanceToCurrencyAsOfDate' : GncNumeric,
1131 'GetBalanceInCurrency' : GncNumeric,
1132 'GetClearedBalanceInCurrency' : GncNumeric,
1133 'GetReconciledBalanceInCurrency' : GncNumeric,
1134 'GetPresentBalanceInCurrency' : GncNumeric,
1135 'GetProjectedMinimumBalanceInCurrency' : GncNumeric,
1136 'GetBalanceAsOfDateInCurrency' : GncNumeric,
1137 'GetBalanceChangeForPeriod' : GncNumeric,
1138 'GetCommodity' : GncCommodity,
1139 'get_currency_or_parent' : GncCommodity,
1142 methods_return_instance(Account, account_dict)
1143 methods_return_instance_lists(
1144 Account, {
'GetSplitList': Split,
1145 'GetLotList': GncLot,
1146 'get_children': Account,
1147 'get_children_sorted': Account,
1148 'get_descendants': Account,
1149 'get_descendants_sorted': Account
1151 Account.name = property( Account.GetName, Account.SetName )
1154 GUID.add_methods_with_prefix(
'guid_')
1155 GUID.add_method(
'xaccAccountLookup',
'AccountLookup')
1156 GUID.add_method(
'xaccTransLookup',
'TransLookup')
1157 GUID.add_method(
'xaccSplitLookup',
'SplitLookup')
1160 GUID.add_method(
'guid_to_string',
'to_string')
1165 'TransLookup': Transaction,
1166 'AccountLookup': Account,
1167 'SplitLookup': Split
1169 methods_return_instance(GUID, guid_dict)
1175 GUIDString.add_constructor_and_methods_with_prefix(
'string_',
'to_guid')
1178 from gnucash.gnucash_core_c
import \
1185 from gnucash.gnucash_core_c
import \
1186 QOF_STRING_MATCH_NORMAL, \
1187 QOF_STRING_MATCH_CASEINSENSITIVE
1189 from gnucash.gnucash_core_c
import \
1192 QOF_COMPARE_EQUAL, \
1196 QOF_COMPARE_CONTAINS, \
1197 QOF_COMPARE_NCONTAINS
1199 from gnucash.gnucash_core_c
import \
1200 QOF_DATE_MATCH_NORMAL, \
1203 from gnucash.gnucash_core_c
import \
1204 QOF_NUMERIC_MATCH_DEBIT, \
1205 QOF_NUMERIC_MATCH_CREDIT, \
1206 QOF_NUMERIC_MATCH_ANY
1208 from gnucash.gnucash_core_c
import \
1209 QOF_GUID_MATCH_ANY, \
1210 QOF_GUID_MATCH_NONE, \
1211 QOF_GUID_MATCH_NULL, \
1212 QOF_GUID_MATCH_ALL, \
1213 QOF_GUID_MATCH_LIST_ANY
1215 from gnucash.gnucash_core_c
import \
1216 QOF_CHAR_MATCH_ANY, \
1219 from gnucash.gnucash_core_c
import \
1222 from gnucash.gnucash_core_c
import \
1228 """Set search_for to obj_type 1230 calls qof_query_search_for. Buffers search string for queries lifetime. 1231 @see https://bugs.gnucash.org/show_bug.cgi?id=796137""" 1235 Query.add_constructor_and_methods_with_prefix(
'qof_query_',
'create', exclude=[
"qof_query_search_for"])
1237 Query.add_method(
'qof_query_set_book',
'set_book')
1238 Query.add_method(
'qof_query_search_for',
'_search_for')
1239 Query.add_method(
'qof_query_run',
'run')
1240 Query.add_method(
'qof_query_add_term',
'add_term')
1241 Query.add_method(
'qof_query_add_boolean_match',
'add_boolean_match')
1242 Query.add_method(
'qof_query_add_guid_list_match',
'add_guid_list_match')
1243 Query.add_method(
'qof_query_add_guid_match',
'add_guid_match')
1244 Query.add_method(
'qof_query_destroy',
'destroy')
1249 QueryStringPredicate.add_constructor_and_methods_with_prefix(
1250 'qof_query_',
'string_predicate')
1255 QueryBooleanPredicate.add_constructor_and_methods_with_prefix(
1256 'qof_query_',
'boolean_predicate')
1261 QueryInt32Predicate.add_constructor_and_methods_with_prefix(
1262 'qof_query_',
'int32_predicate')
1267 QueryDatePredicate.add_constructor_and_methods_with_prefix(
1268 'qof_query_',
'date_predicate', exclude=[
"qof_query_date_predicate_get_date"])
1269 QueryDatePredicate.add_method(
'qof_query_date_predicate_get_date',
'get_date')
1274 QueryGuidPredicate.add_constructor_and_methods_with_prefix(
1275 'qof_query_',
'guid_predicate')
1280 QueryNumericPredicate.add_constructor_and_methods_with_prefix(
1281 'qof_query_',
'numeric_predicate')
gnc_numeric double_to_gnc_numeric(double n, 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 a)
Check for error signal in value.