def commandInvoiceAdd(args, session): dieIf(not isConfigurationValid(session), "Cannot execute invoicing commands with incomplete configuration.") invoice = Invoice() if args.client_handle: client = getClientByHandle(args.client_handle, session) else: clientId = getSetting(session, "default-client") dieIf(not clientId, "Default client is not set and no --client-handle was set.") client = session.query(Client).filter_by(id=clientId).first() dieIf(not client, "Default client not set and no --client-handle was set.") initializeClientFields(client, invoice) initializeSellerFields(session, invoice) # Date if args.date: date = parseDate(args.date) else: date = datetime.now() invoice.date = date if args.duedate: duedate = parseDate(args.duedate) elif args.duedays: duedate = date + timedelta(days=int(args.duedays)) else: duedays = getSetting(session, "default-due-days") dieIf(not duedays, "Due date not specified and no default-due-days.") duedate = date + timedelta(days=int(duedays)) invoice.due_date = duedate # Invoice number if args.invoice_number: invoice.invoice_number = args.invoice_number else: invoice.invoice_number = getNextInvoiceNumberAndIncrement(session) # Reference invoice.reference = getReference(invoice.invoice_number, invoice.client_number) invoice.time_added = datetime.now() session.add(invoice) session.commit() if args.json: _jsonPrintInvoice(invoice) else: print("Invoice created with number " + str(invoice.invoice_number) + ".")
def commandCompositeAdd(args, session): invoice = beginRowCommand(args, session) row = CompositeRow() row.index = getNextRowIndex(invoice) row.invoice = invoice row.title = args.title if args.vat: row.vat = args.vat else: row.vat = getSetting(session, 'default-vat') dieIf(not row.vat, "default-vat is not set and no VAT was provided.") if args.note: row.note = args.note if args.external_source: row.external_source = args.external_source if args.external_id: row.external_id = args.external_id if args.external_source and args.external_id: query = (session.query(Row) .filter_by(external_source=args.external_source) .filter_by(external_id=args.external_id)) dieIf(query.first(), 'External id already exists.') session.add(row) session.commit() if args.json: jsonPrintRow(row) else: print("Added row '" + str(row.index) + "'.")
def commandInvoiceGenerate(args, session): if args.template: template = args.template else: template = getSetting(session, "default-invoice-template") lokki_dir = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) template = lokki_dir + "/" + template dieIf(not template, "No --template provided and default-invoice-template not set.") invoice = findInvoice(session, args) templateArguments = _getTemplateArguments(invoice) templateArguments["show_details"] = not args.hide_details and len(templateArguments["composite_rows"]) with open(template, "r") as template: templateString = template.read() renderedInvoice = pystache.render(templateString, templateArguments) if args.filename: targetPath = args.filename else: targetFilenameTemplate = getSetting(session, "invoice-filename-template") targetPath = pystache.render(targetFilenameTemplate, templateArguments) targetPath = os.path.normpath(targetPath) templateArguments["output_path"] = targetPath templateArguments["output_basename"] = os.path.basename(targetPath) (templateArguments["output_path_no_ext"], templateArguments["output_path_ext"]) = os.path.splitext(targetPath) with open(targetPath, "w") as output: output.write(renderedInvoice) triggerEvent(session, "generate", templateArguments)