Submit a payment from somewhere not in the GUI...

Tom Lofts dev at loftx.co.uk
Fri Nov 14 15:35:47 EST 2014


Hi Allen,

As part of some of the work I've been doing to create a REST like API 
via the Python bindings I've also been trying to make payments via the 
Python API.

I think I've managed to find out how this is intended to be done but 
can't quite get it to work.

The relevant function in the GnuCash core is I believe is 
gncOwnerApplyPayment. This isn't exposed in the Python bindings, so I 
add it to the Customer object with (I can provide an example file with 
this in, but don't have a clean version of the code at the moment):

gnucash.gnucash_business.Customer.add_method('gncOwnerApplyPayment', 
'ApplyPayment')

I also use xaccAccountGetLotList (as it's the lots parameter I'm having 
problems with)

gnucash.gnucash_core.Account.add_method('xaccAccountGetLotList', 
'GetLotList')

Then attempt to use the following (please note I've hardcoded the GUIDs 
used for the accounts:

session = gnucash.Session(arguments[0], ignore_lock=True)

invoice = session.book.InvoiceLookupByID('000001')
customer = invoice.GetOwner()

transaction = invoice.GetPostedTxn()
lot = invoice.GetPostedLot()

account_guid = gnucash.gnucash_core.GUID()
gnucash.gnucash_core.GUIDString('6ab0f12d91e944d00a2ffa0588e252e6', 
account_guid) # AR

posted_acc = account_guid.AccountLookup(session.book)

account_guid2 = gnucash.gnucash_core.GUID()
gnucash.gnucash_core.GUIDString('1886b76bb07786f2a821356d928ec461', 
account_guid2) # Liabilities: CC

xfer_acc = account_guid2.AccountLookup(session.book)

customer.ApplyPayment(transaction, posted_acc.GetLotList(), posted_acc, 
xfer_acc, invoice.GetTotal(), GncNumeric(0), 
datetime.datetime.strptime('2014-08-11', '%Y-%m-%d'), '', '', False)

Unfortunately this fails with the error:

Traceback (most recent call last):
   File "gnucash_rest.py", line 1622, in <module>
     customer.ApplyPayment(transaction, posted_acc.GetLotList(), 
posted_acc, xfer_acc, invoice.GetTotal(), GncNumeric(0), 
datetime.datetime.strptime('2014-08-11', '%Y-%m-%d'), '', '', False)
   File 
"/usr/local/lib/python2.7/dist-packages/gnucash/function_class.py", line 
91, in method_function
     *process_list_convert_to_instance(meth_func_args) )
   File 
"/usr/local/lib/python2.7/dist-packages/gnucash/gnucash_core_c.py", line 
2922, in gncOwnerApplyPayment
     return _gnucash_core_c.gncOwnerApplyPayment(*args)
TypeError: in method 'gncOwnerApplyPayment', argument 3 of type 'GList *'

I'm afraid I'm not an expert in either Python, C or SWIG, so I'm not 
sure what the problem is. I've tried a large number of values for the 
lots parameter which this is failing on which is a GList in core:

gncOwnerApplyPayment(GncOwner owner, Transaction txn, GList lots, 
Account posted_acc, Account xfer_acc, gnc_numeric amount,
         gnc_numeric exch, Timespec date, char memo,
         char num, gboolean auto_pay)

So I had assumed this would be a list of lots in Python, but nothing I 
try seems to work here.

Would anyone with experience in this area be able to lend a hand?

Thanks,

Tom

On 14/11/14 16:01, Allen S. Rout wrote:
> On 11/14/2014 10:37 AM, John Ralls wrote:
>>
>>> On Nov 14, 2014, at 5:00 AM, Allen S. Rout <asr at ufl.edu> wrote:
>>>
>>
>> Ah, from your original question it sounded like you wanted to pass
>> arguments to the command line.
>>
>> I don't know what you mean by "hooks for payments",
>
> The python includes bindings to make an invoice, make an entry, add the
> entry to the invoice, etc.   No similar collection for payments leapt
> out at my grep. :)
>
>> but it's possible
>> that the code you want is in the GUI (yeah, we know it doesn't belong
>> there) which would prevent it being exposed in bindings, or written
>> in Scheme.
>
> Understood, and I totally get your 'yeah, we know'.  I have deep
> sympathy for the fact that you're maintaining, in spare time,  a code
> base which does 'X' pretty darn well and reliably, and people like me
> are whining that it doesn't do 'Y'.
>
> At the moment it takes me an hour or so to give my club's customer base
> their monthly statements.   It takes me about another hour to carefully
> type in all their payments.  Barring those two repetitive tasks, GnuCash
> is just what the doctor ordered.
>
> I'm now thinking I'll take a shot at translating Stripe payments
> downloads into quicken format, so GnuCash can absorb them.   I'd be
> pleased to contribute that, if it's something the project would like.
>
>
> I'll pay my personal out-of-pocket money for someone to make it possible
> to tell GnuCash, at some command line, the equivalent of
>
> please export a customer report, for customer [thus], in HTML, to
> [thus].html, with all the other options defaulted.
>
> I've tilted at that three different times now, and feel like I've
> stopped making progress.
>
>
> - Allen S. Rout
>
> _______________________________________________
> gnucash-devel mailing list
> gnucash-devel at gnucash.org
> https://lists.gnucash.org/mailman/listinfo/gnucash-devel
>


More information about the gnucash-devel mailing list