mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
It is split into - /libgnucash (for the non-gui bits) - /gnucash (for the gui) - /common (misc source files used by both) - /bindings (currently only holds python bindings) This is the first step in restructuring the code. It will need much more fine tuning later on.
183 lines
5.4 KiB
Python
183 lines
5.4 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
##@file
|
|
# @brief exports an invoice from gnucash using a template file, see \ref py_invoice_export
|
|
# @ingroup python_bindings_examples
|
|
# @author Christoph Holtermann (c.holtermann (at) gmx.de)
|
|
# @date 2014-11
|
|
#
|
|
# @details
|
|
# Input is a template file that will be filled with information from
|
|
# gnucash Invoices. Jinja2 templating engine ist used. Templates can
|
|
# be Latex, Html or anything.
|
|
#
|
|
# Example templates for german invoices:
|
|
# - Invoice.tex.tmpl
|
|
# - Invoice_2.tex.tmpl
|
|
#
|
|
# This is a sequel to latex_invoices.py that exported to a lco file
|
|
# to be imported into a LaTeX letter.
|
|
# The approach used here is not as dependent on external files and
|
|
# more modular as it allows to use arbitrary templates
|
|
#
|
|
# Doxygen docs:
|
|
# - http://svn.gnucash.org/docs/HEAD/
|
|
# - see page \ref py_invoice_export
|
|
#
|
|
# Questions / Issues:
|
|
# - How much logic in the template, how much preprocessing in this file ?
|
|
# - Internationalization - currencies, formatting of numbers
|
|
# - Providing data of gnucash owner
|
|
|
|
try:
|
|
import locale
|
|
import sys
|
|
import getopt
|
|
import gnucash
|
|
import str_methods
|
|
import jinja2
|
|
from gncinvoicefkt import *
|
|
except ImportError as import_error:
|
|
print "Problem importing modules."
|
|
print import_error
|
|
sys.exit(2)
|
|
|
|
class Usage(Exception):
|
|
def __init__(self, msg):
|
|
self.msg = msg
|
|
|
|
def main(argv=None):
|
|
if argv is None:
|
|
argv = sys.argv
|
|
try:
|
|
# default values
|
|
prog_name = argv[0]
|
|
ignore_lock = True
|
|
filename_template = None
|
|
filename_output = None
|
|
no_output = False
|
|
list_invoices = False
|
|
invoice_number = None
|
|
invoice_id = None
|
|
|
|
try:
|
|
opts, args = getopt.getopt(argv[1:], "fhlI:t:o:", ["help"])
|
|
except getopt.error, msg:
|
|
raise Usage(msg)
|
|
|
|
for opt in opts:
|
|
if opt[0] in ["-f"]:
|
|
print "ignoring lock"
|
|
ignore_lock = True
|
|
if opt[0] in ["-h","--help"]:
|
|
raise Usage("Help:")
|
|
if opt[0] in ["-I"]:
|
|
invoice_id = opt[1]
|
|
print "using invoice ID '" + str(invoice_id) + "'."
|
|
if opt[0] in ["-o"]:
|
|
filename_output = opt[1]
|
|
print "using output file", filename_output
|
|
if opt[0] in ["-t"]:
|
|
filename_template = opt[1]
|
|
print "using template file", filename_template
|
|
if opt[0] in ["-l"]:
|
|
list_invoices = True
|
|
print "listing invoices"
|
|
|
|
# Check for correct input
|
|
if len(args)>1:
|
|
print "opts:",opts,"args:",args
|
|
raise Usage("Only one input possible !")
|
|
if len(args)==0:
|
|
raise Usage("No input given !")
|
|
input_url = args[0]
|
|
|
|
# Check for correct template
|
|
if not filename_template:
|
|
no_output = True
|
|
if not list_invoices:
|
|
raise Usage("No template given !")
|
|
|
|
# Check for output file
|
|
if not filename_output:
|
|
if filename_template:
|
|
filename_output = filename_template + ".out"
|
|
print "no output filename given, will be:", filename_output
|
|
|
|
except Usage, err:
|
|
if err.msg == "Help:":
|
|
retcode=0
|
|
else:
|
|
print >>sys.stderr, "Error:",err.msg
|
|
print >>sys.stderr, "for help use --help"
|
|
retcode=2
|
|
|
|
print
|
|
print "Usage:"
|
|
print
|
|
print "Invoke with",prog_name,"gnucash_url."
|
|
print "where input is"
|
|
print " filename"
|
|
print "or file://filename"
|
|
print "or mysql://user:password@host/databasename"
|
|
print
|
|
print "-f force open = ignore lock"
|
|
print "-l list all invoices"
|
|
print "-h or --help for this help"
|
|
print "-I ID use invoice ID"
|
|
print "-t filename use filename as template file"
|
|
print "-o filename use filename as output file"
|
|
|
|
return retcode
|
|
|
|
# Try to open the given input
|
|
try:
|
|
print "Opening", input_url, "."
|
|
session = gnucash.Session(input_url, ignore_lock=ignore_lock)
|
|
except Exception as exception:
|
|
print "Problem opening input."
|
|
print exception
|
|
return 2
|
|
|
|
book = session.book
|
|
root_account = book.get_root_account()
|
|
comm_table = book.get_table()
|
|
EUR = comm_table.lookup("CURRENCY", "EUR")
|
|
|
|
invoice_list = get_all_invoices(book)
|
|
|
|
if list_invoices:
|
|
for number,invoice in enumerate(invoice_list):
|
|
print str(number)+")"
|
|
print invoice
|
|
|
|
if not (no_output):
|
|
|
|
if invoice_id:
|
|
invoice = book.InvoiceLookupByID(invoice_id)
|
|
if not invoice:
|
|
print "ID not found."
|
|
return 2
|
|
|
|
if invoice_number:
|
|
invoice = invoice_list[invoice_number]
|
|
|
|
print "Using the following invoice:"
|
|
print invoice
|
|
|
|
loader = jinja2.FileSystemLoader('.')
|
|
env = jinja2.Environment(loader=loader)
|
|
template = env.get_template(filename_template)
|
|
|
|
#import IPython
|
|
#IPython.embed()
|
|
output = template.render(invoice=invoice, locale=locale)
|
|
|
|
print "Writing output", filename_output, "."
|
|
with open(filename_output, 'w') as f:
|
|
f.write(output.encode('utf-8'))
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|