#!/usr/bin/env python3 import click from tabulate import tabulate from datetime import datetime from pos.config import Config from pos.logging import init_logging, get_logger from pos.database import Database, User, Event, Product, Transaction config = Config() conf_db = config.core['DATABASE'] init_logging(config.logging) log = get_logger('cli') db = Database(**conf_db) def get_total(transaction): return sum(o.product.price * o.quantity for o in transaction.orders) def get_income(event): return sum(get_total(t) for t in event.transactions) @click.group() def cli(): pass @cli.group('user') def user(): pass def tabulate_users(users): tab = [["UID", "Username", "Enabled", "Created at"]] for u in users: tab.append([u.uid, u.username, u.is_active, u.created_at]) return tabulate(tab, headers='firstrow') @user.command('add') @click.argument('username') @click.argument('password') def user_add(username, password): user = User(username=username, password=password) with db.get_session() as session: session.add(user) print("User succesfully added.") @user.command('list') def user_list(): with db.get_session() as session: users = session.query(User).all() if users: print(tabulate_users(users)) else: print("No users found.") @cli.group('event') def event(): pass def tabulate_events(events): tab = [["UID", "Name", "Starts at", "Ends at", "Income", "Created at"]] for e in events: tab.append([e.uid, e.name, e.starts_at, e.ends_at, get_income(e), e.created_at]) return tabulate(tab, headers='firstrow') @event.command('add') @click.argument('name') @click.option('--start') @click.option('--end') def event_add(name, start, end): start = datetime.strptime(start, "%Y-%m-%d %H:%M") end = datetime.strptime(end, "%Y-%m-%d %H:%M") event = Event(name=name, starts_at=start, ends_at=end) with db.get_session() as session: session.add(event) print("Event succesfully added.") @event.command('list') def event_list(): with db.get_session() as session: events = session.query(Event).all() if events: print(tabulate_events(events)) else: print("No events found.") @cli.group('product') def product(): pass def tabulate_products(products): tab = [["UID", "Name", "Price", "Enabled", "Created at"]] for p in products: tab.append([p.uid, p.name, p.price, p.is_active, p.created_at]) return tabulate(tab, headers='firstrow') @product.command('add') @click.argument('name') @click.argument('price') def product_add(name, price): product = Product(name=name, price=price) with db.get_session() as session: session.add(product) print("Product succesfully added.") @product.command('list') def product_list(): with db.get_session() as session: products = session.query(Product).all() if products: print(tabulate_products(products)) else: print("No products found.") @cli.group('transaction') def transaction(): pass def tabulate_orders(orders): tab = [["Product", "Price", "Quantity", "Total"]] for o in orders: if o.quantity > 0: tab.append([o.product.name, o.product.price, o.quantity, o.product.price * o.quantity]) return tabulate(tab, headers='firstrow') def print_transactions(transactions): for t in transactions: print("Listing transaction #{} ({}):".format(t.uid, t.created_at)) print(tabulate_orders(t.orders)) print("Total:", get_total(t)) print() @transaction.command('list') def transaction_list(): with db.get_session() as session: transactions = session.query(Transaction).all() if transactions: print_transactions(transactions) else: print("No transactions found.") if __name__ == '__main__': cli()