def rate(self): project = Project.load(self.project) if self.invoice: invoice = Invoice.load(self.invoice) if invoice and invoice.rate: return invoice.rate if project: return project.rate return 0
def summary(self, id): c.timesheets = Timesheet.for_invoice(id) c.title = "Invoice %s" % id c.total_time = sum(t.duration for t in c.timesheets) c.total_fee = sum(t.fee for t in c.timesheets) c.invoice = Invoice.load(id) c.taxes = c.total_fee * c.invoice.tax * Decimal("0.01") c.after_taxes = c.total_fee + c.taxes return render("/invoice/invoice_summary.html")
def view(self, id): invoice = Invoice.load(id) c.invoice = invoice c.project = Project.load_or_create(invoice.project) c.timesheets = Timesheet.for_invoice(id) c.total_time = sum(t.duration for t in c.timesheets) c.total_fee = c.total_time * invoice.rate c.taxes = c.total_fee * invoice.tax * Decimal("0.01") c.after_taxes = c.total_fee + c.taxes return render("/invoice/invoice.html")
def mark_billed(self, id): """Sometimes we want to record timesheets as invoiced without creating an invoice (ie: to clear out unbilled stuff or because it was invoiced in another application. We do this by attaching those timesheets to a single invoice named 'no invoice'.""" project_name = id invoice = Invoice.load("no invoice") if not invoice: invoice = Invoice(id="no invoice") invoice.store() timesheets = Timesheet.for_project(project_name, unbilled=True) for timesheet in timesheets: timesheet.invoice = invoice.id timesheet.store() return redirect(url(controller="timesheet", action="index"))