GnuCash c935c2f+
Loading...
Searching...
No Matches
Data Structures | Functions
gncinvoice_jinja.py File Reference

exports an invoice from gnucash using a template file, see Python invoice export More...

Go to the source code of this file.

Data Structures

class  gncinvoice_jinja.Usage
 

Functions

 gncinvoice_jinja.main (argv=None)
 

Detailed Description

exports an invoice from gnucash using a template file, see Python invoice export

Author
Christoph Holtermann (c.holtermann (at) gmx.de)
Date
2014-2018

Input is a template file that will be filled with information from gnucash Invoices. Jinja2 templating engine is being used for this. Templates can be Latex, Html or anything.

Example templates for german invoices:

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:

Questions / Issues:

Definition in file gncinvoice_jinja.py.

Function Documentation

◆ main()

gncinvoice_jinja.main (   argv = None)

Definition at line 54 of file gncinvoice_jinja.py.

54def main(argv=None):
55 if argv is None:
56 argv = sys.argv
57 try:
58 # default values
59 prog_name = argv[0]
60 ignore_lock = True
61 filename_template = None
62 filename_output = None
63 no_output = False
64 list_invoices = False
65 invoice_number = None
66 invoice_id = None
67 filename_from_invoice = False
68 output_path = None
69 with_ipshell = False
70
71 try:
72 opts, args = getopt.getopt(argv[1:], "fhliI:t:o:OP:", ["help"])
73 except getopt.error as msg:
74 raise Usage(msg)
75
76 for opt in opts:
77 if opt[0] in ["-f"]:
78 print("ignoring lock")
79 ignore_lock = True
80 if opt[0] in ["-h", "--help"]:
81 raise Usage("Help:")
82 if opt[0] in ["-I"]:
83 invoice_id = opt[1]
84 print("using invoice ID '" + str(invoice_id) + "'.")
85 if opt[0] in ["-i"]:
86 print("Using ipshell")
87 with_ipshell = True
88 if opt[0] in ["-o"]:
89 filename_output = opt[1]
90 print("using output file", filename_output)
91 if opt[0] in ["-O"]:
92 if filename_output:
93 print("given output filename will be overwritten,")
94 print("creating output filename from Invoice data.")
95 filename_from_invoice = True
96 if opt[0] in ["-t"]:
97 filename_template = opt[1]
98 print("using template file", filename_template)
99 if opt[0] in ["-l"]:
100 list_invoices = True
101 print("listing invoices")
102 if opt[0] in ["-P"]:
103 output_path = opt[1]
104 print("output path is", output_path + ".")
105
106 # Check for correct input
107 if len(args) > 1:
108 print("opts:", opts, "args:", args)
109 raise Usage("Only one input possible !")
110 if len(args) == 0:
111 raise Usage("No input given !")
112 input_url = args[0]
113
114 # Check for correct template
115 if not filename_template:
116 no_output = True
117 if not list_invoices:
118 raise Usage("No template given !")
119
120 # Check for output file
121 if not (filename_output or filename_from_invoice):
122 if filename_template:
123 filename_output = filename_template + ".out"
124 print("no output filename given, will be:", filename_output)
125
126 except Usage as err:
127 if err.msg == "Help:":
128 retcode = 0
129 else:
130 print("Error:", err.msg, file=sys.stderr)
131 print("for help use --help", file=sys.stderr)
132 retcode = 2
133
134 print()
135 print("Usage:")
136 print()
137 print("Invoke with", prog_name, "gnucash_url.")
138 print("where input is")
139 print(" filename")
140 print("or file://filename")
141 print("or mysql://user:password@host/databasename")
142 print()
143 print("-f force open = ignore lock (read only)")
144 print("-l list all invoices")
145 print("-h or --help for this help")
146 print("-I ID use invoice ID")
147 print("-t filename use filename as template file")
148 print("-o filename use filename as output file")
149 print("-O create output filename by date, owner and invoice number")
150 print("-P path path for output file. Overwrites path in -o option")
151
152 return retcode
153
154 # Try to open the given input
155 try:
156 print(
157 "Opening", input_url, " (ignore-lock = read-only)." if ignore_lock else "."
158 )
159 session = gnucash.Session(
160 input_url,
161 SessionOpenMode.SESSION_READ_ONLY
162 if ignore_lock
163 else SessionOpenMode.SESSION_NORMAL_OPEN,
164 )
165 except Exception as exception:
166 print("Problem opening input.")
167 print(exception)
168 return 2
169
170 book = session.book
171 root_account = book.get_root_account()
172 comm_table = book.get_table()
173 EUR = comm_table.lookup("CURRENCY", "EUR")
174
175 invoice_list = get_all_invoices(book)
176
177 if list_invoices:
178 for number, invoice in enumerate(invoice_list):
179 print(str(number) + ")")
180 print(invoice)
181
182 if not (no_output):
183
184 if invoice_id:
185 invoice = book.InvoiceLookupByID(invoice_id)
186 if not invoice:
187 print("ID not found.")
188 return 2
189
190 if invoice_number:
191 invoice = invoice_list[invoice_number]
192
193 print("Using the following invoice:")
194 print(invoice)
195
196 path_template = os.path.dirname(filename_template)
197 filename_template_basename = os.path.basename(filename_template)
198
199 loader = jinja2.FileSystemLoader(path_template)
200 env = jinja2.Environment(loader=loader)
201 template = env.get_template(filename_template_basename)
202
203 # company = gnucash_business.Company(book.instance)
204
205 output = template.render(invoice=invoice, locale=locale) # , company=company)
206
207 if filename_from_invoice:
208 filename_date = invoice.GetDatePosted().strftime(
209 "%Y-%m-%d"
210 ) # something like 2014-11-01
211 filename_owner_name = str(invoice.GetOwner().GetName())
212 filename_invoice_id = str(invoice.GetID())
213 filename_output = (
214 filename_date
215 + "_"
216 + filename_owner_name
217 + "_"
218 + filename_invoice_id
219 + ".tex"
220 )
221
222 if output_path:
223 filename_output = os.path.join(
224 output_path, os.path.basename(filename_output)
225 )
226
227 print("Writing output", filename_output, ".")
228 with open(filename_output, "w") as f:
229 f.write(output)
230
231 if with_ipshell:
232 import IPython
233
234 IPython.embed()
235
236