From ea2bfb1c0c7a3a24e56d035e0f33c8592258223f Mon Sep 17 00:00:00 2001 From: tanshu Date: Wed, 17 Mar 2021 09:39:56 +0530 Subject: [PATCH] Chore: Moved individual models into their own files. Chore: Updated dependencies. --- barker/alembic/env.py | 3 +- .../versions/8c06ac60d125_initial_commit.py | 9 +- barker/barker/core/security.py | 4 +- barker/barker/db/base.py | 70 ++- barker/barker/db/init_db.py | 16 +- barker/barker/models/auth.py | 166 ------- barker/barker/models/customer.py | 30 ++ barker/barker/models/db_setting.py | 20 + barker/barker/models/device.py | 41 ++ barker/barker/models/food_table.py | 41 ++ barker/barker/models/guest_book.py | 30 ++ barker/barker/models/inventory.py | 96 ++++ barker/barker/models/inventory_modifier.py | 26 + barker/barker/models/kot.py | 49 ++ barker/barker/models/login_history.py | 29 ++ barker/barker/models/master.py | 460 ------------------ barker/barker/models/menu_category.py | 25 + barker/barker/models/modifier.py | 42 ++ .../models/modifier_categories_products.py | 20 + barker/barker/models/modifier_category.py | 34 ++ barker/barker/models/overview.py | 40 ++ barker/barker/models/permission.py | 22 + barker/barker/models/printer.py | 22 + barker/barker/models/product.py | 24 + barker/barker/models/product_version.py | 109 +++++ barker/barker/models/reporting_level.py | 7 + barker/barker/models/reprint.py | 33 ++ barker/barker/models/role.py | 18 + barker/barker/models/role_permissions.py | 20 + barker/barker/models/sale_category.py | 24 + barker/barker/models/section.py | 24 + barker/barker/models/section_printer.py | 37 ++ barker/barker/models/settle_option.py | 40 ++ barker/barker/models/settlement.py | 32 ++ barker/barker/models/tax.py | 22 + barker/barker/models/user.py | 59 +++ barker/barker/models/user_roles.py | 15 + barker/barker/models/voucher.py | 258 +--------- barker/barker/models/voucher_type.py | 9 + barker/barker/printing/bill.py | 15 +- barker/barker/printing/cashier_report.py | 5 +- barker/barker/printing/discount_report.py | 5 +- barker/barker/printing/kot.py | 8 +- barker/barker/printing/sale_report.py | 5 +- barker/barker/routers/customer.py | 2 +- barker/barker/routers/device.py | 3 +- barker/barker/routers/guest_book.py | 4 +- barker/barker/routers/header_footer.py | 2 +- barker/barker/routers/login.py | 2 +- barker/barker/routers/menu_category.py | 3 +- barker/barker/routers/modifier.py | 2 +- barker/barker/routers/modifier_category.py | 5 +- barker/barker/routers/printer.py | 2 +- barker/barker/routers/product.py | 5 +- .../routers/reports/beer_sale_report.py | 7 +- .../routers/reports/bill_settlement_report.py | 7 +- .../barker/routers/reports/cashier_report.py | 7 +- .../barker/routers/reports/discount_report.py | 8 +- .../routers/reports/product_sale_report.py | 9 +- .../routers/reports/product_updates_report.py | 3 +- barker/barker/routers/reports/sale_report.py | 10 +- barker/barker/routers/reports/tax_report.py | 7 +- barker/barker/routers/role.py | 3 +- barker/barker/routers/sale_category.py | 2 +- barker/barker/routers/section.py | 2 +- barker/barker/routers/section_printer.py | 3 +- barker/barker/routers/setting.py | 2 +- barker/barker/routers/settle_option.py | 4 +- barker/barker/routers/table.py | 4 +- barker/barker/routers/tax.py | 5 +- .../barker/routers/update_product_prices.py | 3 +- barker/barker/routers/user.py | 3 +- barker/barker/routers/voucher/__init__.py | 8 +- barker/barker/routers/voucher/change.py | 7 +- barker/barker/routers/voucher/merge_move.py | 7 +- .../barker/routers/voucher/receive_payment.py | 6 +- barker/barker/routers/voucher/save.py | 9 +- barker/barker/routers/voucher/show.py | 8 +- barker/barker/routers/voucher/split.py | 9 +- barker/barker/routers/voucher/update.py | 8 +- barker/barker/routers/voucher/void.py | 6 +- barker/barker/schemas/settle_option.py | 3 +- barker/barker/subscribers.py | 2 +- barker/pyproject.toml | 17 +- barker/worker-start.sh | 0 bookie/.editorconfig | 3 + bookie/.eslintrc.json | 29 +- bookie/package.json | 67 ++- deploy.sh | 2 +- 89 files changed, 1306 insertions(+), 1068 deletions(-) delete mode 100644 barker/barker/models/auth.py create mode 100644 barker/barker/models/customer.py create mode 100644 barker/barker/models/db_setting.py create mode 100644 barker/barker/models/device.py create mode 100644 barker/barker/models/food_table.py create mode 100644 barker/barker/models/guest_book.py create mode 100644 barker/barker/models/inventory.py create mode 100644 barker/barker/models/inventory_modifier.py create mode 100644 barker/barker/models/kot.py create mode 100644 barker/barker/models/login_history.py delete mode 100644 barker/barker/models/master.py create mode 100644 barker/barker/models/menu_category.py create mode 100644 barker/barker/models/modifier.py create mode 100644 barker/barker/models/modifier_categories_products.py create mode 100644 barker/barker/models/modifier_category.py create mode 100644 barker/barker/models/overview.py create mode 100644 barker/barker/models/permission.py create mode 100644 barker/barker/models/printer.py create mode 100644 barker/barker/models/product.py create mode 100644 barker/barker/models/product_version.py create mode 100644 barker/barker/models/reporting_level.py create mode 100644 barker/barker/models/reprint.py create mode 100644 barker/barker/models/role.py create mode 100644 barker/barker/models/role_permissions.py create mode 100644 barker/barker/models/sale_category.py create mode 100644 barker/barker/models/section.py create mode 100644 barker/barker/models/section_printer.py create mode 100644 barker/barker/models/settle_option.py create mode 100644 barker/barker/models/settlement.py create mode 100644 barker/barker/models/tax.py create mode 100644 barker/barker/models/user.py create mode 100644 barker/barker/models/user_roles.py create mode 100644 barker/barker/models/voucher_type.py mode change 100644 => 100755 barker/worker-start.sh diff --git a/barker/alembic/env.py b/barker/alembic/env.py index 93657a9..00ba73e 100644 --- a/barker/alembic/env.py +++ b/barker/alembic/env.py @@ -2,6 +2,7 @@ import logging from alembic import context from barker.core.config import settings +from barker.models.user import User from sqlalchemy import create_engine, pool @@ -12,8 +13,6 @@ logging.getLogger("alembic").setLevel(settings.ALEMBIC_LOG_LEVEL) # Interpret the config file for Python logging. # This line sets up loggers basically. -from barker.models.auth import User # noqa - target_metadata = User.metadata diff --git a/barker/alembic/versions/8c06ac60d125_initial_commit.py b/barker/alembic/versions/8c06ac60d125_initial_commit.py index 67602e0..3942a01 100644 --- a/barker/alembic/versions/8c06ac60d125_initial_commit.py +++ b/barker/alembic/versions/8c06ac60d125_initial_commit.py @@ -8,8 +8,12 @@ Create Date: 2020-06-04 08:14:34.132248 import sqlalchemy as sa from alembic import op -from barker.models.auth import Permission, User # noqa -from barker.models.master import Customer, DbSetting, ModifierCategory, Section +from barker.models.customer import Customer +from barker.models.db_setting import DbSetting +from barker.models.modifier_category import ModifierCategory +from barker.models.permission import Permission +from barker.models.section import Section +from barker.models.user import User # noqa: F401 from sqlalchemy import column, table from sqlalchemy.dialects import postgresql @@ -129,7 +133,6 @@ def upgrade(): sa.Column("address", sa.Unicode(length=255), nullable=False), sa.Column("cut_code", sa.Unicode(length=255), nullable=False), sa.PrimaryKeyConstraint("id", name=op.f("pk_printers")), - sa.UniqueConstraint("address", name=op.f("uq_printers_address")), sa.UniqueConstraint("name", name=op.f("uq_printers_name")), ) op.create_table( diff --git a/barker/barker/core/security.py b/barker/barker/core/security.py index 1e80976..313e708 100644 --- a/barker/barker/core/security.py +++ b/barker/barker/core/security.py @@ -13,8 +13,8 @@ from sqlalchemy.orm import Session from ..core.config import settings from ..db.session import SessionLocal -from ..models.auth import Device -from ..models.auth import User as UserModel +from ..models.device import Device +from ..models.user import User as UserModel # to get a string like this run: from ..schemas.user_token import UserToken diff --git a/barker/barker/db/base.py b/barker/barker/db/base.py index faf9d54..ef6a3b7 100644 --- a/barker/barker/db/base.py +++ b/barker/barker/db/base.py @@ -1,41 +1,37 @@ # Import all the models, so that Base has them before being # imported by Alembic -from barker.db.base_class import Base # noqa -from barker.models.auth import ( # noqa - Device, - LoginHistory, - Permission, - Role, - User, - role_permissions, - user_roles, -) -from barker.models.master import ( # noqa - Customer, - DbSetting, - FoodTable, - MenuCategory, - Modifier, - ModifierCategory, - Printer, - Product, - ProductVersion, - ReportingLevel, - SaleCategory, - Section, - SectionPrinter, - SettleOption, - Tax, - VoucherType, +from barker.db.base_class import Base # noqa: F401 +from barker.models.customer import Customer # noqa: F401 +from barker.models.db_setting import DbSetting # noqa: F401 +from barker.models.device import Device # noqa: F401 +from barker.models.food_table import FoodTable # noqa: F401 +from barker.models.guest_book import GuestBook # noqa: F401 +from barker.models.inventory import Inventory # noqa: F401 +from barker.models.inventory_modifier import InventoryModifier # noqa: F401 +from barker.models.kot import Kot # noqa: F401 +from barker.models.login_history import LoginHistory # noqa: F401 +from barker.models.menu_category import MenuCategory # noqa: F401 +from barker.models.modifier import Modifier # noqa: F401 +from barker.models.modifier_categories_products import ( # noqa: F401 modifier_categories_products, ) -from barker.models.voucher import ( # noqa - GuestBook, - Inventory, - InventoryModifier, - Kot, - Overview, - Reprint, - Settlement, - Voucher, -) +from barker.models.modifier_category import ModifierCategory # noqa: F401 +from barker.models.overview import Overview # noqa: F401 +from barker.models.permission import Permission # noqa: F401 +from barker.models.printer import Printer # noqa: F401 +from barker.models.product import Product # noqa: F401 +from barker.models.product_version import ProductVersion # noqa: F401 +from barker.models.reporting_level import ReportingLevel # noqa: F401 +from barker.models.reprint import Reprint # noqa: F401 +from barker.models.role import Role # noqa: F401 +from barker.models.role_permissions import role_permissions # noqa: F401 +from barker.models.sale_category import SaleCategory # noqa: F401 +from barker.models.section import Section # noqa: F401 +from barker.models.section_printer import SectionPrinter # noqa: F401 +from barker.models.settle_option import SettleOption # noqa: F401 +from barker.models.settlement import Settlement # noqa: F401 +from barker.models.tax import Tax # noqa: F401 +from barker.models.user import User # noqa: F401 +from barker.models.user_roles import user_roles # noqa: F401 +from barker.models.voucher import Voucher # noqa +from barker.models.voucher_type import VoucherType # noqa: F401 diff --git a/barker/barker/db/init_db.py b/barker/barker/db/init_db.py index ce03db8..9af7d42 100644 --- a/barker/barker/db/init_db.py +++ b/barker/barker/db/init_db.py @@ -1,14 +1,14 @@ import uuid from barker.core.config import settings # noqa: F401 -from barker.models.auth import Permission, Role, User -from barker.models.master import ( - Customer, - DbSetting, - ModifierCategory, - Section, - SettleOption, -) +from barker.models.customer import Customer +from barker.models.db_setting import DbSetting +from barker.models.modifier_category import ModifierCategory +from barker.models.permission import Permission +from barker.models.role import Role +from barker.models.section import Section +from barker.models.settle_option import SettleOption +from barker.models.user import User from brewman.db import base # noqa: F401 from sqlalchemy.orm import Session diff --git a/barker/barker/models/auth.py b/barker/barker/models/auth.py deleted file mode 100644 index f2dd76a..0000000 --- a/barker/barker/models/auth.py +++ /dev/null @@ -1,166 +0,0 @@ -import random -import string -import uuid - -from datetime import datetime -from hashlib import md5 - -from sqlalchemy import Boolean, Column, DateTime, Unicode, UniqueConstraint, desc, text -from sqlalchemy.dialects.postgresql import UUID -from sqlalchemy.orm import Session, relationship, synonym -from sqlalchemy.schema import ForeignKey, Table - -from .meta import Base - - -def encrypt(val): - return md5(val.encode("utf-8") + "v2".encode("utf-8")).hexdigest() - - -class LoginHistory(Base): - __tablename__ = "login_history" - __table_args__ = (UniqueConstraint("user_id", "device_id", "date"),) - id = Column( - "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 - ) - user_id = Column("user_id", UUID(as_uuid=True), ForeignKey("users.id"), nullable=False) - device_id = Column( - "device_id", - UUID(as_uuid=True), - ForeignKey("devices.id"), - nullable=False, - ) - date = Column("date", DateTime(timezone=True), nullable=False) - - def __init__(self, user_id=None, device_id=None, date=None, id_=None): - self.user_id = user_id - self.device_id = device_id - self.date = datetime.utcnow() if date is None else date - self.id = id_ - - -class Device(Base): - __tablename__ = "devices" - - id = Column( - "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 - ) - name = Column("name", Unicode(255), unique=True, nullable=False) - enabled = Column("enabled", Boolean, nullable=False) - section_id = Column("section_id", UUID(as_uuid=True), ForeignKey("sections.id"), nullable=False) - creation_date = Column("creation_date", DateTime(timezone=True), nullable=False) - - section = relationship("Section", foreign_keys=section_id) - login_history = relationship("LoginHistory", order_by=desc(LoginHistory.date), backref="device") - - def __init__(self, name=None, enabled=None, section_id=None, creation_date=None, id_=None): - self.name = name - self.enabled = enabled - self.section_id = section_id - self.creation_date = datetime.utcnow() if creation_date is None else creation_date - self.id = id_ - - @classmethod - def create(cls, db: Session): - main_section = uuid.UUID("3f13f6e7-dc76-4fca-8fdb-b2bbf29b35df") - name = "".join(random.choices(string.ascii_lowercase + string.digits, k=6)) - device = Device(name, False, main_section) - db.add(device) - return device - - -user_roles = Table( - "user_roles", - Base.metadata, - Column("id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4), - Column("user_id", UUID(as_uuid=True), ForeignKey("users.id"), nullable=False), - Column("role_id", UUID(as_uuid=True), ForeignKey("roles.id"), nullable=False), - UniqueConstraint("user_id", "role_id"), -) - -role_permissions = Table( - "role_permissions", - Base.metadata, - Column("id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4), - Column( - "permission_id", - UUID(as_uuid=True), - ForeignKey("permissions.id"), - nullable=False, - ), - Column("role_id", UUID(as_uuid=True), ForeignKey("roles.id"), nullable=False), - UniqueConstraint("permission_id", "role_id"), -) - - -class User(Base): - __tablename__ = "users" - - id = Column( - "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 - ) - name = Column("name", Unicode(255), unique=True, nullable=False) - _password = Column("password", Unicode(60), nullable=False) - locked_out = Column("locked_out", Boolean, nullable=False) - - roles = relationship("Role", secondary=user_roles, order_by="Role.name") - login_history = relationship("LoginHistory", order_by=desc(LoginHistory.date), backref="user") - - def _get_password(self): - return self._password - - def _set_password(self, password): - self._password = encrypt(password) - - password = property(_get_password, _set_password) - password = synonym("_password", descriptor=password) - - @property - def __name__(self): - return self.name - - def __init__(self, name=None, password=None, locked_out=None, id_=None): - self.name = name - self.password = password - self.locked_out = locked_out - self.id = id_ - - @classmethod - def auth(cls, name: str, password: str, db: Session): - if password is None: - return None - user = db.query(User).filter(User.name.ilike(name)).first() - if not user: - return None - if user.password != encrypt(password) or user.locked_out: - return None - else: - return user - - -class Role(Base): - __tablename__ = "roles" - - id = Column( - "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 - ) - name = Column("name", Unicode(255), unique=True) - - def __init__(self, name=None, id_=None): - self.name = name - self.id = id_ - - -class Permission(Base): - __tablename__ = "permissions" - - id = Column( - "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 - ) - name = Column("name", Unicode(255), unique=True) - - roles = relationship("Role", secondary=role_permissions, backref="permissions") - - def __init__(self, name=None, id_=None): - self.name = name - self.id = id_ diff --git a/barker/barker/models/customer.py b/barker/barker/models/customer.py new file mode 100644 index 0000000..d9b588f --- /dev/null +++ b/barker/barker/models/customer.py @@ -0,0 +1,30 @@ +import uuid + +from barker.models.meta import Base +from sqlalchemy import Column, Unicode, text +from sqlalchemy.dialects.postgresql import UUID + + +class Customer(Base): + __tablename__ = "customers" + + id = Column( + "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 + ) + name = Column("name", Unicode(255), nullable=False) + phone = Column("phone", Unicode(255), nullable=False, unique=True) + address = Column("address", Unicode(255), nullable=True) + + @property + def __name__(self): + return self.name + + def __init__(self, name=None, phone=None, address=None, id_=None): + self.name = name + self.phone = phone + self.address = address + self.id = id_ + + @classmethod + def cash(cls): + return uuid.UUID("2c716f4b-0736-429a-ad51-610d7c47cb5e") diff --git a/barker/barker/models/db_setting.py b/barker/barker/models/db_setting.py new file mode 100644 index 0000000..b162a48 --- /dev/null +++ b/barker/barker/models/db_setting.py @@ -0,0 +1,20 @@ +import uuid + +from barker.models.meta import Base +from sqlalchemy import JSON, Column, Unicode, text +from sqlalchemy.dialects.postgresql import UUID + + +class DbSetting(Base): + __tablename__ = "settings" + + id = Column( + "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 + ) + name = Column("name", Unicode(255), unique=True, nullable=False) + data = Column("data", JSON) + + def __init__(self, id_=None, name=None, data=None): + self.id = id_ + self.name = name + self.data = data diff --git a/barker/barker/models/device.py b/barker/barker/models/device.py new file mode 100644 index 0000000..c078dd7 --- /dev/null +++ b/barker/barker/models/device.py @@ -0,0 +1,41 @@ +import random +import string +import uuid + +from datetime import datetime + +from barker.models.login_history import LoginHistory +from barker.models.meta import Base +from sqlalchemy import Boolean, Column, DateTime, ForeignKey, Unicode, desc, text +from sqlalchemy.dialects.postgresql import UUID +from sqlalchemy.orm import Session, relationship + + +class Device(Base): + __tablename__ = "devices" + + id = Column( + "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 + ) + name = Column("name", Unicode(255), unique=True, nullable=False) + enabled = Column("enabled", Boolean, nullable=False) + section_id = Column("section_id", UUID(as_uuid=True), ForeignKey("sections.id"), nullable=False) + creation_date = Column("creation_date", DateTime(timezone=True), nullable=False) + + section = relationship("Section", foreign_keys=section_id) + login_history = relationship("LoginHistory", order_by=desc(LoginHistory.date), backref="device") + + def __init__(self, name=None, enabled=None, section_id=None, creation_date=None, id_=None): + self.name = name + self.enabled = enabled + self.section_id = section_id + self.creation_date = datetime.utcnow() if creation_date is None else creation_date + self.id = id_ + + @classmethod + def create(cls, db: Session): + main_section = uuid.UUID("3f13f6e7-dc76-4fca-8fdb-b2bbf29b35df") + name = "".join(random.choices(string.ascii_lowercase + string.digits, k=6)) + device = Device(name, False, main_section) + db.add(device) + return device diff --git a/barker/barker/models/food_table.py b/barker/barker/models/food_table.py new file mode 100644 index 0000000..7f3a0d5 --- /dev/null +++ b/barker/barker/models/food_table.py @@ -0,0 +1,41 @@ +import uuid + +from barker.models.meta import Base +from sqlalchemy import Boolean, Column, ForeignKey, Integer, Unicode, text +from sqlalchemy.dialects.postgresql import UUID +from sqlalchemy.orm import relationship + + +class FoodTable(Base): + __tablename__ = "food_tables" + + id = Column( + "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 + ) + name = Column("name", Unicode(255), nullable=False, unique=True) + seats = Column("seats", Integer, nullable=False) + section_id = Column("section_id", UUID(as_uuid=True), ForeignKey("sections.id"), nullable=False) + is_active = Column("is_active", Boolean, nullable=False) + sort_order = Column("sort_order", Integer, nullable=False) + + section = relationship("Section", foreign_keys=section_id) + + @property + def __name__(self): + return self.name + + def __init__( + self, + name=None, + seats=None, + section_id=None, + is_active=None, + sort_order=0, + id_=None, + ): + self.name = name + self.seats = seats + self.section_id = section_id + self.is_active = is_active + self.sort_order = sort_order + self.id = id_ diff --git a/barker/barker/models/guest_book.py b/barker/barker/models/guest_book.py new file mode 100644 index 0000000..942069d --- /dev/null +++ b/barker/barker/models/guest_book.py @@ -0,0 +1,30 @@ +import uuid + +from datetime import datetime + +from barker.models.meta import Base +from sqlalchemy import Column, DateTime, ForeignKey, Integer, text +from sqlalchemy.dialects.postgresql import UUID +from sqlalchemy.orm import relationship + + +class GuestBook(Base): + __tablename__ = "guest_book" + id = Column( + "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 + ) + customer_id = Column("customer_id", UUID(as_uuid=True), ForeignKey("customers.id"), nullable=False) + pax = Column("pax", Integer, nullable=False) + date = Column("creation_date", DateTime(timezone=True), nullable=False) + + customer = relationship("Customer") + + def __init__(self, pax=None, id_=None, customer_id=None, customer=None): + self.customer_id = customer_id + self.pax = pax + self.id = id_ + self.date = datetime.utcnow() + if customer is None: + self.customer_id = customer_id + else: + self.customer = customer diff --git a/barker/barker/models/inventory.py b/barker/barker/models/inventory.py new file mode 100644 index 0000000..e5a51b1 --- /dev/null +++ b/barker/barker/models/inventory.py @@ -0,0 +1,96 @@ +import uuid + +from decimal import Decimal + +from barker.models.meta import Base +from barker.models.product import Product +from sqlalchemy import ( + Boolean, + Column, + ForeignKey, + Integer, + Numeric, + UniqueConstraint, + case, + func, + text, +) +from sqlalchemy.dialects.postgresql import UUID +from sqlalchemy.ext.hybrid import hybrid_property +from sqlalchemy.orm import relationship + + +class Inventory(Base): + __tablename__ = "inventories" + __table_args__ = (UniqueConstraint("kot_id", "product_id", "is_happy_hour", "price"),) + + id = Column( + "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 + ) + kot_id = Column("kot_id", UUID(as_uuid=True), ForeignKey("kots.id"), nullable=False, index=True) + product_id = Column("product_id", UUID(as_uuid=True), ForeignKey("products.id"), nullable=False) + quantity = Column("quantity", Numeric(precision=15, scale=2)) + price = Column("price", Numeric(precision=15, scale=2)) + is_happy_hour = Column("is_happy_hour", Boolean, nullable=False) + tax_rate = Column("tax_rate", Numeric(precision=15, scale=5)) + tax_id = Column("tax_id", UUID(as_uuid=True), ForeignKey("taxes.id"), nullable=False) + discount = Column("discount", Numeric(precision=15, scale=5)) + sort_order = Column("sort_order", Integer, nullable=False) + + kot = relationship("Kot", backref="inventories") + tax = relationship("Tax", foreign_keys=tax_id) + product = relationship("ProductVersion", secondary=Product.__table__, backref="inventories") + + def __init__( + self, + kot_id, + product_id, + quantity, + price, + discount, + is_hh, + tax_id, + tax_rate, + sort_order, + ): + self.kot_id = kot_id + self.product_id = product_id + self.quantity = quantity + self.price = price + self.discount = discount + self.is_happy_hour = is_hh + self.tax_id = tax_id + self.tax_rate = tax_rate + self.sort_order = sort_order + + @hybrid_property + def effective_price(self): + return 0 if self.is_happy_hour else self.price + + @effective_price.expression + def effective_price(cls): + return case([(cls.is_happy_hour == True, 0)], else_=cls.price) # noqa: E712 + + @hybrid_property + def net(self): + return self.effective_price * self.quantity * (1 - self.discount) + + @net.expression + def net(cls): + return cls.effective_price * cls.quantity * (1 - cls.discount) + + @hybrid_property + def tax_amount(self): + return self.net * self.tax_rate + + @tax_amount.expression + def tax_amount(cls): + return cls.net * cls.tax_rate + + @hybrid_property + def amount(self): + return round(Decimal(self.net * (1 + self.tax_rate)), 2) + + @amount.expression + def amount(cls): + return func.round(cls.net * (1 + cls.tax_rate), 2) diff --git a/barker/barker/models/inventory_modifier.py b/barker/barker/models/inventory_modifier.py new file mode 100644 index 0000000..ecd042a --- /dev/null +++ b/barker/barker/models/inventory_modifier.py @@ -0,0 +1,26 @@ +import uuid + +from barker.models.meta import Base +from sqlalchemy import Column, ForeignKey, Numeric, UniqueConstraint, text +from sqlalchemy.dialects.postgresql import UUID +from sqlalchemy.orm import relationship + + +class InventoryModifier(Base): + __tablename__ = "inventory_modifiers" + __table_args__ = (UniqueConstraint("inventory_id", "modifier_id"),) + + id = Column( + "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 + ) + inventory_id = Column("inventory_id", UUID(as_uuid=True), ForeignKey("inventories.id"), nullable=False) + modifier_id = Column("modifier_id", UUID(as_uuid=True), ForeignKey("modifiers.id"), nullable=False) + price = Column("price", Numeric(precision=15, scale=2), nullable=False) + + inventory = relationship("Inventory", backref="modifiers") + modifier = relationship("Modifier") + + def __init__(self, inventory_id, modifier_id, price): + self.inventory_id = inventory_id + self.modifier_id = modifier_id + self.price = price diff --git a/barker/barker/models/kot.py b/barker/barker/models/kot.py new file mode 100644 index 0000000..d3b9826 --- /dev/null +++ b/barker/barker/models/kot.py @@ -0,0 +1,49 @@ +import uuid + +from barker.models.meta import Base +from sqlalchemy import Column, DateTime, ForeignKey, Integer, text +from sqlalchemy.dialects.postgresql import UUID +from sqlalchemy.orm import relationship + + +class Kot(Base): + __tablename__ = "kots" + + id = Column( + "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 + ) + voucher_id = Column( + "voucher_id", + UUID(as_uuid=True), + ForeignKey("vouchers.id"), + nullable=False, + index=True, + ) + code = Column("code", Integer, nullable=False, unique=True) + food_table_id = Column( + "food_table_id", + UUID(as_uuid=True), + ForeignKey("food_tables.id"), + nullable=False, + ) + date = Column("date", DateTime, nullable=False, index=True) + user_id = Column("user_id", UUID(as_uuid=True), ForeignKey("users.id"), nullable=False) + + user = relationship("User", backref="kots") + food_table = relationship("FoodTable", backref="kots") + + def __init__( + self, + voucher_id=None, + code=None, + food_table_id=None, + date=None, + user_id=None, + id_=None, + ): + self.id = id_ + self.voucher_id = voucher_id + self.code = code + self.food_table_id = food_table_id + self.date = date + self.user_id = user_id diff --git a/barker/barker/models/login_history.py b/barker/barker/models/login_history.py new file mode 100644 index 0000000..9755c86 --- /dev/null +++ b/barker/barker/models/login_history.py @@ -0,0 +1,29 @@ +import uuid + +from datetime import datetime + +from barker.models.meta import Base +from sqlalchemy import Column, DateTime, ForeignKey, UniqueConstraint, text +from sqlalchemy.dialects.postgresql import UUID + + +class LoginHistory(Base): + __tablename__ = "login_history" + __table_args__ = (UniqueConstraint("user_id", "device_id", "date"),) + id = Column( + "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 + ) + user_id = Column("user_id", UUID(as_uuid=True), ForeignKey("users.id"), nullable=False) + device_id = Column( + "device_id", + UUID(as_uuid=True), + ForeignKey("devices.id"), + nullable=False, + ) + date = Column("date", DateTime(timezone=True), nullable=False) + + def __init__(self, user_id=None, device_id=None, date=None, id_=None): + self.user_id = user_id + self.device_id = device_id + self.date = datetime.utcnow() if date is None else date + self.id = id_ diff --git a/barker/barker/models/master.py b/barker/barker/models/master.py deleted file mode 100644 index 51f6549..0000000 --- a/barker/barker/models/master.py +++ /dev/null @@ -1,460 +0,0 @@ -import enum -import uuid - -from sqlalchemy import ( - JSON, - Boolean, - Column, - Date, - Enum, - ForeignKey, - Integer, - Numeric, - Table, - Unicode, - UniqueConstraint, - case, - func, - text, -) -from sqlalchemy.dialects import postgresql -from sqlalchemy.dialects.postgresql import UUID -from sqlalchemy.ext.hybrid import hybrid_property -from sqlalchemy.orm import relationship -from sqlalchemy.sql import expression - -from .meta import Base - - -class VoucherType(enum.IntEnum): - KOT = 0 - REGULAR_BILL = 1 - NO_CHARGE = 2 - STAFF = 4 - VOID = 8 - - -class ReportingLevel(enum.IntEnum): - Skip = 0 - Aggregate = 1 - Detailed = 2 - - -class Customer(Base): - __tablename__ = "customers" - - id = Column( - "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 - ) - name = Column("name", Unicode(255), nullable=False) - phone = Column("phone", Unicode(255), nullable=False, unique=True) - address = Column("address", Unicode(255), nullable=True) - - @property - def __name__(self): - return self.name - - def __init__(self, name=None, phone=None, address=None, id_=None): - self.name = name - self.phone = phone - self.address = address - self.id = id_ - - @classmethod - def cash(cls): - return uuid.UUID("2c716f4b-0736-429a-ad51-610d7c47cb5e") - - -class FoodTable(Base): - __tablename__ = "food_tables" - - id = Column( - "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 - ) - name = Column("name", Unicode(255), nullable=False, unique=True) - seats = Column("seats", Integer, nullable=False) - section_id = Column("section_id", UUID(as_uuid=True), ForeignKey("sections.id"), nullable=False) - is_active = Column("is_active", Boolean, nullable=False) - sort_order = Column("sort_order", Integer, nullable=False) - - section = relationship("Section", foreign_keys=section_id) - - @property - def __name__(self): - return self.name - - def __init__( - self, - name=None, - seats=None, - section_id=None, - is_active=None, - sort_order=0, - id_=None, - ): - self.name = name - self.seats = seats - self.section_id = section_id - self.is_active = is_active - self.sort_order = sort_order - self.id = id_ - - -class Tax(Base): - __tablename__ = "taxes" - - id = Column( - "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 - ) - name = Column("name", Unicode(255), nullable=False, unique=True) - rate = Column("rate", Numeric(precision=15, scale=5), nullable=False) - is_fixture = Column("is_fixture", Boolean, nullable=False) - - def __init__(self, name=None, rate=None, is_fixture=False, id_=None): - self.name = name - self.rate = rate - self.is_fixture = is_fixture - self.id = id_ - - -class MenuCategory(Base): - __tablename__ = "menu_categories" - - id = Column( - "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 - ) - name = Column("name", Unicode(255), nullable=False, unique=True) - - is_active = Column("is_active", Boolean, nullable=False) - is_fixture = Column("is_fixture", Boolean, nullable=False) - sort_order = Column("sort_order", Integer, nullable=False) - - def __init__(self, name, is_active, sort_order, is_fixture=False, id_=None): - self.name = name - self.is_active = is_active - self.sort_order = sort_order - self.is_fixture = is_fixture - self.id = id_ - - -class SaleCategory(Base): - __tablename__ = "sale_categories" - - id = Column( - "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 - ) - name = Column("name", Unicode(255), nullable=False, unique=True) - discount_limit = Column("discount_limit", Numeric(precision=15, scale=5), nullable=False) - tax_id = Column("tax_id", UUID(as_uuid=True), ForeignKey("taxes.id"), nullable=False) - tax = relationship("Tax", foreign_keys=tax_id) - - def __init__(self, name, discount_limit=None, tax_id=False, id_=None): - self.name = name - self.discount_limit = discount_limit if discount_limit is not None else 1 - self.tax_id = tax_id - self.id = id_ - - -class Product(Base): - __tablename__ = "products" - id = Column( - "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 - ) - versions = relationship("ProductVersion") - modifier_categories = relationship( - "ModifierCategory", - secondary="modifier_categories_products", - order_by="ModifierCategory.sort_order", - backref="products", - ) - - def __init__(self, id_=None, version_id=None): - self.id = id_ - self.version_id = version_id - - -modifier_categories_products = Table( - "modifier_categories_products", - Base.metadata, - Column("id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4), - Column("product_id", UUID(as_uuid=True), ForeignKey("products.id"), nullable=False), - Column( - "modifier_category_id", - UUID(as_uuid=True), - ForeignKey("modifier_categories.id"), - nullable=False, - ), - UniqueConstraint("product_id", "modifier_category_id"), -) - - -class ProductVersion(Base): - __tablename__ = "product_versions" - id = Column( - "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 - ) - product_id = Column("product_id", UUID(as_uuid=True), ForeignKey("products.id"), nullable=False) - name = Column("name", Unicode(255), nullable=False) - units = Column("units", Unicode(255), nullable=False) - menu_category_id = Column( - "menu_category_id", - UUID(as_uuid=True), - ForeignKey("menu_categories.id"), - nullable=False, - ) - sale_category_id = Column( - "sale_category_id", - UUID(as_uuid=True), - ForeignKey("sale_categories.id"), - nullable=False, - ) - price = Column("price", Numeric(precision=15, scale=2), nullable=False) - has_happy_hour = Column("has_happy_hour", Boolean, nullable=False) - is_not_available = Column("is_not_available", Boolean, nullable=False) - quantity = Column("quantity", Numeric(precision=15, scale=2), nullable=False) - sort_order = Column("sort_order", Integer, nullable=False) - - valid_from = Column("valid_from", Date(), nullable=True) - valid_till = Column("valid_till", Date(), nullable=True) - - menu_category = relationship("MenuCategory", backref="products") - sale_category = relationship("SaleCategory", backref="products") - - product = relationship("Product") - - __table_args__ = ( - postgresql.ExcludeConstraint( - (name, "="), - (units, "="), - (func.daterange(valid_from, valid_till, text("'[]'")), "&&"), - ), - ) - - def __init__( - self, - product_id=None, - name=None, - units=None, - menu_category_id=None, - sale_category_id=None, - price=None, - has_happy_hour=None, - is_not_available=None, - quantity=None, - valid_from=None, - valid_till=None, - sort_order=0, - id_=None, - ): - self.product_id = product_id - self.name = name - self.units = units - self.menu_category_id = menu_category_id - self.sale_category_id = sale_category_id - self.price = price - self.has_happy_hour = has_happy_hour - self.is_not_available = is_not_available - self.quantity = quantity - self.valid_from = valid_from - self.valid_till = valid_till - self.sort_order = sort_order - self.id = id_ - - @hybrid_property - def full_name(self): - return f"{self.name} ({self.units})" if self.units else self.name - - @full_name.expression - def full_name(cls): - return cls.name + case([(cls.units != "", " (" + cls.units + ")")], else_="") - - def can_delete(self, advanced_delete): - if self.is_fixture: - return False, f"{self.name} is a fixture and cannot be edited or deleted." - if self.is_active: - return False, "Product is active" - if len(self.inventories) > 0 and not advanced_delete: - return False, "Product has entries" - return True, "" - - -class ModifierCategory(Base): - __tablename__ = "modifier_categories" - - id = Column( - "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 - ) - name = Column("name", Unicode(255), nullable=False, unique=True) - minimum = Column("minimum", Integer, nullable=False) - maximum = Column("maximum", Integer, nullable=True) - is_active = Column("is_active", Boolean, nullable=False) - sort_order = Column("sort_order", Integer, nullable=False) - - def __init__( - self, - name=None, - minimum=None, - maximum=None, - is_active=True, - sort_order=0, - id_=None, - ): - self.id = id_ - self.name = name - self.minimum = minimum - self.maximum = maximum - self.is_active = is_active - self.sort_order = sort_order - - -class Modifier(Base): - __tablename__ = "modifiers" - - id = Column( - "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 - ) - name = Column("name", Unicode(255), nullable=False, unique=True) - show_in_bill = Column("show_in_bill", Boolean, nullable=False) - price = Column("price", Numeric(precision=15, scale=2), nullable=False) - is_active = Column("is_active", Boolean, nullable=False) - modifier_category_id = Column( - "modifier_category_id", - UUID(as_uuid=True), - ForeignKey("modifier_categories.id"), - nullable=False, - ) - - modifier_category = relationship("ModifierCategory", backref="modifiers") - - def __init__( - self, - name=None, - show_in_bill=None, - price=None, - modifier_category_id=None, - is_active=True, - id_=None, - ): - self.id = id_ - self.name = name - self.show_in_bill = show_in_bill - self.price = price - self.modifier_category_id = modifier_category_id - self.is_active = is_active - - -class DbSetting(Base): - __tablename__ = "settings" - - id = Column( - "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 - ) - name = Column("name", Unicode(255), unique=True, nullable=False) - data = Column("data", JSON) - - def __init__(self, id_=None, name=None, data=None): - self.id = id_ - self.name = name - self.data = data - - -class Section(Base): - __tablename__ = "sections" - - id = Column( - "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 - ) - name = Column("name", Unicode(255), unique=True, nullable=False) - is_fixture = Column("is_fixture", Boolean, nullable=False, default=False) - - def __init__(self, name=None, is_fixture=None, id_=None): - self.id = id_ - self.name = name - self.is_fixture = is_fixture - - @classmethod - def main(cls): - return uuid.UUID("3f13f6e7-dc76-4fca-8fdb-b2bbf29b35df") - - -class Printer(Base): - __tablename__ = "printers" - - id = Column( - "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 - ) - name = Column("name", Unicode(255), unique=True, nullable=False) - address = Column("address", Unicode(255), unique=True, nullable=False) - cut_code = Column("cut_code", Unicode(255), nullable=False) - - def __init__(self, name=None, address=None, cut_code=None, id_=None): - self.id = id_ - self.name = name - self.address = address - self.cut_code = cut_code - - -class SectionPrinter(Base): - __tablename__ = "section_printers" - __table_args__ = (UniqueConstraint("menu_category_id", "section_id"),) - - id = Column( - "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 - ) - menu_category_id = Column("menu_category_id", UUID(as_uuid=True), ForeignKey("menu_categories.id")) - section_id = Column("section_id", UUID(as_uuid=True), ForeignKey("sections.id"), nullable=False) - printer_id = Column("printer_id", UUID(as_uuid=True), ForeignKey("printers.id"), nullable=False) - copies = Column("copies", Integer, nullable=False) - - menu_category = relationship("MenuCategory", backref="section_printers") - section = relationship("Section", backref="section_printers") - printer = relationship("Printer", backref="section_printers") - - def __init__( - self, - menu_category_id=None, - section_id=None, - printer_id=None, - copies=None, - id_=None, - ): - self.id = id_ - self.menu_category_id = menu_category_id - self.section_id = section_id - self.printer_id = printer_id - self.copies = copies - - -class SettleOption(Base): - __tablename__ = "settle_options" - - id = Column("id", Integer, primary_key=True) - name = Column("name", Unicode(255), unique=True, nullable=False) - voucher_type = Column("voucher_type", Enum(VoucherType), nullable=False) - reporting_level = Column("reporting_level", Enum(ReportingLevel), nullable=False) - has_reason = Column("has_reason", Boolean, nullable=False, server_default=expression.false(), default=False) - is_fixture = Column("is_fixture", Boolean, nullable=False, server_default=expression.false(), default=False) - - def __init__(self, name=None, voucher_type=None, reporting_level=None, has_reason=None, is_fixture=None, id_=None): - self.id = id_ - self.name = name - self.voucher_type = voucher_type - self.reporting_level = reporting_level - self.has_reason = has_reason - self.is_fixture = is_fixture - - @classmethod - def UNSETTLED(cls): - return 1 - - @classmethod - def ROUND_OFF(cls): - return 7 - - @classmethod - def AMOUNT(cls): - return 8 - - @classmethod - def VOID(cls): - return 9 diff --git a/barker/barker/models/menu_category.py b/barker/barker/models/menu_category.py new file mode 100644 index 0000000..3fa1f16 --- /dev/null +++ b/barker/barker/models/menu_category.py @@ -0,0 +1,25 @@ +import uuid + +from barker.models.meta import Base +from sqlalchemy import Boolean, Column, Integer, Unicode, text +from sqlalchemy.dialects.postgresql import UUID + + +class MenuCategory(Base): + __tablename__ = "menu_categories" + + id = Column( + "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 + ) + name = Column("name", Unicode(255), nullable=False, unique=True) + + is_active = Column("is_active", Boolean, nullable=False) + is_fixture = Column("is_fixture", Boolean, nullable=False) + sort_order = Column("sort_order", Integer, nullable=False) + + def __init__(self, name, is_active, sort_order, is_fixture=False, id_=None): + self.name = name + self.is_active = is_active + self.sort_order = sort_order + self.is_fixture = is_fixture + self.id = id_ diff --git a/barker/barker/models/modifier.py b/barker/barker/models/modifier.py new file mode 100644 index 0000000..4d9f611 --- /dev/null +++ b/barker/barker/models/modifier.py @@ -0,0 +1,42 @@ +import uuid + +from barker.models.meta import Base +from sqlalchemy import Boolean, Column, ForeignKey, Numeric, Unicode, text +from sqlalchemy.dialects.postgresql import UUID +from sqlalchemy.orm import relationship + + +class Modifier(Base): + __tablename__ = "modifiers" + + id = Column( + "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 + ) + name = Column("name", Unicode(255), nullable=False, unique=True) + show_in_bill = Column("show_in_bill", Boolean, nullable=False) + price = Column("price", Numeric(precision=15, scale=2), nullable=False) + is_active = Column("is_active", Boolean, nullable=False) + modifier_category_id = Column( + "modifier_category_id", + UUID(as_uuid=True), + ForeignKey("modifier_categories.id"), + nullable=False, + ) + + modifier_category = relationship("ModifierCategory", backref="modifiers") + + def __init__( + self, + name=None, + show_in_bill=None, + price=None, + modifier_category_id=None, + is_active=True, + id_=None, + ): + self.id = id_ + self.name = name + self.show_in_bill = show_in_bill + self.price = price + self.modifier_category_id = modifier_category_id + self.is_active = is_active diff --git a/barker/barker/models/modifier_categories_products.py b/barker/barker/models/modifier_categories_products.py new file mode 100644 index 0000000..6ac6664 --- /dev/null +++ b/barker/barker/models/modifier_categories_products.py @@ -0,0 +1,20 @@ +import uuid + +from barker.models.meta import Base +from sqlalchemy import Column, ForeignKey, Table, UniqueConstraint, text +from sqlalchemy.dialects.postgresql import UUID + + +modifier_categories_products = Table( + "modifier_categories_products", + Base.metadata, + Column("id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4), + Column("product_id", UUID(as_uuid=True), ForeignKey("products.id"), nullable=False), + Column( + "modifier_category_id", + UUID(as_uuid=True), + ForeignKey("modifier_categories.id"), + nullable=False, + ), + UniqueConstraint("product_id", "modifier_category_id"), +) diff --git a/barker/barker/models/modifier_category.py b/barker/barker/models/modifier_category.py new file mode 100644 index 0000000..e7772a8 --- /dev/null +++ b/barker/barker/models/modifier_category.py @@ -0,0 +1,34 @@ +import uuid + +from barker.models.meta import Base +from sqlalchemy import Boolean, Column, Integer, Unicode, text +from sqlalchemy.dialects.postgresql import UUID + + +class ModifierCategory(Base): + __tablename__ = "modifier_categories" + + id = Column( + "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 + ) + name = Column("name", Unicode(255), nullable=False, unique=True) + minimum = Column("minimum", Integer, nullable=False) + maximum = Column("maximum", Integer, nullable=True) + is_active = Column("is_active", Boolean, nullable=False) + sort_order = Column("sort_order", Integer, nullable=False) + + def __init__( + self, + name=None, + minimum=None, + maximum=None, + is_active=True, + sort_order=0, + id_=None, + ): + self.id = id_ + self.name = name + self.minimum = minimum + self.maximum = maximum + self.is_active = is_active + self.sort_order = sort_order diff --git a/barker/barker/models/overview.py b/barker/barker/models/overview.py new file mode 100644 index 0000000..aff9235 --- /dev/null +++ b/barker/barker/models/overview.py @@ -0,0 +1,40 @@ +import uuid + +from barker.models.meta import Base +from sqlalchemy import Column, ForeignKey, Unicode, text +from sqlalchemy.dialects.postgresql import UUID +from sqlalchemy.orm import backref, relationship + + +class Overview(Base): + __tablename__ = "overview" + id = Column( + "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 + ) + voucher_id = Column( + "voucher_id", + UUID(as_uuid=True), + ForeignKey("vouchers.id"), + nullable=False, + unique=True, + ) + food_table_id = Column( + "food_table_id", + UUID(as_uuid=True), + ForeignKey("food_tables.id"), + nullable=False, + unique=True, + ) + guest_book_id = Column("guest_book_id", UUID(as_uuid=True), ForeignKey("guest_book.id"), unique=True) + status = Column("status", Unicode(255), nullable=False) + + voucher = relationship("Voucher", backref=backref("status", uselist=False)) + food_table = relationship("FoodTable", backref=backref("status", uselist=False)) + guest = relationship("GuestBook", backref=backref("status", uselist=False)) + + def __init__(self, voucher_id, food_table_id, guest_book_id, status, id_=None): + self.voucher_id = voucher_id + self.food_table_id = food_table_id + self.guest_book_id = guest_book_id + self.status = status + self.id = id_ diff --git a/barker/barker/models/permission.py b/barker/barker/models/permission.py new file mode 100644 index 0000000..2c47416 --- /dev/null +++ b/barker/barker/models/permission.py @@ -0,0 +1,22 @@ +import uuid + +from barker.models.meta import Base +from barker.models.role_permissions import role_permissions +from sqlalchemy import Column, Unicode, text +from sqlalchemy.dialects.postgresql import UUID +from sqlalchemy.orm import relationship + + +class Permission(Base): + __tablename__ = "permissions" + + id = Column( + "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 + ) + name = Column("name", Unicode(255), unique=True) + + roles = relationship("Role", secondary=role_permissions, backref="permissions") + + def __init__(self, name=None, id_=None): + self.name = name + self.id = id_ diff --git a/barker/barker/models/printer.py b/barker/barker/models/printer.py new file mode 100644 index 0000000..a38bc7c --- /dev/null +++ b/barker/barker/models/printer.py @@ -0,0 +1,22 @@ +import uuid + +from barker.models.meta import Base +from sqlalchemy import Column, Unicode, text +from sqlalchemy.dialects.postgresql import UUID + + +class Printer(Base): + __tablename__ = "printers" + + id = Column( + "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 + ) + name = Column("name", Unicode(255), unique=True, nullable=False) + address = Column("address", Unicode(255), nullable=False) + cut_code = Column("cut_code", Unicode(255), nullable=False) + + def __init__(self, name=None, address=None, cut_code=None, id_=None): + self.id = id_ + self.name = name + self.address = address + self.cut_code = cut_code diff --git a/barker/barker/models/product.py b/barker/barker/models/product.py new file mode 100644 index 0000000..256f8dd --- /dev/null +++ b/barker/barker/models/product.py @@ -0,0 +1,24 @@ +import uuid + +from barker.models.meta import Base +from sqlalchemy import Column, text +from sqlalchemy.dialects.postgresql import UUID +from sqlalchemy.orm import relationship + + +class Product(Base): + __tablename__ = "products" + id = Column( + "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 + ) + versions = relationship("ProductVersion") + modifier_categories = relationship( + "ModifierCategory", + secondary="modifier_categories_products", + order_by="ModifierCategory.sort_order", + backref="products", + ) + + def __init__(self, id_=None, version_id=None): + self.id = id_ + self.version_id = version_id diff --git a/barker/barker/models/product_version.py b/barker/barker/models/product_version.py new file mode 100644 index 0000000..95e4b9a --- /dev/null +++ b/barker/barker/models/product_version.py @@ -0,0 +1,109 @@ +import uuid + +from barker.models.meta import Base +from sqlalchemy import ( + Boolean, + Column, + Date, + ForeignKey, + Integer, + Numeric, + Unicode, + case, + func, + text, +) +from sqlalchemy.dialects import postgresql +from sqlalchemy.dialects.postgresql import UUID +from sqlalchemy.ext.hybrid import hybrid_property +from sqlalchemy.orm import relationship + + +class ProductVersion(Base): + __tablename__ = "product_versions" + id = Column( + "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 + ) + product_id = Column("product_id", UUID(as_uuid=True), ForeignKey("products.id"), nullable=False) + name = Column("name", Unicode(255), nullable=False) + units = Column("units", Unicode(255), nullable=False) + menu_category_id = Column( + "menu_category_id", + UUID(as_uuid=True), + ForeignKey("menu_categories.id"), + nullable=False, + ) + sale_category_id = Column( + "sale_category_id", + UUID(as_uuid=True), + ForeignKey("sale_categories.id"), + nullable=False, + ) + price = Column("price", Numeric(precision=15, scale=2), nullable=False) + has_happy_hour = Column("has_happy_hour", Boolean, nullable=False) + is_not_available = Column("is_not_available", Boolean, nullable=False) + quantity = Column("quantity", Numeric(precision=15, scale=2), nullable=False) + sort_order = Column("sort_order", Integer, nullable=False) + + valid_from = Column("valid_from", Date(), nullable=True) + valid_till = Column("valid_till", Date(), nullable=True) + + menu_category = relationship("MenuCategory", backref="products") + sale_category = relationship("SaleCategory", backref="products") + + product = relationship("Product") + + __table_args__ = ( + postgresql.ExcludeConstraint( + (name, "="), + (units, "="), + (func.daterange(valid_from, valid_till, text("'[]'")), "&&"), + ), + ) + + def __init__( + self, + product_id=None, + name=None, + units=None, + menu_category_id=None, + sale_category_id=None, + price=None, + has_happy_hour=None, + is_not_available=None, + quantity=None, + valid_from=None, + valid_till=None, + sort_order=0, + id_=None, + ): + self.product_id = product_id + self.name = name + self.units = units + self.menu_category_id = menu_category_id + self.sale_category_id = sale_category_id + self.price = price + self.has_happy_hour = has_happy_hour + self.is_not_available = is_not_available + self.quantity = quantity + self.valid_from = valid_from + self.valid_till = valid_till + self.sort_order = sort_order + self.id = id_ + + @hybrid_property + def full_name(self): + return f"{self.name} ({self.units})" if self.units else self.name + + @full_name.expression + def full_name(cls): + return cls.name + case([(cls.units != "", " (" + cls.units + ")")], else_="") + + def can_delete(self, advanced_delete): + if self.is_fixture: + return False, f"{self.name} is a fixture and cannot be edited or deleted." + if self.is_active: + return False, "Product is active" + if len(self.inventories) > 0 and not advanced_delete: + return False, "Product has entries" + return True, "" diff --git a/barker/barker/models/reporting_level.py b/barker/barker/models/reporting_level.py new file mode 100644 index 0000000..2c94578 --- /dev/null +++ b/barker/barker/models/reporting_level.py @@ -0,0 +1,7 @@ +import enum + + +class ReportingLevel(enum.IntEnum): + Skip = 0 + Aggregate = 1 + Detailed = 2 diff --git a/barker/barker/models/reprint.py b/barker/barker/models/reprint.py new file mode 100644 index 0000000..7ac6759 --- /dev/null +++ b/barker/barker/models/reprint.py @@ -0,0 +1,33 @@ +import uuid + +from datetime import datetime + +from barker.models.meta import Base +from sqlalchemy import Column, DateTime, ForeignKey, text +from sqlalchemy.dialects.postgresql import UUID +from sqlalchemy.orm import relationship + + +class Reprint(Base): + __tablename__ = "reprints" + + id = Column( + "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 + ) + date = Column("date", DateTime, nullable=False, index=True) + voucher_id = Column( + "voucher_id", + UUID(as_uuid=True), + ForeignKey("vouchers.id"), + nullable=False, + index=True, + ) + user_id = Column("user_id", UUID(as_uuid=True), ForeignKey("users.id"), nullable=False) + + user = relationship("User", backref="reprints") + + def __init__(self, voucher_id=None, user_id=None, id_=None): + self.id = id_ + self.date = datetime.now() + self.voucher_id = voucher_id + self.user_id = user_id diff --git a/barker/barker/models/role.py b/barker/barker/models/role.py new file mode 100644 index 0000000..c34fca5 --- /dev/null +++ b/barker/barker/models/role.py @@ -0,0 +1,18 @@ +import uuid + +from barker.models.meta import Base +from sqlalchemy import Column, Unicode, text +from sqlalchemy.dialects.postgresql import UUID + + +class Role(Base): + __tablename__ = "roles" + + id = Column( + "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 + ) + name = Column("name", Unicode(255), unique=True) + + def __init__(self, name=None, id_=None): + self.name = name + self.id = id_ diff --git a/barker/barker/models/role_permissions.py b/barker/barker/models/role_permissions.py new file mode 100644 index 0000000..2352ee8 --- /dev/null +++ b/barker/barker/models/role_permissions.py @@ -0,0 +1,20 @@ +import uuid + +from barker.models.meta import Base +from sqlalchemy import Column, ForeignKey, Table, UniqueConstraint, text +from sqlalchemy.dialects.postgresql import UUID + + +role_permissions = Table( + "role_permissions", + Base.metadata, + Column("id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4), + Column( + "permission_id", + UUID(as_uuid=True), + ForeignKey("permissions.id"), + nullable=False, + ), + Column("role_id", UUID(as_uuid=True), ForeignKey("roles.id"), nullable=False), + UniqueConstraint("permission_id", "role_id"), +) diff --git a/barker/barker/models/sale_category.py b/barker/barker/models/sale_category.py new file mode 100644 index 0000000..a7869c8 --- /dev/null +++ b/barker/barker/models/sale_category.py @@ -0,0 +1,24 @@ +import uuid + +from barker.models.meta import Base +from sqlalchemy import Column, ForeignKey, Numeric, Unicode, text +from sqlalchemy.dialects.postgresql import UUID +from sqlalchemy.orm import relationship + + +class SaleCategory(Base): + __tablename__ = "sale_categories" + + id = Column( + "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 + ) + name = Column("name", Unicode(255), nullable=False, unique=True) + discount_limit = Column("discount_limit", Numeric(precision=15, scale=5), nullable=False) + tax_id = Column("tax_id", UUID(as_uuid=True), ForeignKey("taxes.id"), nullable=False) + tax = relationship("Tax", foreign_keys=tax_id) + + def __init__(self, name, discount_limit=None, tax_id=False, id_=None): + self.name = name + self.discount_limit = discount_limit if discount_limit is not None else 1 + self.tax_id = tax_id + self.id = id_ diff --git a/barker/barker/models/section.py b/barker/barker/models/section.py new file mode 100644 index 0000000..4997bf6 --- /dev/null +++ b/barker/barker/models/section.py @@ -0,0 +1,24 @@ +import uuid + +from barker.models.meta import Base +from sqlalchemy import Boolean, Column, Unicode, text +from sqlalchemy.dialects.postgresql import UUID + + +class Section(Base): + __tablename__ = "sections" + + id = Column( + "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 + ) + name = Column("name", Unicode(255), unique=True, nullable=False) + is_fixture = Column("is_fixture", Boolean, nullable=False, default=False) + + def __init__(self, name=None, is_fixture=None, id_=None): + self.id = id_ + self.name = name + self.is_fixture = is_fixture + + @classmethod + def main(cls): + return uuid.UUID("3f13f6e7-dc76-4fca-8fdb-b2bbf29b35df") diff --git a/barker/barker/models/section_printer.py b/barker/barker/models/section_printer.py new file mode 100644 index 0000000..67c9e8c --- /dev/null +++ b/barker/barker/models/section_printer.py @@ -0,0 +1,37 @@ +import uuid + +from barker.models.meta import Base +from sqlalchemy import Column, ForeignKey, Integer, UniqueConstraint, text +from sqlalchemy.dialects.postgresql import UUID +from sqlalchemy.orm import relationship + + +class SectionPrinter(Base): + __tablename__ = "section_printers" + __table_args__ = (UniqueConstraint("menu_category_id", "section_id"),) + + id = Column( + "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 + ) + menu_category_id = Column("menu_category_id", UUID(as_uuid=True), ForeignKey("menu_categories.id")) + section_id = Column("section_id", UUID(as_uuid=True), ForeignKey("sections.id"), nullable=False) + printer_id = Column("printer_id", UUID(as_uuid=True), ForeignKey("printers.id"), nullable=False) + copies = Column("copies", Integer, nullable=False) + + menu_category = relationship("MenuCategory", backref="section_printers") + section = relationship("Section", backref="section_printers") + printer = relationship("Printer", backref="section_printers") + + def __init__( + self, + menu_category_id=None, + section_id=None, + printer_id=None, + copies=None, + id_=None, + ): + self.id = id_ + self.menu_category_id = menu_category_id + self.section_id = section_id + self.printer_id = printer_id + self.copies = copies diff --git a/barker/barker/models/settle_option.py b/barker/barker/models/settle_option.py new file mode 100644 index 0000000..06b4e8f --- /dev/null +++ b/barker/barker/models/settle_option.py @@ -0,0 +1,40 @@ +from barker.models.meta import Base +from barker.models.reporting_level import ReportingLevel +from barker.models.voucher_type import VoucherType +from sqlalchemy import Boolean, Column, Enum, Integer, Unicode +from sqlalchemy.sql import expression + + +class SettleOption(Base): + __tablename__ = "settle_options" + + id = Column("id", Integer, primary_key=True) + name = Column("name", Unicode(255), unique=True, nullable=False) + voucher_type = Column("voucher_type", Enum(VoucherType), nullable=False) + reporting_level = Column("reporting_level", Enum(ReportingLevel), nullable=False) + has_reason = Column("has_reason", Boolean, nullable=False, server_default=expression.false(), default=False) + is_fixture = Column("is_fixture", Boolean, nullable=False, server_default=expression.false(), default=False) + + def __init__(self, name=None, voucher_type=None, reporting_level=None, has_reason=None, is_fixture=None, id_=None): + self.id = id_ + self.name = name + self.voucher_type = voucher_type + self.reporting_level = reporting_level + self.has_reason = has_reason + self.is_fixture = is_fixture + + @classmethod + def UNSETTLED(cls): + return 1 + + @classmethod + def ROUND_OFF(cls): + return 7 + + @classmethod + def AMOUNT(cls): + return 8 + + @classmethod + def VOID(cls): + return 9 diff --git a/barker/barker/models/settlement.py b/barker/barker/models/settlement.py new file mode 100644 index 0000000..93d6b90 --- /dev/null +++ b/barker/barker/models/settlement.py @@ -0,0 +1,32 @@ +import uuid + +from barker.models.meta import Base +from sqlalchemy import Column, ForeignKey, Integer, Numeric, UniqueConstraint, text +from sqlalchemy.dialects.postgresql import UUID +from sqlalchemy.orm import relationship + + +class Settlement(Base): + __tablename__ = "settlements" + __table_args__ = (UniqueConstraint("voucher_id", "settled"),) + + id = Column( + "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 + ) + voucher_id = Column( + "voucher_id", + UUID(as_uuid=True), + ForeignKey("vouchers.id"), + nullable=False, + index=True, + ) + settled = Column("settled", Integer, ForeignKey("settle_options.id"), nullable=False) + amount = Column("amount", Numeric(precision=15, scale=2), nullable=False) + + settle_option = relationship("SettleOption") + + def __init__(self, voucher_id=None, settled=None, amount=None, id_=None): + self.id = id_ + self.voucher_id = voucher_id + self.settled = settled + self.amount = amount diff --git a/barker/barker/models/tax.py b/barker/barker/models/tax.py new file mode 100644 index 0000000..a540ace --- /dev/null +++ b/barker/barker/models/tax.py @@ -0,0 +1,22 @@ +import uuid + +from barker.models.meta import Base +from sqlalchemy import Boolean, Column, Numeric, Unicode, text +from sqlalchemy.dialects.postgresql import UUID + + +class Tax(Base): + __tablename__ = "taxes" + + id = Column( + "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 + ) + name = Column("name", Unicode(255), nullable=False, unique=True) + rate = Column("rate", Numeric(precision=15, scale=5), nullable=False) + is_fixture = Column("is_fixture", Boolean, nullable=False) + + def __init__(self, name=None, rate=None, is_fixture=False, id_=None): + self.name = name + self.rate = rate + self.is_fixture = is_fixture + self.id = id_ diff --git a/barker/barker/models/user.py b/barker/barker/models/user.py new file mode 100644 index 0000000..1fe0885 --- /dev/null +++ b/barker/barker/models/user.py @@ -0,0 +1,59 @@ +import uuid + +from hashlib import md5 + +from barker.models.login_history import LoginHistory +from barker.models.meta import Base +from barker.models.user_roles import user_roles +from sqlalchemy import Boolean, Column, Unicode, desc, text +from sqlalchemy.dialects.postgresql import UUID +from sqlalchemy.orm import Session, relationship, synonym + + +class User(Base): + __tablename__ = "users" + + id = Column( + "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 + ) + name = Column("name", Unicode(255), unique=True, nullable=False) + _password = Column("password", Unicode(60), nullable=False) + locked_out = Column("locked_out", Boolean, nullable=False) + + roles = relationship("Role", secondary=user_roles, order_by="Role.name") + login_history = relationship("LoginHistory", order_by=desc(LoginHistory.date), backref="user") + + def _get_password(self): + return self._password + + def _set_password(self, password): + self._password = encrypt(password) + + password = property(_get_password, _set_password) + password = synonym("_password", descriptor=password) + + @property + def __name__(self): + return self.name + + def __init__(self, name=None, password=None, locked_out=None, id_=None): + self.name = name + self.password = password + self.locked_out = locked_out + self.id = id_ + + @classmethod + def auth(cls, name: str, password: str, db: Session): + if password is None: + return None + user = db.query(User).filter(User.name.ilike(name)).first() + if not user: + return None + if user.password != encrypt(password) or user.locked_out: + return None + else: + return user + + +def encrypt(val): + return md5(val.encode("utf-8") + "v2".encode("utf-8")).hexdigest() diff --git a/barker/barker/models/user_roles.py b/barker/barker/models/user_roles.py new file mode 100644 index 0000000..54cf99b --- /dev/null +++ b/barker/barker/models/user_roles.py @@ -0,0 +1,15 @@ +import uuid + +from barker.models.meta import Base +from sqlalchemy import Column, ForeignKey, Table, UniqueConstraint, text +from sqlalchemy.dialects.postgresql import UUID + + +user_roles = Table( + "user_roles", + Base.metadata, + Column("id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4), + Column("user_id", UUID(as_uuid=True), ForeignKey("users.id"), nullable=False), + Column("role_id", UUID(as_uuid=True), ForeignKey("roles.id"), nullable=False), + UniqueConstraint("user_id", "role_id"), +) diff --git a/barker/barker/models/voucher.py b/barker/barker/models/voucher.py index a6b7628..35aa3a1 100644 --- a/barker/barker/models/voucher.py +++ b/barker/barker/models/voucher.py @@ -1,104 +1,20 @@ import uuid -from datetime import datetime -from decimal import Decimal - from sqlalchemy import ( - Boolean, Column, DateTime, Enum, ForeignKey, Integer, - Numeric, Unicode, UniqueConstraint, - case, - func, text, ) from sqlalchemy.dialects.postgresql import UUID -from sqlalchemy.ext.hybrid import hybrid_property -from sqlalchemy.orm import backref, relationship +from sqlalchemy.orm import relationship -from .master import Product, VoucherType from .meta import Base - - -class GuestBook(Base): - __tablename__ = "guest_book" - id = Column( - "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 - ) - customer_id = Column("customer_id", UUID(as_uuid=True), ForeignKey("customers.id"), nullable=False) - pax = Column("pax", Integer, nullable=False) - date = Column("creation_date", DateTime(timezone=True), nullable=False) - - customer = relationship("Customer") - - def __init__(self, pax=None, id_=None, customer_id=None, customer=None): - self.customer_id = customer_id - self.pax = pax - self.id = id_ - self.date = datetime.utcnow() - if customer is None: - self.customer_id = customer_id - else: - self.customer = customer - - -class Overview(Base): - __tablename__ = "overview" - id = Column( - "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 - ) - voucher_id = Column( - "voucher_id", - UUID(as_uuid=True), - ForeignKey("vouchers.id"), - nullable=False, - unique=True, - ) - food_table_id = Column( - "food_table_id", - UUID(as_uuid=True), - ForeignKey("food_tables.id"), - nullable=False, - unique=True, - ) - guest_book_id = Column("guest_book_id", UUID(as_uuid=True), ForeignKey("guest_book.id"), unique=True) - status = Column("status", Unicode(255), nullable=False) - - voucher = relationship("Voucher", backref=backref("status", uselist=False)) - food_table = relationship("FoodTable", backref=backref("status", uselist=False)) - guest = relationship("GuestBook", backref=backref("status", uselist=False)) - - def __init__(self, voucher_id, food_table_id, guest_book_id, status, id_=None): - self.voucher_id = voucher_id - self.food_table_id = food_table_id - self.guest_book_id = guest_book_id - self.status = status - self.id = id_ - - -class InventoryModifier(Base): - __tablename__ = "inventory_modifiers" - __table_args__ = (UniqueConstraint("inventory_id", "modifier_id"),) - - id = Column( - "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 - ) - inventory_id = Column("inventory_id", UUID(as_uuid=True), ForeignKey("inventories.id"), nullable=False) - modifier_id = Column("modifier_id", UUID(as_uuid=True), ForeignKey("modifiers.id"), nullable=False) - price = Column("price", Numeric(precision=15, scale=2), nullable=False) - - inventory = relationship("Inventory", backref="modifiers") - modifier = relationship("Modifier") - - def __init__(self, inventory_id, modifier_id, price): - self.inventory_id = inventory_id - self.modifier_id = modifier_id - self.price = price +from .voucher_type import VoucherType class Voucher(Base): @@ -190,173 +106,3 @@ class Voucher(Base): @property def amount(self): return round(sum(i.amount for k in self.kots for i in k.inventories), 2) - - -class Kot(Base): - __tablename__ = "kots" - - id = Column( - "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 - ) - voucher_id = Column( - "voucher_id", - UUID(as_uuid=True), - ForeignKey("vouchers.id"), - nullable=False, - index=True, - ) - code = Column("code", Integer, nullable=False, unique=True) - food_table_id = Column( - "food_table_id", - UUID(as_uuid=True), - ForeignKey("food_tables.id"), - nullable=False, - ) - date = Column("date", DateTime, nullable=False, index=True) - user_id = Column("user_id", UUID(as_uuid=True), ForeignKey("users.id"), nullable=False) - - user = relationship("User", backref="kots") - food_table = relationship("FoodTable", backref="kots") - - def __init__( - self, - voucher_id=None, - code=None, - food_table_id=None, - date=None, - user_id=None, - id_=None, - ): - self.id = id_ - self.voucher_id = voucher_id - self.code = code - self.food_table_id = food_table_id - self.date = date - self.user_id = user_id - - -class Settlement(Base): - __tablename__ = "settlements" - __table_args__ = (UniqueConstraint("voucher_id", "settled"),) - - id = Column( - "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 - ) - voucher_id = Column( - "voucher_id", - UUID(as_uuid=True), - ForeignKey("vouchers.id"), - nullable=False, - index=True, - ) - settled = Column("settled", Integer, ForeignKey("settle_options.id"), nullable=False) - amount = Column("amount", Numeric(precision=15, scale=2), nullable=False) - - settle_option = relationship("SettleOption") - - def __init__(self, voucher_id=None, settled=None, amount=None, id_=None): - self.id = id_ - self.voucher_id = voucher_id - self.settled = settled - self.amount = amount - - -class Reprint(Base): - __tablename__ = "reprints" - - id = Column( - "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 - ) - date = Column("date", DateTime, nullable=False, index=True) - voucher_id = Column( - "voucher_id", - UUID(as_uuid=True), - ForeignKey("vouchers.id"), - nullable=False, - index=True, - ) - user_id = Column("user_id", UUID(as_uuid=True), ForeignKey("users.id"), nullable=False) - - user = relationship("User", backref="reprints") - - def __init__(self, voucher_id=None, user_id=None, id_=None): - self.id = id_ - self.date = datetime.now() - self.voucher_id = voucher_id - self.user_id = user_id - - -class Inventory(Base): - __tablename__ = "inventories" - __table_args__ = (UniqueConstraint("kot_id", "product_id", "is_happy_hour", "price"),) - - id = Column( - "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 - ) - kot_id = Column("kot_id", UUID(as_uuid=True), ForeignKey("kots.id"), nullable=False, index=True) - product_id = Column("product_id", UUID(as_uuid=True), ForeignKey("products.id"), nullable=False) - quantity = Column("quantity", Numeric(precision=15, scale=2)) - price = Column("price", Numeric(precision=15, scale=2)) - is_happy_hour = Column("is_happy_hour", Boolean, nullable=False) - tax_rate = Column("tax_rate", Numeric(precision=15, scale=5)) - tax_id = Column("tax_id", UUID(as_uuid=True), ForeignKey("taxes.id"), nullable=False) - discount = Column("discount", Numeric(precision=15, scale=5)) - sort_order = Column("sort_order", Integer, nullable=False) - - kot = relationship("Kot", backref="inventories") - tax = relationship("Tax", foreign_keys=tax_id) - product = relationship("ProductVersion", secondary=Product.__table__, backref="inventories") - - def __init__( - self, - kot_id, - product_id, - quantity, - price, - discount, - is_hh, - tax_id, - tax_rate, - sort_order, - ): - self.kot_id = kot_id - self.product_id = product_id - self.quantity = quantity - self.price = price - self.discount = discount - self.is_happy_hour = is_hh - self.tax_id = tax_id - self.tax_rate = tax_rate - self.sort_order = sort_order - - @hybrid_property - def effective_price(self): - return 0 if self.is_happy_hour else self.price - - @effective_price.expression - def effective_price(cls): - return case([(cls.is_happy_hour == True, 0)], else_=cls.price) # noqa: E712 - - @hybrid_property - def net(self): - return self.effective_price * self.quantity * (1 - self.discount) - - @net.expression - def net(cls): - return cls.effective_price * cls.quantity * (1 - cls.discount) - - @hybrid_property - def tax_amount(self): - return self.net * self.tax_rate - - @tax_amount.expression - def tax_amount(cls): - return cls.net * cls.tax_rate - - @hybrid_property - def amount(self): - return round(Decimal(self.net * (1 + self.tax_rate)), 2) - - @amount.expression - def amount(cls): - return func.round(cls.net * (1 + cls.tax_rate), 2) diff --git a/barker/barker/models/voucher_type.py b/barker/barker/models/voucher_type.py new file mode 100644 index 0000000..279c29c --- /dev/null +++ b/barker/barker/models/voucher_type.py @@ -0,0 +1,9 @@ +import enum + + +class VoucherType(enum.IntEnum): + KOT = 0 + REGULAR_BILL = 1 + NO_CHARGE = 2 + STAFF = 4 + VOID = 8 diff --git a/barker/barker/printing/bill.py b/barker/barker/printing/bill.py index 56db1f2..3a9a11d 100644 --- a/barker/barker/printing/bill.py +++ b/barker/barker/printing/bill.py @@ -13,14 +13,13 @@ from sqlalchemy import and_, or_ from sqlalchemy.orm import Session from ..core.arq import settings as redis_settings -from ..models.master import ( - DbSetting, - Printer, - ProductVersion, - SectionPrinter, - VoucherType, -) -from ..models.voucher import Inventory, Voucher +from ..models.db_setting import DbSetting +from ..models.inventory import Inventory +from ..models.printer import Printer +from ..models.product_version import ProductVersion +from ..models.section_printer import SectionPrinter +from ..models.voucher import Voucher +from ..models.voucher_type import VoucherType from . import currency_format, format_no_decimals diff --git a/barker/barker/printing/cashier_report.py b/barker/barker/printing/cashier_report.py index a70baea..42b66f9 100644 --- a/barker/barker/printing/cashier_report.py +++ b/barker/barker/printing/cashier_report.py @@ -9,8 +9,9 @@ from barker.schemas.cashier_report import CashierReport from sqlalchemy.orm import Session from ..core.arq import settings as redis_settings -from ..models.auth import Device -from ..models.master import Printer, SectionPrinter +from ..models.device import Device +from ..models.printer import Printer +from ..models.section_printer import SectionPrinter from . import currency_format diff --git a/barker/barker/printing/discount_report.py b/barker/barker/printing/discount_report.py index b391157..50d6432 100644 --- a/barker/barker/printing/discount_report.py +++ b/barker/barker/printing/discount_report.py @@ -6,8 +6,9 @@ from arq import ArqRedis, create_pool from sqlalchemy.orm import Session from ..core.arq import settings as redis_settings -from ..models.auth import Device -from ..models.master import Printer, SectionPrinter +from ..models.device import Device +from ..models.printer import Printer +from ..models.section_printer import SectionPrinter from ..schemas.discount_report import DiscountReport from . import currency_format diff --git a/barker/barker/printing/kot.py b/barker/barker/printing/kot.py index 71fdc3c..98c4b27 100644 --- a/barker/barker/printing/kot.py +++ b/barker/barker/printing/kot.py @@ -10,8 +10,12 @@ from sqlalchemy import and_, or_ from sqlalchemy.orm import Session from ..core.arq import settings as redis_settings -from ..models.master import Printer, ProductVersion, SectionPrinter -from ..models.voucher import Inventory, Kot, Voucher +from ..models.inventory import Inventory +from ..models.kot import Kot +from ..models.printer import Printer +from ..models.product_version import ProductVersion +from ..models.section_printer import SectionPrinter +from ..models.voucher import Voucher def design_kot(voucher: Voucher, kot: Kot, items: List[Inventory], copy_number: int, db: Session) -> str: diff --git a/barker/barker/printing/sale_report.py b/barker/barker/printing/sale_report.py index cce2e89..11f4e93 100644 --- a/barker/barker/printing/sale_report.py +++ b/barker/barker/printing/sale_report.py @@ -8,8 +8,9 @@ from arq import ArqRedis, create_pool from sqlalchemy.orm import Session from ..core.arq import settings as redis_settings -from ..models.auth import Device -from ..models.master import Printer, SectionPrinter +from ..models.device import Device +from ..models.printer import Printer +from ..models.section_printer import SectionPrinter from ..schemas.sale_report import SaleReport from . import currency_format diff --git a/barker/barker/routers/customer.py b/barker/barker/routers/customer.py index a52ef5d..aa15139 100644 --- a/barker/barker/routers/customer.py +++ b/barker/barker/routers/customer.py @@ -10,7 +10,7 @@ from sqlalchemy.orm import Session from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal -from ..models.master import Customer +from ..models.customer import Customer from ..schemas.user_token import UserToken diff --git a/barker/barker/routers/device.py b/barker/barker/routers/device.py index 30ae897..deb8e9f 100644 --- a/barker/barker/routers/device.py +++ b/barker/barker/routers/device.py @@ -10,7 +10,8 @@ from sqlalchemy.orm import Session from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal -from ..models.auth import Device, LoginHistory +from ..models.device import Device +from ..models.login_history import LoginHistory from ..schemas.user_token import UserToken diff --git a/barker/barker/routers/guest_book.py b/barker/barker/routers/guest_book.py index 3b9bb30..e3bb764 100644 --- a/barker/barker/routers/guest_book.py +++ b/barker/barker/routers/guest_book.py @@ -12,8 +12,8 @@ from sqlalchemy.orm import Session from ..core.config import settings from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal -from ..models.master import Customer -from ..models.voucher import GuestBook +from ..models.customer import Customer +from ..models.guest_book import GuestBook from ..schemas.user_token import UserToken diff --git a/barker/barker/routers/header_footer.py b/barker/barker/routers/header_footer.py index b29e6b0..52ebc3d 100644 --- a/barker/barker/routers/header_footer.py +++ b/barker/barker/routers/header_footer.py @@ -6,7 +6,7 @@ from sqlalchemy.orm import Session from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal -from ..models.master import DbSetting +from ..models.db_setting import DbSetting from ..schemas.user_token import UserToken diff --git a/barker/barker/routers/login.py b/barker/barker/routers/login.py index 3eb9547..78d00aa 100644 --- a/barker/barker/routers/login.py +++ b/barker/barker/routers/login.py @@ -26,7 +26,7 @@ from ..core.security import ( get_current_active_user, ) from ..db.session import SessionLocal -from ..models.auth import LoginHistory +from ..models.login_history import LoginHistory from ..schemas.user_token import UserToken diff --git a/barker/barker/routers/menu_category.py b/barker/barker/routers/menu_category.py index 3348118..4cfa433 100644 --- a/barker/barker/routers/menu_category.py +++ b/barker/barker/routers/menu_category.py @@ -13,7 +13,8 @@ from sqlalchemy.orm import Session from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal -from ..models.master import MenuCategory, ProductVersion +from ..models.menu_category import MenuCategory +from ..models.product_version import ProductVersion from ..schemas.user_token import UserToken from . import effective_date diff --git a/barker/barker/routers/modifier.py b/barker/barker/routers/modifier.py index 3df6619..76af34e 100644 --- a/barker/barker/routers/modifier.py +++ b/barker/barker/routers/modifier.py @@ -10,7 +10,7 @@ from sqlalchemy.orm import Session from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal -from ..models.master import Modifier +from ..models.modifier import Modifier from ..schemas.user_token import UserToken diff --git a/barker/barker/routers/modifier_category.py b/barker/barker/routers/modifier_category.py index 361ada8..471c411 100644 --- a/barker/barker/routers/modifier_category.py +++ b/barker/barker/routers/modifier_category.py @@ -14,7 +14,10 @@ from sqlalchemy.orm import Session, contains_eager, joinedload from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal -from ..models.master import MenuCategory, ModifierCategory, Product, ProductVersion +from ..models.menu_category import MenuCategory +from ..models.modifier_category import ModifierCategory +from ..models.product import Product +from ..models.product_version import ProductVersion from ..schemas.user_token import UserToken from . import effective_date diff --git a/barker/barker/routers/printer.py b/barker/barker/routers/printer.py index 94d3974..5054624 100644 --- a/barker/barker/routers/printer.py +++ b/barker/barker/routers/printer.py @@ -10,7 +10,7 @@ from sqlalchemy.orm import Session from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal -from ..models.master import Printer +from ..models.printer import Printer from ..schemas.user_token import UserToken diff --git a/barker/barker/routers/product.py b/barker/barker/routers/product.py index 521ccd3..262dcfb 100644 --- a/barker/barker/routers/product.py +++ b/barker/barker/routers/product.py @@ -12,7 +12,10 @@ from sqlalchemy.orm import Session, contains_eager, joinedload from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal -from ..models.master import MenuCategory, Product, ProductVersion, SaleCategory +from ..models.menu_category import MenuCategory +from ..models.product import Product +from ..models.product_version import ProductVersion +from ..models.sale_category import SaleCategory from ..schemas.user_token import UserToken from . import effective_date diff --git a/barker/barker/routers/reports/beer_sale_report.py b/barker/barker/routers/reports/beer_sale_report.py index 90e0a57..4330abd 100644 --- a/barker/barker/routers/reports/beer_sale_report.py +++ b/barker/barker/routers/reports/beer_sale_report.py @@ -8,8 +8,11 @@ from sqlalchemy.sql.expression import func from ...core.config import settings from ...core.security import get_current_active_user as get_user from ...db.session import SessionLocal -from ...models.master import ProductVersion, VoucherType -from ...models.voucher import Inventory, Kot, Voucher +from ...models.inventory import Inventory +from ...models.kot import Kot +from ...models.product_version import ProductVersion +from ...models.voucher import Voucher +from ...models.voucher_type import VoucherType from ...schemas.user_token import UserToken from . import report_finish_date, report_start_date diff --git a/barker/barker/routers/reports/bill_settlement_report.py b/barker/barker/routers/reports/bill_settlement_report.py index 0d7725f..72e61e7 100644 --- a/barker/barker/routers/reports/bill_settlement_report.py +++ b/barker/barker/routers/reports/bill_settlement_report.py @@ -7,8 +7,11 @@ from sqlalchemy.orm import Session from ...core.config import settings from ...core.security import get_current_active_user as get_user from ...db.session import SessionLocal -from ...models.master import ReportingLevel, SettleOption -from ...models.voucher import Reprint, Settlement, Voucher +from ...models.reporting_level import ReportingLevel +from ...models.reprint import Reprint +from ...models.settle_option import SettleOption +from ...models.settlement import Settlement +from ...models.voucher import Voucher from ...schemas.bill_settlement_report import BillSettlement, BillSettlementItem from ...schemas.user_token import UserToken from . import report_finish_date, report_start_date diff --git a/barker/barker/routers/reports/cashier_report.py b/barker/barker/routers/reports/cashier_report.py index c068305..ed44d85 100644 --- a/barker/barker/routers/reports/cashier_report.py +++ b/barker/barker/routers/reports/cashier_report.py @@ -10,9 +10,10 @@ from sqlalchemy.orm import Session, joinedload from ...core.config import settings from ...core.security import get_current_active_user as get_user from ...db.session import SessionLocal -from ...models.auth import User -from ...models.master import ReportingLevel -from ...models.voucher import Settlement, Voucher +from ...models.reporting_level import ReportingLevel +from ...models.settlement import Settlement +from ...models.user import User +from ...models.voucher import Voucher from ...printing.cashier_report import print_cashier_report from ...schemas.cashier_report import ( CashierReport, diff --git a/barker/barker/routers/reports/discount_report.py b/barker/barker/routers/reports/discount_report.py index 0e0ab5d..873e602 100644 --- a/barker/barker/routers/reports/discount_report.py +++ b/barker/barker/routers/reports/discount_report.py @@ -10,8 +10,12 @@ from sqlalchemy.orm import Session from ...core.config import settings from ...core.security import get_current_active_user as get_user from ...db.session import SessionLocal -from ...models.master import ProductVersion, SaleCategory, VoucherType -from ...models.voucher import Inventory, Kot, Voucher +from ...models.inventory import Inventory +from ...models.kot import Kot +from ...models.product_version import ProductVersion +from ...models.sale_category import SaleCategory +from ...models.voucher import Voucher +from ...models.voucher_type import VoucherType from ...printing.discount_report import print_discount_report from ...schemas.discount_report import DiscountReport, DiscountReportItem from ...schemas.user_token import UserToken diff --git a/barker/barker/routers/reports/product_sale_report.py b/barker/barker/routers/reports/product_sale_report.py index 21165a5..a94cccb 100644 --- a/barker/barker/routers/reports/product_sale_report.py +++ b/barker/barker/routers/reports/product_sale_report.py @@ -7,8 +7,13 @@ from sqlalchemy.orm import Session from ...core.config import settings from ...core.security import get_current_active_user as get_user from ...db.session import SessionLocal -from ...models.master import MenuCategory, ProductVersion, SaleCategory, VoucherType -from ...models.voucher import Inventory, Kot, Voucher +from ...models.inventory import Inventory +from ...models.kot import Kot +from ...models.menu_category import MenuCategory +from ...models.product_version import ProductVersion +from ...models.sale_category import SaleCategory +from ...models.voucher import Voucher +from ...models.voucher_type import VoucherType from ...schemas import to_camel from ...schemas.user_token import UserToken from . import report_finish_date, report_start_date diff --git a/barker/barker/routers/reports/product_updates_report.py b/barker/barker/routers/reports/product_updates_report.py index 2111d3e..f5fa216 100644 --- a/barker/barker/routers/reports/product_updates_report.py +++ b/barker/barker/routers/reports/product_updates_report.py @@ -7,7 +7,8 @@ from sqlalchemy.orm import Session, contains_eager, joinedload from ...core.security import get_current_active_user as get_user from ...db.session import SessionLocal -from ...models.master import MenuCategory, ProductVersion +from ...models.menu_category import MenuCategory +from ...models.product_version import ProductVersion from ...schemas.user_token import UserToken from . import report_finish_date, report_start_date diff --git a/barker/barker/routers/reports/sale_report.py b/barker/barker/routers/reports/sale_report.py index 0aad662..92aa402 100644 --- a/barker/barker/routers/reports/sale_report.py +++ b/barker/barker/routers/reports/sale_report.py @@ -10,8 +10,14 @@ from sqlalchemy.orm import Session from ...core.config import settings from ...core.security import get_current_active_user as get_user from ...db.session import SessionLocal -from ...models.master import ProductVersion, SaleCategory, SettleOption, VoucherType -from ...models.voucher import Inventory, Kot, Settlement, Voucher +from ...models.inventory import Inventory +from ...models.kot import Kot +from ...models.product_version import ProductVersion +from ...models.sale_category import SaleCategory +from ...models.settle_option import SettleOption +from ...models.settlement import Settlement +from ...models.voucher import Voucher +from ...models.voucher_type import VoucherType from ...printing.sale_report import print_sale_report from ...schemas.sale_report import SaleReport, SaleReportItem from ...schemas.user import UserLink diff --git a/barker/barker/routers/reports/tax_report.py b/barker/barker/routers/reports/tax_report.py index 243f0d9..6811fe9 100644 --- a/barker/barker/routers/reports/tax_report.py +++ b/barker/barker/routers/reports/tax_report.py @@ -8,8 +8,11 @@ from sqlalchemy.orm import Session from ...core.config import settings from ...core.security import get_current_active_user as get_user from ...db.session import SessionLocal -from ...models.master import Tax, VoucherType -from ...models.voucher import Inventory, Kot, Voucher +from ...models.inventory import Inventory +from ...models.kot import Kot +from ...models.tax import Tax +from ...models.voucher import Voucher +from ...models.voucher_type import VoucherType from ...schemas.tax_report import TaxReport, TaxReportItem from ...schemas.user_token import UserToken from . import report_finish_date, report_start_date diff --git a/barker/barker/routers/role.py b/barker/barker/routers/role.py index 9c8ff1d..ad964e6 100644 --- a/barker/barker/routers/role.py +++ b/barker/barker/routers/role.py @@ -10,7 +10,8 @@ from sqlalchemy.orm import Session from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal -from ..models.auth import Permission, Role +from ..models.permission import Permission +from ..models.role import Role from ..schemas.user_token import UserToken diff --git a/barker/barker/routers/sale_category.py b/barker/barker/routers/sale_category.py index a618287..9c0199f 100644 --- a/barker/barker/routers/sale_category.py +++ b/barker/barker/routers/sale_category.py @@ -10,7 +10,7 @@ from sqlalchemy.orm import Session from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal -from ..models.master import SaleCategory +from ..models.sale_category import SaleCategory from ..schemas.user_token import UserToken diff --git a/barker/barker/routers/section.py b/barker/barker/routers/section.py index d10501e..cd77d2d 100644 --- a/barker/barker/routers/section.py +++ b/barker/barker/routers/section.py @@ -10,7 +10,7 @@ from sqlalchemy.orm import Session from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal -from ..models.master import Section +from ..models.section import Section from ..schemas.user_token import UserToken diff --git a/barker/barker/routers/section_printer.py b/barker/barker/routers/section_printer.py index 35555d4..2a735de 100644 --- a/barker/barker/routers/section_printer.py +++ b/barker/barker/routers/section_printer.py @@ -12,7 +12,8 @@ from sqlalchemy.orm import Session from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal -from ..models.master import MenuCategory, SectionPrinter +from ..models.menu_category import MenuCategory +from ..models.section_printer import SectionPrinter from ..schemas.user_token import UserToken diff --git a/barker/barker/routers/setting.py b/barker/barker/routers/setting.py index 9e89825..12d8172 100644 --- a/barker/barker/routers/setting.py +++ b/barker/barker/routers/setting.py @@ -5,7 +5,7 @@ from sqlalchemy.orm import Session from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal -from ..models.master import DbSetting +from ..models.db_setting import DbSetting from ..schemas.user_token import UserToken diff --git a/barker/barker/routers/settle_option.py b/barker/barker/routers/settle_option.py index 85c8f64..a8ef0eb 100644 --- a/barker/barker/routers/settle_option.py +++ b/barker/barker/routers/settle_option.py @@ -9,7 +9,9 @@ from sqlalchemy.orm import Session from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal -from ..models.master import ReportingLevel, SettleOption, VoucherType +from ..models.reporting_level import ReportingLevel +from ..models.settle_option import SettleOption +from ..models.voucher_type import VoucherType from ..schemas.user_token import UserToken diff --git a/barker/barker/routers/table.py b/barker/barker/routers/table.py index 52c6ac0..d3baf75 100644 --- a/barker/barker/routers/table.py +++ b/barker/barker/routers/table.py @@ -10,8 +10,8 @@ from sqlalchemy.orm import Session from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal -from ..models.master import FoodTable -from ..models.voucher import Overview +from ..models.food_table import FoodTable +from ..models.overview import Overview from ..schemas.user_token import UserToken diff --git a/barker/barker/routers/tax.py b/barker/barker/routers/tax.py index 3ba4e4a..5029c41 100644 --- a/barker/barker/routers/tax.py +++ b/barker/barker/routers/tax.py @@ -13,8 +13,9 @@ from sqlalchemy.sql.functions import count from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal -from ..models.master import SaleCategory, Tax -from ..models.voucher import Inventory +from ..models.inventory import Inventory +from ..models.sale_category import SaleCategory +from ..models.tax import Tax from ..schemas.user_token import UserToken diff --git a/barker/barker/routers/update_product_prices.py b/barker/barker/routers/update_product_prices.py index 3e95e15..334a32a 100644 --- a/barker/barker/routers/update_product_prices.py +++ b/barker/barker/routers/update_product_prices.py @@ -10,7 +10,8 @@ from sqlalchemy.orm import Session, contains_eager, joinedload from ..core.security import get_current_active_user as get_user from ..db.session import SessionLocal -from ..models.master import MenuCategory, ProductVersion +from ..models.menu_category import MenuCategory +from ..models.product_version import ProductVersion from ..schemas.update_product_prices import UpdateProductPrices, UpdateProductPricesItem from ..schemas.user_token import UserToken from . import optional_query_date diff --git a/barker/barker/routers/user.py b/barker/barker/routers/user.py index 41c66e0..91d64d8 100644 --- a/barker/barker/routers/user.py +++ b/barker/barker/routers/user.py @@ -6,7 +6,8 @@ import barker.schemas.user as schemas from barker.core.security import get_current_active_user as get_user from barker.db.session import SessionLocal -from barker.models.auth import Role, User +from barker.models.role import Role +from barker.models.user import User from barker.schemas.user_token import UserToken from fastapi import APIRouter, Depends, HTTPException, Security, status from sqlalchemy.exc import SQLAlchemyError diff --git a/barker/barker/routers/voucher/__init__.py b/barker/barker/routers/voucher/__init__.py index 7b9c00f..1da87fe 100644 --- a/barker/barker/routers/voucher/__init__.py +++ b/barker/barker/routers/voucher/__init__.py @@ -9,8 +9,12 @@ from fastapi import HTTPException, status from sqlalchemy import func from sqlalchemy.orm import Session -from ...models.master import SettleOption, VoucherType -from ...models.voucher import GuestBook, Overview, Settlement, Voucher +from ...models.guest_book import GuestBook +from ...models.overview import Overview +from ...models.settle_option import SettleOption +from ...models.settlement import Settlement +from ...models.voucher import Voucher +from ...models.voucher_type import VoucherType from ...schemas.receive_payment import ReceivePaymentItem as SettleSchema diff --git a/barker/barker/routers/voucher/change.py b/barker/barker/routers/voucher/change.py index 7187574..def8392 100644 --- a/barker/barker/routers/voucher/change.py +++ b/barker/barker/routers/voucher/change.py @@ -10,8 +10,11 @@ from sqlalchemy.orm import Session from ...core.security import get_current_active_user as get_user from ...db.session import SessionLocal -from ...models.master import SettleOption, VoucherType -from ...models.voucher import Overview, Reprint, Voucher +from ...models.overview import Overview +from ...models.reprint import Reprint +from ...models.settle_option import SettleOption +from ...models.voucher import Voucher +from ...models.voucher_type import VoucherType from ...routers.voucher import do_update_settlements, get_guest_book from ...schemas.receive_payment import ReceivePaymentItem as SettleSchema from ...schemas.user_token import UserToken diff --git a/barker/barker/routers/voucher/merge_move.py b/barker/barker/routers/voucher/merge_move.py index 4b68898..18723a3 100644 --- a/barker/barker/routers/voucher/merge_move.py +++ b/barker/barker/routers/voucher/merge_move.py @@ -12,8 +12,11 @@ from sqlalchemy.orm import Session from ...core.security import get_current_active_user as get_user from ...db.session import SessionLocal -from ...models.master import VoucherType -from ...models.voucher import Kot, Overview, Settlement, Voucher +from ...models.kot import Kot +from ...models.overview import Overview +from ...models.settlement import Settlement +from ...models.voucher import Voucher +from ...models.voucher_type import VoucherType from ...routers.voucher import do_update_settlements, do_update_table, get_bill_id from ...schemas.user_token import UserToken diff --git a/barker/barker/routers/voucher/receive_payment.py b/barker/barker/routers/voucher/receive_payment.py index 0b69f5a..0b63f41 100644 --- a/barker/barker/routers/voucher/receive_payment.py +++ b/barker/barker/routers/voucher/receive_payment.py @@ -8,8 +8,10 @@ from sqlalchemy.orm import Session from ...core.security import get_current_active_user as get_user from ...db.session import SessionLocal -from ...models.master import SettleOption, VoucherType -from ...models.voucher import Overview, Voucher +from ...models.overview import Overview +from ...models.settle_option import SettleOption +from ...models.voucher import Voucher +from ...models.voucher_type import VoucherType from ...schemas.user_token import UserToken from . import do_update_settlements diff --git a/barker/barker/routers/voucher/save.py b/barker/barker/routers/voucher/save.py index 5de9f79..9753c47 100644 --- a/barker/barker/routers/voucher/save.py +++ b/barker/barker/routers/voucher/save.py @@ -13,8 +13,13 @@ from sqlalchemy.orm import Session from ...core.config import settings from ...core.security import get_current_active_user as get_user from ...db.session import SessionLocal -from ...models.master import ProductVersion, VoucherType -from ...models.voucher import GuestBook, Inventory, InventoryModifier, Kot, Voucher +from ...models.guest_book import GuestBook +from ...models.inventory import Inventory +from ...models.inventory_modifier import InventoryModifier +from ...models.kot import Kot +from ...models.product_version import ProductVersion +from ...models.voucher import Voucher +from ...models.voucher_type import VoucherType from ...printing.bill import print_bill from ...printing.kot import print_kot from ...routers.voucher import ( diff --git a/barker/barker/routers/voucher/show.py b/barker/barker/routers/voucher/show.py index 1c45b9e..ac7ceca 100644 --- a/barker/barker/routers/voucher/show.py +++ b/barker/barker/routers/voucher/show.py @@ -10,8 +10,12 @@ from sqlalchemy.orm import Session from ...core.security import get_current_active_user as get_user from ...db.session import SessionLocal -from ...models.master import FoodTable, ProductVersion, VoucherType -from ...models.voucher import GuestBook, Overview, Voucher +from ...models.food_table import FoodTable +from ...models.guest_book import GuestBook +from ...models.overview import Overview +from ...models.product_version import ProductVersion +from ...models.voucher import Voucher +from ...models.voucher_type import VoucherType from ...schemas.user_token import UserToken diff --git a/barker/barker/routers/voucher/split.py b/barker/barker/routers/voucher/split.py index 3104576..0f55e1b 100644 --- a/barker/barker/routers/voucher/split.py +++ b/barker/barker/routers/voucher/split.py @@ -14,8 +14,13 @@ from sqlalchemy.orm import Session from ...core.security import get_current_active_user as get_user from ...db.session import SessionLocal -from ...models.master import SettleOption, VoucherType -from ...models.voucher import Inventory, InventoryModifier, Kot, Overview, Voucher +from ...models.inventory import Inventory +from ...models.inventory_modifier import InventoryModifier +from ...models.kot import Kot +from ...models.overview import Overview +from ...models.settle_option import SettleOption +from ...models.voucher import Voucher +from ...models.voucher_type import VoucherType from ...routers.voucher import ( check_permissions, do_update_settlements, diff --git a/barker/barker/routers/voucher/update.py b/barker/barker/routers/voucher/update.py index bcdab88..2d3bb3c 100644 --- a/barker/barker/routers/voucher/update.py +++ b/barker/barker/routers/voucher/update.py @@ -13,8 +13,12 @@ from sqlalchemy.orm import Session from ...core.config import settings from ...core.security import get_current_active_user as get_user from ...db.session import SessionLocal -from ...models.master import ProductVersion, VoucherType -from ...models.voucher import Inventory, InventoryModifier, Kot, Voucher +from ...models.inventory import Inventory +from ...models.inventory_modifier import InventoryModifier +from ...models.kot import Kot +from ...models.product_version import ProductVersion +from ...models.voucher import Voucher +from ...models.voucher_type import VoucherType from ...printing.bill import print_bill from ...printing.kot import print_kot from ...routers.voucher import ( diff --git a/barker/barker/routers/voucher/void.py b/barker/barker/routers/voucher/void.py index 67c7214..2da34df 100644 --- a/barker/barker/routers/voucher/void.py +++ b/barker/barker/routers/voucher/void.py @@ -6,8 +6,10 @@ from sqlalchemy.orm import Session from ...core.security import get_current_active_user as get_user from ...db.session import SessionLocal -from ...models.master import SettleOption, VoucherType -from ...models.voucher import Overview, Voucher +from ...models.overview import Overview +from ...models.settle_option import SettleOption +from ...models.voucher import Voucher +from ...models.voucher_type import VoucherType from ...schemas.receive_payment import ReceivePaymentItem as SettleSchema from ...schemas.user_token import UserToken from . import do_update_settlements diff --git a/barker/barker/schemas/settle_option.py b/barker/barker/schemas/settle_option.py index 802e905..e115fbc 100644 --- a/barker/barker/schemas/settle_option.py +++ b/barker/barker/schemas/settle_option.py @@ -1,6 +1,7 @@ from pydantic import BaseModel -from ..models.master import ReportingLevel, VoucherType +from ..models.reporting_level import ReportingLevel +from ..models.voucher_type import VoucherType from . import to_camel diff --git a/barker/barker/subscribers.py b/barker/barker/subscribers.py index 5303d78..2eb99fb 100644 --- a/barker/barker/subscribers.py +++ b/barker/barker/subscribers.py @@ -1,4 +1,4 @@ -from barker.models.master import DbSetting +from barker.models.db_setting import DbSetting from pyramid.events import NewRequest, subscriber from pyramid.httpexceptions import HTTPServiceUnavailable diff --git a/barker/pyproject.toml b/barker/pyproject.toml index 11140ac..520f30b 100644 --- a/barker/pyproject.toml +++ b/barker/pyproject.toml @@ -6,26 +6,27 @@ authors = ["tanshu "] [tool.poetry.dependencies] python = "^3.8" -uvicorn = "^0.12.3" -fastapi = "^0.62.0" +uvicorn = {extras = ["standard"], version = "^0.13.4"} +fastapi = "^0.63.0" python-jose = {extras = ["cryptography"], version = "^3.2.0"} passlib = {extras = ["bcrypt"], version = "^1.7.4"} psycopg2-binary = "^2.8.6" -SQLAlchemy = "^1.3.20" +SQLAlchemy = "^1.4.0" python-multipart = "^0.0.5" PyJWT = "^1.7.1" -alembic = "^1.4.3" +alembic = "^1.5.7" itsdangerous = "^1.1.0" python-dotenv = "^0.14.0" -pydantic = {extras = ["dotenv"], version = "^1.7.3"} +pydantic = {extras = ["dotenv"], version = "^1.8.1"} starlette = "^0.13.6" arq = "^0.19.1" +aiohttp = "^3.7.4" [tool.poetry.dev-dependencies] -flake8 = "^3.8.4" +flake8 = "^3.9.0" black = "^20.8b1" -isort = "^5.6.2" -pre-commit = "^2.9.3" +isort = {extras = ["toml"], version = "^5.7.0"} +pre-commit = "^2.11.1" [build-system] requires = ["poetry-core>=1.0.0"] diff --git a/barker/worker-start.sh b/barker/worker-start.sh old mode 100644 new mode 100755 diff --git a/bookie/.editorconfig b/bookie/.editorconfig index e89330a..59d9a3a 100644 --- a/bookie/.editorconfig +++ b/bookie/.editorconfig @@ -8,6 +8,9 @@ indent_size = 2 insert_final_newline = true trim_trailing_whitespace = true +[*.ts] +quote_type = single + [*.md] max_line_length = off trim_trailing_whitespace = false diff --git a/bookie/.eslintrc.json b/bookie/.eslintrc.json index 8931adf..354a261 100644 --- a/bookie/.eslintrc.json +++ b/bookie/.eslintrc.json @@ -16,19 +16,13 @@ "createDefaultProgram": true }, "extends": [ - "plugin:@angular-eslint/ng-cli-compat", - "plugin:@angular-eslint/ng-cli-compat--formatting-add-on", + "plugin:@angular-eslint/recommended", "plugin:@angular-eslint/template/process-inline-templates" ], + "plugins": [ + "import" + ], "rules": { - "@angular-eslint/component-selector": [ - "error", - { - "type": "element", - "prefix": "app", - "style": "kebab-case" - } - ], "@angular-eslint/directive-selector": [ "error", { @@ -37,6 +31,14 @@ "style": "camelCase" } ], + "@angular-eslint/component-selector": [ + "error", + { + "type": "element", + "prefix": "app", + "style": "kebab-case" + } + ], "@typescript-eslint/lines-between-class-members": [ "error", "always", @@ -51,14 +53,9 @@ "newlines-between": "always" } ], - "@typescript-eslint/naming-convention": [ - "off" - ], "@typescript-eslint/no-explicit-any": [ "error" - ], - "no-shadow": "off", - "@typescript-eslint/no-shadow": "error" + ] } }, { diff --git a/bookie/package.json b/bookie/package.json index 0a30d64..dc74c72 100644 --- a/bookie/package.json +++ b/bookie/package.json @@ -14,57 +14,56 @@ }, "private": true, "dependencies": { - "@angular/animations": "^11.0.5", - "@angular/cdk": "^11.0.3", - "@angular/common": "^11.0.5", - "@angular/compiler": "^11.0.5", - "@angular/core": "^11.0.5", + "@angular/animations": "^11.1.0", + "@angular/cdk": "^11.1.0", + "@angular/common": "^11.1.0", + "@angular/compiler": "^11.1.0", + "@angular/core": "^11.1.0", "@angular/flex-layout": "^11.0.0-beta.33", - "@angular/forms": "^11.0.5", - "@angular/material": "^11.0.3", - "@angular/material-moment-adapter": "^11.0.3", - "@angular/platform-browser": "^11.0.5", - "@angular/platform-browser-dynamic": "^11.0.5", - "@angular/router": "^11.0.5", - "mathjs": "^8.1.0", + "@angular/forms": "^11.1.0", + "@angular/material": "^11.1.0", + "@angular/material-moment-adapter": "^11.1.0", + "@angular/platform-browser": "^11.1.0", + "@angular/platform-browser-dynamic": "^11.1.0", + "@angular/router": "^11.1.0", + "mathjs": "^9.0.0", "moment": "^2.29.1", "rxjs": "^6.6.3", - "tslib": "^2.0.0", + "tslib": "^2.1.0", "zone.js": "^0.11.3" }, "devDependencies": { - "@angular-devkit/build-angular": "~0.1100.5", - "@angular-eslint/builder": "^0.8.0-beta.6", - "@angular-eslint/eslint-plugin": "^0.8.0-beta.6", - "@angular-eslint/eslint-plugin-template": "^0.8.0-beta.6", - "@angular-eslint/schematics": "^0.8.0-beta.6", - "@angular-eslint/template-parser": "^0.8.0-beta.6", - "@angular/cli": "^11.0.5", - "@angular/compiler-cli": "^11.0.5", - "@angular/language-service": "^11.0.5", - "@types/jasmine": "~3.6.2", - "@types/mathjs": "^6.0.9", - "@types/node": "^14.14.14", - "@typescript-eslint/eslint-plugin": "^4.10.0", - "@typescript-eslint/parser": "^4.10.0", - "eslint": "^7.16.0", - "eslint-config-prettier": "^7.1.0", + "@angular-devkit/build-angular": "~0.1101.1", + "@angular-eslint/builder": "^1.1.0", + "@angular-eslint/eslint-plugin": "^1.1.0", + "@angular-eslint/eslint-plugin-template": "^1.1.0", + "@angular-eslint/schematics": "^1.1.0", + "@angular-eslint/template-parser": "^1.1.0", + "@angular/cli": "^11.1.1", + "@angular/compiler-cli": "^11.1.0", + "@angular/language-service": "^11.1.0", + "@types/jasmine": "~3.6.3", + "@types/mathjs": "^6.0.11", + "@types/node": "^14.14.22", + "@typescript-eslint/eslint-plugin": "^4.14.0", + "@typescript-eslint/parser": "^4.14.0", + "eslint": "^7.18.0", "eslint-plugin-import": "^2.22.1", - "eslint-plugin-jsdoc": "^30.7.9", + "eslint-plugin-jsdoc": "^31.2.2", "eslint-plugin-prefer-arrow": "1.2.2", - "husky": "^4.3.6", + "husky": "^4.3.8", "jasmine-core": "^3.6.0", "jasmine-spec-reporter": "^6.0.0", - "karma": "^5.2.3", + "karma": "^6.0.1", "karma-chrome-launcher": "~3.1.0", "karma-coverage-istanbul-reporter": "~3.0.2", "karma-jasmine": "^4.0.0", "karma-jasmine-html-reporter": "^1.5.0", "lint-staged": "^10.5.3", "prettier": "^2.2.1", - "standard-version": "^9.0.0", + "standard-version": "^9.1.0", "ts-node": "^9.1.1", - "typescript": "~4.0.5" + "typescript": "^4.1.3" }, "husky": { "hooks": { diff --git a/deploy.sh b/deploy.sh index 46ede0c..2f9d244 100755 --- a/deploy.sh +++ b/deploy.sh @@ -19,7 +19,7 @@ fi cd docker/app || exit docker build --tag barker:latest . docker build --tag barker-worker:latest --file worker.Dockerfile . -cd ~/Programming/barker/docker || exit +cd "$parent_path/docker" || exit docker save barker:latest | bzip2 | pv | ssh tanshu@knox.tanshu.com 'bunzip2 | sudo docker load' docker save barker-worker:latest | bzip2 | pv | ssh tanshu@knox.tanshu.com 'bunzip2 | sudo docker load' ansible-playbook playbook-chd.yml