180 lines
6.0 KiB
Python
180 lines
6.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
import os
|
|
from datetime import datetime
|
|
|
|
from trac.util.datefmt import utc
|
|
|
|
from tracbooking.model import Attendee, Event, EventAccount
|
|
from tracbooking.utils import get_option_count
|
|
|
|
|
|
def get_file():
|
|
import codecs
|
|
return codecs.open(u"/tmp/printout.txt", "wr", "utf-8")
|
|
|
|
def add_doc(global_event, selected_tz, f):
|
|
#f.write(u".. header::\n")
|
|
#f.write(u" ###Page###\n")
|
|
#f.write(u" ###Title###\n")
|
|
dt = utc.localize(datetime.utcnow()).strftime("%d.%m.%Y %H:%M")
|
|
d = u"Erstellt am: %s\n\n" % dt
|
|
f.write(d)
|
|
|
|
f.write(u"%s\n" % global_event.name)
|
|
f.write(u"%s\n\n" % ("=" * len(global_event.name)))
|
|
|
|
|
|
def create_table(items, f):
|
|
l = list()
|
|
l.append((u"Artikel", u"Einzelpreis", u"Anzahl", u"Gesamtpreis"))
|
|
for i in items:
|
|
l.append((u"%s" % i[1], u"%.2f" % float(i[2]), u"%s" % i[3], u"%.2f" % float(i[4])))
|
|
|
|
widths = list()
|
|
for cell in xrange(4):
|
|
tmp = list()
|
|
for row in l:
|
|
tmp.append(len(row[cell]))
|
|
widths.append(max(tmp))
|
|
|
|
head = list()
|
|
for ix, j in enumerate(l[0]):
|
|
head.append(u" %s " % j.ljust(widths[ix]))
|
|
trenner = [u"=%s=" % (u"=" * i)
|
|
for i in widths]
|
|
|
|
trenner = u" ".join(trenner) + "\n"
|
|
f.write(trenner)
|
|
f.write(u" ".join(head) + "\n")
|
|
f.write(trenner)
|
|
for i in l[1:]:
|
|
t = list()
|
|
for ix, j in enumerate(i):
|
|
t.append(u" " + j.ljust(widths[ix]) + " ")
|
|
f.write(u" ".join(t) + u"\n")
|
|
indent = sum(widths[:3]) + 10
|
|
f.write(u"%s %s\n" % (
|
|
" Gesamt ".center(indent),
|
|
str("%.2f" % float(sum([item[4] for item in items]))).ljust(widths[3])))
|
|
f.write(u"%s %s\n\n" % (u"=" * indent, u"=" * (widths[3] + 2)))
|
|
f.write(u"\n")
|
|
|
|
|
|
def add_summary(env, cursor, global_event, selected_tz, f):
|
|
|
|
|
|
query_old = "SELECT booking_option.ao_id,booking_available_option.name,booking_available_option.price," \
|
|
"SUM(booking_option.count),booking_available_option.price * SUM(booking_option.count)" \
|
|
"FROM booking_available_option,booking_option,option_to_event " \
|
|
"WHERE booking_available_option.ao_id = booking_option.ao_id AND " \
|
|
"booking_available_option.ao_id = option_to_event.ao_id AND " \
|
|
"option_to_event.e_id=%s GROUP BY booking_option.ao_id;"
|
|
|
|
query = "select " \
|
|
"booking_option.ao_id, " \
|
|
"booking_available_option.name, " \
|
|
"booking_available_option.price, " \
|
|
"SUM(booking_option.count), " \
|
|
"SUM(booking_option.count) * booking_available_option.price " \
|
|
"from " \
|
|
"booking_option,booking_available_option " \
|
|
"where " \
|
|
"booking_option.a_id IN (select a_id from attendee where e_id=%s) AND " \
|
|
"booking_option.ao_id = booking_available_option.ao_id " \
|
|
"group by " \
|
|
"booking_option.ao_id;"
|
|
|
|
|
|
cursor.execute(query, (global_event.e_id,))
|
|
items = cursor.fetchall()
|
|
create_table(items, f)
|
|
|
|
def add_payment_info(attendee, account, f):
|
|
txt = "Unser Konto"
|
|
f.write(u"%s\n%s\n\n" % (txt, u"-" * len(txt)))
|
|
|
|
f.write(u" :Kontoinhaber: %s\n" % account.account_owner)
|
|
f.write(u" :Kontonummer: %s\n" % account.account_no)
|
|
f.write(u" :Blz: %s\n" % account.bank_no)
|
|
f.write(u" :Bank: %s\n" % account.bank_name)
|
|
f.write(u" :Betrag: %s\n" % attendee.calculate_fee())
|
|
f.write(u" :1. Überweisungszweck: %s\n" % account.first_reason)
|
|
f.write(u" :2. Überweisungszweck: %s\n" % ("%X" % attendee.a_id).rjust(4, "0"))
|
|
f.write(u"\n")
|
|
|
|
|
|
def add_internal_attendee_data(attendee, f):
|
|
actual_amount = attendee.actual_amount and attendee.actual_amount or 0.0
|
|
f.write(u" :ID: %s\n" % ("%X" % attendee.a_id).rjust(4, "0"))
|
|
f.write(u" :Email: %s\n" % attendee.email)
|
|
f.write(u" :Soll-Betrag: %s\n" % attendee.calculate_fee())
|
|
f.write(u" :Ist-Betrag: %f\n" % actual_amount)
|
|
f.write(u" :Bezahlt: %s\n" % (u"Ja" if bool(attendee.has_paid) else u"Nein"))
|
|
f.write(u"\n")
|
|
|
|
|
|
def add_attendee(global_event, attendee, f, internal=False):
|
|
global_event.add_options(attendee.a_id)
|
|
|
|
f.write(u"%s\n" % attendee.nick.replace("_", "\_"))
|
|
f.write(u"%s\n" % ("-" * len(attendee.nick)))
|
|
|
|
if internal:
|
|
add_internal_attendee_data(attendee, f)
|
|
|
|
items = []
|
|
for option in global_event.options:
|
|
get_option_count(attendee, option)
|
|
if not option.count:
|
|
continue
|
|
|
|
items.append([option.ao_id, option.name, option.price, option.count, option.price * option.count])
|
|
|
|
if items:
|
|
create_table(items, f)
|
|
|
|
|
|
def add_attendees(env, cursor, global_event, selected_tz, f, internal=False):
|
|
|
|
attendees = Attendee.fetch_all(env, e_id=global_event.e_id, fetch_options=True)
|
|
attendees = sorted(attendees, key=lambda x: x.nick)
|
|
|
|
for attendee in attendees:
|
|
add_attendee(global_event, attendee, f, internal)
|
|
|
|
|
|
def generate_pdf(f):
|
|
import rst2pdf.createpdf
|
|
f.close()
|
|
|
|
rst2pdf.createpdf.main(["/tmp/printout.txt", "-o" , "/tmp/printout.pdf"])
|
|
os.remove("/tmp/printout.txt")
|
|
tmp = open("/tmp/printout.pdf").read()
|
|
os.remove("/tmp/printout.pdf")
|
|
return tmp
|
|
|
|
def create_report(env, e_id, selected_tz):
|
|
db = env.get_db_cnx()
|
|
cursor = db.cursor()
|
|
event = Event.fetch_one(env, e_id=e_id)
|
|
f = get_file()
|
|
add_doc(event, selected_tz, f)
|
|
|
|
add_summary(env, cursor, event, selected_tz, f)
|
|
add_attendees(env, cursor, event, selected_tz, f, True)
|
|
return generate_pdf(f)
|
|
|
|
def create_attendee_report(env, event, attendee, selected_tz):
|
|
db = env.get_db_cnx()
|
|
cursor = db.cursor()
|
|
|
|
f = get_file()
|
|
add_doc(event, selected_tz, f)
|
|
|
|
my_attendee = Attendee.fetch_one(env, a_id=attendee.a_id, e_id=event.e_id, fetch_options=True)
|
|
account = EventAccount.fetch_by_event(env, event.e_id)
|
|
add_payment_info(my_attendee, account, f)
|
|
add_attendee(event, my_attendee, f)
|
|
return generate_pdf(f)
|
|
|