summaryrefslogtreecommitdiffstats
path: root/office/gnucash/missing-py/gnucash_business.py
diff options
context:
space:
mode:
Diffstat (limited to 'office/gnucash/missing-py/gnucash_business.py')
-rw-r--r--office/gnucash/missing-py/gnucash_business.py370
1 files changed, 370 insertions, 0 deletions
diff --git a/office/gnucash/missing-py/gnucash_business.py b/office/gnucash/missing-py/gnucash_business.py
new file mode 100644
index 0000000000..a64162a74c
--- /dev/null
+++ b/office/gnucash/missing-py/gnucash_business.py
@@ -0,0 +1,370 @@
+# gnucash_business.py -- High level python wrapper classes for the business
+# parts of GnuCash
+#
+# Copyright (C) 2008,2010 ParIT Worker Co-operative <paritinfo@parit.ca>
+# 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
+#
+# @author Mark Jenkins, ParIT Worker Co-operative <mark@parit.ca>
+# @author Jeff Green, ParIT Worker Co-operative <jeff@parit.ca>
+## @file
+# @brief High level python wrapper classes for the business parts of GnuCash
+# @author Mark Jenkins, ParIT Worker Co-operative <mark@parit.ca>
+# @author Jeff Green, ParIT Worker Co-operative <jeff@parit.ca>
+# @ingroup python_bindings
+
+import gnucash_core_c
+
+from function_class import \
+ ClassFromFunctions, extract_attributes_with_prefix, \
+ default_arguments_decorator, method_function_returns_instance, \
+ methods_return_instance, methods_return_instance_lists
+
+from gnucash_core import \
+ GnuCashCoreClass, GncNumeric, GncCommodity, Transaction, \
+ Split, Book, GncLot, Account
+
+from gnucash_core_c import GNC_OWNER_CUSTOMER, GNC_OWNER_JOB, \
+ GNC_OWNER_EMPLOYEE, GNC_OWNER_VENDOR, \
+ GNC_PAYMENT_CASH, GNC_PAYMENT_CARD, \
+ GNC_DISC_PRETAX, GNC_DISC_SAMETIME, GNC_DISC_POSTTAX, \
+ GNC_TAXINCLUDED_YES, GNC_TAXINCLUDED_NO, GNC_TAXINCLUDED_USEGLOBAL, \
+ GNC_AMT_TYPE_VALUE, GNC_AMT_TYPE_PERCENT, GNC_ID_INVOICE
+
+import datetime
+
+class GnuCashBusinessEntity(GnuCashCoreClass):
+ def __init__(self, book=None, id=None, currency=None, name=None,
+ instance=None):
+ if instance == None:
+ if book==None or id==None or currency==None:
+ raise Exception(
+ "you must call GnuCashBusinessEntity.__init__ "
+ "with either a book, id, and currency, or an existing "
+ "low level swig proxy in the argument instance")
+ GnuCashCoreClass.__init__(self, book)
+ self.BeginEdit()
+ self.SetID(id)
+ self.SetCurrency(currency)
+ if name != None:
+ self.SetName(name)
+ self.CommitEdit()
+ else:
+ GnuCashCoreClass.__init__(self, instance=instance)
+
+class Customer(GnuCashBusinessEntity): pass
+
+class Employee(GnuCashBusinessEntity): pass
+
+class Vendor(GnuCashBusinessEntity): pass
+
+class Job(GnuCashBusinessEntity):
+ # override the superclass constructor, as Job doesn't require
+ # a currency but it does require an owner
+ def __init__(self, book=None, id=None, owner=None, name=None,
+ instance=None):
+ if instance == None:
+ if book==None or id==None or owner==None:
+ raise Exception(
+ "you must call Job.__init__ "
+ "with either a book, id, and owner or an existing "
+ "low level swig proxy in the argument instance")
+ GnuCashCoreClass.__init__(self, book)
+ self.SetID(id)
+ self.SetOwner(owner)
+ if name != None:
+ self.SetName(name)
+ else:
+ GnuCashCoreClass.__init__(self, instance=instance)
+
+class Address(GnuCashCoreClass): pass
+
+class BillTerm(GnuCashCoreClass): pass
+
+class TaxTable(GnuCashCoreClass):
+ def __init__(self, book=None, name=None, first_entry=None, instance=None):
+ if instance == None:
+ if book==None or name==None or first_entry==None:
+ raise Exception(
+ "you must call TaxTable.__init__ with either a "
+ "book, name, and first_entry, or an existing "
+ "low level swig proxy in the argument instance")
+ GnuCashCoreClass.__init__(self, book)
+ self.SetName(name)
+ self.AddEntry(first_entry)
+ else:
+ GnuCashCoreClass.__init__(self, instance=instance)
+
+class TaxTableEntry(GnuCashCoreClass):
+ def __init__(self, account=None, percent=True, amount=None, instance=None):
+ """TaxTableEntry constructor
+
+ You must provide an account, or be initizing this with an existing
+ swig proxy object via the instance keyword argument.
+
+ You may also optionally set the percent keyword argument to False to get
+ a fixed value instead of percentage based tax (which is the default, or
+ when percent=True).
+
+ The tax will be zero percent or zero unless you set the amount keyword
+ argument to a GncNumeric value as well.
+ """
+
+ if instance == None:
+ if account==None:
+ raise Exception(
+ "you must call TaxTableEntry.__init__ with either a "
+ "account or an existing "
+ "low level swig proxy in the argument instance")
+ GnuCashCoreClass.__init__(self)
+ self.SetAccount(account)
+ if percent:
+ self.SetType(GNC_AMT_TYPE_PERCENT)
+ else:
+ self.SetType(GNC_AMT_TYPE_VALUE)
+ if amount != None:
+ self.SetAmount(amount)
+ else:
+ GnuCashCoreClass.__init__(self, instance=instance)
+
+class Invoice(GnuCashCoreClass):
+ def __init__(self, book=None, id=None, currency=None, owner=None,
+ date_opened=None, instance=None):
+ """Invoice Contstructor
+
+ You must provide a book, id, currency and owner
+ (Customer, Job, Employee, Vendor) or an existing swig proxy object
+ in the keyword argument instance.
+
+ Optionally, you may provide a date the invoice is opened on
+ (datetime.date or datetime.datetime), otherwise today's date is used.
+ """
+ if instance == None:
+ if book==None or id==None or currency==None or owner==None:
+ raise Exception(
+ "you must call Invoice.__init__ "
+ "with either a book, id, currency and owner, or an existing"
+ "low level swig proxy in the argument instance")
+ GnuCashCoreClass.__init__(self, book)
+ self.BeginEdit()
+ self.SetID(id)
+ self.SetCurrency(currency)
+ self.SetOwner(owner)
+ if date_opened == None:
+ date_opened = datetime.date.today()
+ self.SetDateOpened(date_opened)
+ self.CommitEdit()
+ else:
+ GnuCashCoreClass.__init__(self, instance=instance)
+
+class Bill(Invoice):
+ pass
+
+def decorate_to_return_instance_instead_of_owner(dec_function):
+ def new_get_owner_function(self):
+ (owner_type, instance) = dec_function(self)
+ if owner_type == GNC_OWNER_CUSTOMER:
+ return Customer(instance=instance)
+ elif owner_type == GNC_OWNER_JOB:
+ return Job(instance=instance)
+ elif owner_type == GNC_OWNER_EMPLOYEE:
+ return Employee(instance=instance)
+ elif owner_type == GNC_OWNER_VENDOR:
+ return Vendor(instance=instance)
+ else:
+ return None
+ return new_get_owner_function
+
+class Entry(GnuCashCoreClass):
+ def __init__(self, book=None, invoice=None, date=None, instance=None):
+ """Invoice Entry constructor
+
+ You must provide a book or be initizing this with an existing
+ swig proxy object via the instance keyword argument.
+
+ The optional invoice argument can be set to a Bill or Invoice
+ that you would like to associate the entry with. You might as well
+ assign one now, as an Entry can't exist without one, but you can
+ always use Invoice.AddEntry or Bill.AddEntry later on.
+
+ By default, the entry will be set to today's date unless you
+ override with the date argument.
+ """
+ if instance == None:
+ if book==None:
+ raise Exception(
+ "you must call Entry.__init__ with either a "
+ "book or an existing "
+ "low level swig proxy in the argument instance")
+ GnuCashCoreClass.__init__(self, book)
+
+ if date == None:
+ date = datetime.date.today()
+ self.SetDate(date)
+ if invoice != None:
+ invoice.AddEntry(self)
+ else:
+
+ GnuCashCoreClass.__init__(self, instance=instance)
+
+ def test_type(self, invoice):
+ if invoice.GetTypeString() == "Invoice" and self.GetInvoice() == None:
+ raise Exception("Entry type error. Check that Entry type matches Invoice.")
+ if invoice.GetTypeString() == "Bill" and self.GetBill() == None:
+ raise Exception("Entry type error. Check that Entry type matches Bill.")
+
+
+# Owner
+GnuCashBusinessEntity.add_methods_with_prefix('gncOwner')
+
+owner_dict = {
+ 'GetCustomer' : Customer,
+ 'GetVendor' : Vendor,
+ 'GetEmployee' : Employee,
+ 'GetJob' : Job,
+ 'GetAddr' : Address,
+ 'GetCurrency' : GncCommodity,
+ 'GetEndOwner': GnuCashBusinessEntity,
+ 'GetBalanceInCurrency': GncNumeric,
+ }
+methods_return_instance(GnuCashBusinessEntity, owner_dict)
+
+methods_return_instance_lists(
+ GnuCashBusinessEntity, {
+ 'GetCommoditiesList': GncCommodity
+ })
+
+# Customer
+Customer.add_constructor_and_methods_with_prefix('gncCustomer', 'Create')
+
+customer_dict = {
+ 'GetAddr' : Address,
+ 'GetShipAddr' : Address,
+ 'GetDiscount' : GncNumeric,
+ 'GetCredit' : GncNumeric,
+ 'GetTerms' : BillTerm,
+ 'GetCurrency' : GncCommodity,
+ 'GetTaxTable': TaxTable,
+ }
+methods_return_instance(Customer, customer_dict)
+
+# Employee
+Employee.add_constructor_and_methods_with_prefix('gncEmployee', 'Create')
+
+employee_dict = {
+ 'GetBook' : Book,
+ 'GetAddr' : Address,
+ 'GetWorkday' : GncNumeric,
+ 'GetRate' : GncNumeric,
+ 'GetCurrency' : GncCommodity
+ }
+methods_return_instance(Employee, employee_dict)
+
+# Vendor
+Vendor.add_constructor_and_methods_with_prefix('gncVendor', 'Create')
+
+vendor_dict = {
+ 'GetAddr' : Address,
+ 'GetTerms' : BillTerm,
+ 'GetCurrency' : GncCommodity,
+ 'GetTaxTable': TaxTable,
+ }
+methods_return_instance(Vendor, vendor_dict)
+
+# Job
+Job.add_constructor_and_methods_with_prefix('gncJob', 'Create')
+Job.decorate_functions(
+ decorate_to_return_instance_instead_of_owner,
+ 'GetOwner')
+
+# Address
+Address.add_constructor_and_methods_with_prefix('gncAddress', 'Create')
+
+# BillTerm
+BillTerm.add_constructor_and_methods_with_prefix('gncBillTerm', 'Create')
+
+billterm_dict = {
+ 'LookupByName' : BillTerm,
+ 'GetDiscount' : GncNumeric,
+ 'GetParent' : BillTerm,
+ 'ReturnChild' : BillTerm
+ }
+methods_return_instance(BillTerm, billterm_dict)
+
+# TaxTable
+TaxTable.add_constructor_and_methods_with_prefix('gncTaxTable', 'Create')
+
+taxtable_dict = {
+ 'GetParent': TaxTable,
+ }
+methods_return_instance(TaxTable, taxtable_dict)
+
+# TaxTableEntry
+TaxTableEntry.add_constructor_and_methods_with_prefix(
+ 'gncTaxTableEntry', 'Create')
+
+taxtableentry_dict = {
+ 'GetAccount': Account,
+ 'GetAmount': GncNumeric,
+ }
+
+# Invoice
+Invoice.add_constructor_and_methods_with_prefix('gncInvoice', 'Create')
+methods_return_instance_lists(
+ Invoice, { 'GetEntries': Entry })
+
+# Bill
+Bill.add_methods_with_prefix('gncBill')
+
+invoice_dict = {
+ 'GetTerms': BillTerm,
+ 'GetCurrency': GncCommodity,
+ 'GetToChargeAmount': GncNumeric,
+ 'GetPostedLot': GncLot,
+ 'GetPostedTxn': Transaction,
+ 'GetPostedAcc': Account,
+ 'GetTotal': GncNumeric,
+ 'GetTotalOf': GncNumeric,
+ 'GetTotalSubtotal': GncNumeric,
+ 'GetTotalTax': GncNumeric,
+ 'PostToAccount': Transaction,
+ 'GetBook': Book,
+ }
+methods_return_instance(Invoice, invoice_dict)
+Invoice.decorate_functions(
+ decorate_to_return_instance_instead_of_owner,
+ 'GetOwner', 'GetBillTo')
+
+# Entry
+Entry.add_constructor_and_methods_with_prefix('gncEntry', 'Create')
+
+entry_dict = {
+ 'GetQuantity': GncNumeric,
+ 'GetInvAccount': Account,
+ 'GetInvPrice': GncNumeric,
+ 'GetInvDiscount': GncNumeric,
+ 'GetInvTaxTable': TaxTable,
+ 'GetBillAccount': Account,
+ 'GetBillPrice': GncNumeric,
+ 'GetBillTaxTable': TaxTable,
+ 'Copy': Entry,
+ 'GetInvoice': Invoice,
+ 'GetBill': Invoice
+ }
+methods_return_instance(Entry, entry_dict)
+Entry.decorate_functions(
+ decorate_to_return_instance_instead_of_owner,
+ 'GetBillTo' )