From 27aa4d12a6eb6a215e4f40ff2b73d14296c346e9 Mon Sep 17 00:00:00 2001 From: tanshu Date: Sun, 13 Dec 2020 09:44:32 +0530 Subject: [PATCH] Settle Options are now stored in the Database and can be updated --- DB/import.sh | 1 + .../48bc1c7c07ce_change_settle_options.py | 147 +++++++++++++++++ .../versions/8c06ac60d125_initial_commit.py | 135 ++++++++------- barker/barker/db/base.py | 55 ++++--- barker/barker/db/init_db.py | 6 +- barker/barker/main.py | 22 +-- barker/barker/models/__init__.py | 99 ----------- barker/barker/models/master.py | 68 ++++---- barker/barker/models/voucher.py | 27 +-- barker/barker/printing/bill.py | 5 +- barker/barker/printing/cashier_report.py | 3 +- barker/barker/printing/discount_report.py | 3 +- barker/barker/printing/kot.py | 3 +- barker/barker/printing/sale_report.py | 3 +- barker/barker/routers/modifier_category.py | 6 +- barker/barker/routers/product.py | 4 +- .../reports/beer_consumption_report.py | 3 +- .../routers/reports/bill_settlement_report.py | 15 +- .../barker/routers/reports/cashier_report.py | 10 +- .../barker/routers/reports/discount_report.py | 3 +- .../routers/reports/product_sale_report.py | 11 +- .../routers/reports/product_updates_report.py | 2 +- barker/barker/routers/reports/sale_report.py | 12 +- barker/barker/routers/reports/tax_report.py | 3 +- barker/barker/routers/settle_option.py | 154 ++++++++++++++++++ barker/barker/routers/table.py | 2 +- .../barker/routers/update_product_prices.py | 2 +- barker/barker/routers/voucher/__init__.py | 16 +- barker/barker/routers/voucher/change.py | 4 +- barker/barker/routers/voucher/merge_move.py | 3 +- .../barker/routers/voucher/receive_payment.py | 3 +- barker/barker/routers/voucher/save.py | 15 +- barker/barker/routers/voucher/show.py | 14 +- barker/barker/routers/voucher/split.py | 11 +- barker/barker/routers/voucher/update.py | 14 +- barker/barker/routers/voucher/void.py | 3 +- barker/barker/schemas/settle_option.py | 17 ++ bookie/src/app/app-routing.module.ts | 5 + bookie/src/app/core/receive-payment-item.ts | 6 +- bookie/src/app/core/receive-payment-list.ts | 5 - bookie/src/app/core/reporting-level.ts | 5 + bookie/src/app/core/settle-option.ts | 22 +++ bookie/src/app/home/home.component.html | 9 + .../sales/bill-type/bill-type.component.html | 2 +- .../sales/bill-type/bill-type.component.ts | 25 ++- bookie/src/app/sales/bill.service.ts | 8 +- bookie/src/app/sales/bills/bill.ts | 5 +- bookie/src/app/sales/bills/voucher-type.ts | 10 +- bookie/src/app/sales/bills/voucher.service.ts | 4 +- .../app/sales/home/sales-home.component.ts | 99 ++++------- .../receive-payment-datasource.ts | 8 +- .../receive-payment.component.html | 17 +- .../receive-payment.component.ts | 109 ++++++------- .../settle-option-detail.component.css | 3 + .../settle-option-detail.component.html | 54 ++++++ .../settle-option-detail.component.spec.ts | 26 +++ .../settle-option-detail.component.ts | 118 ++++++++++++++ ...ettle-option-list-resolver.service.spec.ts | 18 ++ .../settle-option-list-resolver.service.ts | 18 ++ .../settle-option-list-datasource.ts | 24 +++ .../settle-option-list.component.css | 0 .../settle-option-list.component.html | 47 ++++++ .../settle-option-list.component.spec.ts | 22 +++ .../settle-option-list.component.ts | 69 ++++++++ .../settle-option-resolver.service.spec.ts | 15 ++ .../settle-option-resolver.service.ts | 19 +++ .../settle-option.service.spec.ts | 15 ++ .../settle-option/settle-option.service.ts | 69 ++++++++ .../settle-options-routing.module.spec.ts | 13 ++ .../settle-options-routing.module.ts | 54 ++++++ .../settle-options.module.spec.ts | 13 ++ .../settle-option/settle-options.module.ts | 37 +++++ 72 files changed, 1326 insertions(+), 551 deletions(-) create mode 100644 barker/alembic/versions/48bc1c7c07ce_change_settle_options.py create mode 100644 barker/barker/routers/settle_option.py create mode 100644 barker/barker/schemas/settle_option.py delete mode 100644 bookie/src/app/core/receive-payment-list.ts create mode 100644 bookie/src/app/core/reporting-level.ts create mode 100644 bookie/src/app/core/settle-option.ts create mode 100644 bookie/src/app/settle-option/settle-option-detail/settle-option-detail.component.css create mode 100644 bookie/src/app/settle-option/settle-option-detail/settle-option-detail.component.html create mode 100644 bookie/src/app/settle-option/settle-option-detail/settle-option-detail.component.spec.ts create mode 100644 bookie/src/app/settle-option/settle-option-detail/settle-option-detail.component.ts create mode 100644 bookie/src/app/settle-option/settle-option-list-resolver.service.spec.ts create mode 100644 bookie/src/app/settle-option/settle-option-list-resolver.service.ts create mode 100644 bookie/src/app/settle-option/settle-option-list/settle-option-list-datasource.ts create mode 100644 bookie/src/app/settle-option/settle-option-list/settle-option-list.component.css create mode 100644 bookie/src/app/settle-option/settle-option-list/settle-option-list.component.html create mode 100644 bookie/src/app/settle-option/settle-option-list/settle-option-list.component.spec.ts create mode 100644 bookie/src/app/settle-option/settle-option-list/settle-option-list.component.ts create mode 100644 bookie/src/app/settle-option/settle-option-resolver.service.spec.ts create mode 100644 bookie/src/app/settle-option/settle-option-resolver.service.ts create mode 100644 bookie/src/app/settle-option/settle-option.service.spec.ts create mode 100644 bookie/src/app/settle-option/settle-option.service.ts create mode 100644 bookie/src/app/settle-option/settle-options-routing.module.spec.ts create mode 100644 bookie/src/app/settle-option/settle-options-routing.module.ts create mode 100644 bookie/src/app/settle-option/settle-options.module.spec.ts create mode 100644 bookie/src/app/settle-option/settle-options.module.ts diff --git a/DB/import.sh b/DB/import.sh index 432d909..b2bab52 100755 --- a/DB/import.sh +++ b/DB/import.sh @@ -34,6 +34,7 @@ docker run -it -v /home/tanshu/Programming/csv:/mnt --link postgres:db --rm --en docker run -it -v /home/tanshu/Programming/csv:/mnt --link postgres:db --rm --env PGPASSWORD="123456" postgres:alpine bash -c 'psql -h db -U postgres petty -c "\copy reprints(id, user_id, date, voucher_id) from /mnt/u-Reprints.csv"' docker run -it -v /home/tanshu/Programming/csv:/mnt --link postgres:db --rm --env PGPASSWORD="123456" postgres:alpine bash -c 'psql -h db -U postgres petty -c "\copy settings(id, name, data) from /mnt/v-Settings.csv"' docker run -it -v /home/tanshu/Programming/csv:/mnt --link postgres:db --rm --env PGPASSWORD="123456" postgres:alpine bash -c 'psql -h db -U postgres petty -c "\copy settlements(id, voucher_id, settled, amount) from /mnt/w-VoucherSettlements.csv"' +alembic upgrade 48bc1c7c07ce # Show the file in code to see the hidden chars # od -t c ~/Programming/csv/n-Printers.csv diff --git a/barker/alembic/versions/48bc1c7c07ce_change_settle_options.py b/barker/alembic/versions/48bc1c7c07ce_change_settle_options.py new file mode 100644 index 0000000..01a0e5c --- /dev/null +++ b/barker/alembic/versions/48bc1c7c07ce_change_settle_options.py @@ -0,0 +1,147 @@ +"""Change Settle Options + +Revision ID: 48bc1c7c07ce +Revises: 34fe3d061c5f +Create Date: 2020-12-10 08:29:39.175097 + +""" +import sqlalchemy as sa + +from alembic import op + +# revision identifiers, used by Alembic. +from sqlalchemy import column, table +from sqlalchemy.sql import expression + + +revision = "48bc1c7c07ce" +down_revision = "34fe3d061c5f" +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + reporting_level = sa.Enum("Skip", "Aggregate", "Detailed", name="reporting_level") + reporting_level.create(op.get_bind()) + voucher_type = sa.Enum("KOT", "REGULAR_BILL", "NO_CHARGE", "STAFF", "VOID", name="voucher_type") + voucher_type.create(op.get_bind()) + op.add_column( + "settle_options", sa.Column("has_reason", sa.Boolean(), nullable=False, server_default=expression.false()) + ) + op.add_column( + "settle_options", sa.Column("is_fixture", sa.Boolean(), nullable=False, server_default=expression.false()) + ) + op.add_column( + "settle_options", + sa.Column( + "reporting_level", + reporting_level, + nullable=False, + server_default="Skip", + ), + ) + op.add_column( + "settle_options", + sa.Column( + "voucher_type", + voucher_type, + nullable=False, + server_default="KOT", + ), + ) + + so = table( + "settle_options", + column("id", sa.Integer()), + column("is_fixture", sa.Boolean()), + column("has_reason", sa.Boolean()), + column("reporting_level", reporting_level), + column("voucher_type", voucher_type), + ) + + v = table( + "vouchers", + column("voucher_type_old", sa.Integer()), + column("voucher_type", voucher_type), + ) + + op.execute( + so.update() + .where(so.c.id == 1) # name = "Unsettled" + .values(reporting_level="Detailed", voucher_type="KOT", is_fixture=True) + ) + op.execute( + so.update() + .where(so.c.id == 2) # name = "Cash" + .values(reporting_level="Aggregate", voucher_type="REGULAR_BILL", is_fixture=False) + ) + op.execute( + so.update() + .where(so.c.id == 3) # name = "Credit Card" + .values(reporting_level="Detailed", voucher_type="REGULAR_BILL", is_fixture=False) + ) + op.execute( + so.update() + .where(so.c.id == 4) # name = "No Charge" + .values(reporting_level="Detailed", voucher_type="NO_CHARGE", has_reason=True, is_fixture=True) + ) + op.execute( + so.update() + .where(so.c.id == 5) # name = "Bill To Company" + .values(reporting_level="Detailed", voucher_type="REGULAR_BILL", is_fixture=False) + ) + op.execute( + so.update() + .where(so.c.id == 6) # name = "Tip" + .values(reporting_level="Detailed", voucher_type="REGULAR_BILL", is_fixture=True) + ) + op.execute( + so.update() + .where(so.c.id == 7) # name = "Round Off" + .values(reporting_level="Skip", voucher_type="KOT", is_fixture=True) + ) + op.execute( + so.update() + .where(so.c.id == 8) # name = "Amount" + .values(reporting_level="Skip", voucher_type="KOT", is_fixture=True) + ) + op.execute( + so.update() + .where(so.c.id == 9) # name = "Void" + .values(reporting_level="Detailed", voucher_type="VOID", has_reason=True, is_fixture=True) + ) + op.execute( + so.update() + .where(so.c.id == 10) # name = "Staff" + .values(reporting_level="Detailed", voucher_type="STAFF", has_reason=True, is_fixture=True) + ) + + op.drop_column("settle_options", "is_print") + op.drop_column("settle_options", "show_in_choices") + op.drop_column("settle_options", "display_group") + op.alter_column("vouchers", "voucher_type", new_column_name="voucher_type_old") + op.add_column( + "vouchers", + sa.Column( + "voucher_type", + voucher_type, + nullable=False, + server_default="KOT", + ), + ) + op.execute(v.update().where(v.c.voucher_type_old == 0).values(voucher_type="KOT")) + op.execute(v.update().where(v.c.voucher_type_old == 1).values(voucher_type="REGULAR_BILL")) + op.execute(v.update().where(v.c.voucher_type_old == 2).values(voucher_type="NO_CHARGE")) + op.execute(v.update().where(v.c.voucher_type_old == 4).values(voucher_type="STAFF")) + op.execute(v.update().where(v.c.voucher_type_old == 5).values(voucher_type="VOID")) + + op.drop_column("vouchers", "voucher_type_old") + + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + pass + # ### end Alembic commands ### diff --git a/barker/alembic/versions/8c06ac60d125_initial_commit.py b/barker/alembic/versions/8c06ac60d125_initial_commit.py index ac630f0..92ed545 100644 --- a/barker/alembic/versions/8c06ac60d125_initial_commit.py +++ b/barker/alembic/versions/8c06ac60d125_initial_commit.py @@ -8,8 +8,9 @@ Create Date: 2020-06-04 08:14:34.132248 import sqlalchemy as sa from alembic import op -from barker.models import Customer, DbSetting, ModifierCategory, Section, SettleOption from barker.models.auth import Permission, User # noqa +from barker.models.master import Customer, DbSetting, ModifierCategory, Section +from sqlalchemy import column, table from sqlalchemy.dialects import postgresql @@ -20,6 +21,68 @@ branch_labels = None depends_on = None +def settle_options(): + so = table( + "settle_options", + column("id", sa.Integer()), + column("name", sa.Unicode(length=255)), + column("show_in_choices", sa.Boolean()), + column("display_group", sa.Integer()), + column("is_print", sa.Boolean()), + ) + + op.execute( + so.insert().values( + id=1, + name="Unsettled", + show_in_choices=False, + display_group=1, + is_print=True, + ) + ) + op.execute(so.insert().values(id=2, name="Cash", show_in_choices=True, display_group=2, is_print=False)) + op.execute( + so.insert().values( + id=3, + name="Credit Card", + show_in_choices=True, + display_group=2, + is_print=True, + ) + ) + op.execute(so.insert().values(id=4, name="No Charge", show_in_choices=True, display_group=3, is_print=True)) + op.execute( + so.insert().values( + id=5, + name="Bill To Company", + show_in_choices=True, + display_group=2, + is_print=True, + ) + ) + op.execute(so.insert().values(id=6, name="Tip", show_in_choices=True, display_group=2, is_print=True)) + op.execute( + so.insert().values( + id=7, + name="Round Off", + show_in_choices=False, + display_group=1, + is_print=False, + ) + ) + op.execute(so.insert().values(id=8, name="Amount", show_in_choices=False, display_group=1, is_print=False)) + op.execute(so.insert().values(id=9, name="Void", show_in_choices=True, display_group=1, is_print=True)) + op.execute(so.insert().values(id=10, name="Staff", show_in_choices=True, display_group=4, is_print=True)) + op.execute( + Customer.__table__.insert().values( + id="2c716f4b-0736-429a-ad51-610d7c47cb5e", + name="Cash", + phone="", + address="", + ) + ) + + def upgrade(): # ### commands auto generated by Alembic - please adjust! ### op.create_table( @@ -536,74 +599,8 @@ def upgrade(): ) ) - op.execute( - SettleOption.__table__.insert().values( - id=1, - name="Unsettled", - show_in_choices=False, - display_group=1, - is_print=True, - ) - ) - op.execute( - SettleOption.__table__.insert().values(id=2, name="Cash", show_in_choices=True, display_group=2, is_print=False) - ) - op.execute( - SettleOption.__table__.insert().values( - id=3, - name="Credit Card", - show_in_choices=True, - display_group=2, - is_print=True, - ) - ) - op.execute( - SettleOption.__table__.insert().values( - id=4, name="No Charge", show_in_choices=True, display_group=3, is_print=True - ) - ) - op.execute( - SettleOption.__table__.insert().values( - id=5, - name="Bill To Company", - show_in_choices=True, - display_group=2, - is_print=True, - ) - ) - op.execute( - SettleOption.__table__.insert().values(id=6, name="Tip", show_in_choices=True, display_group=2, is_print=True) - ) - op.execute( - SettleOption.__table__.insert().values( - id=7, - name="Round Off", - show_in_choices=False, - display_group=1, - is_print=False, - ) - ) - op.execute( - SettleOption.__table__.insert().values( - id=8, name="Amount", show_in_choices=False, display_group=1, is_print=False - ) - ) - op.execute( - SettleOption.__table__.insert().values(id=9, name="Void", show_in_choices=True, display_group=1, is_print=True) - ) - op.execute( - SettleOption.__table__.insert().values( - id=10, name="Staff", show_in_choices=True, display_group=4, is_print=True - ) - ) - op.execute( - Customer.__table__.insert().values( - id="2c716f4b-0736-429a-ad51-610d7c47cb5e", - name="Cash", - phone="", - address="", - ) - ) + settle_options() + op.execute( DbSetting.__table__.insert().values( id="fb738ba2-a3c9-40ed-891c-b930e6454974", diff --git a/barker/barker/db/base.py b/barker/barker/db/base.py index ef8e298..faf9d54 100644 --- a/barker/barker/db/base.py +++ b/barker/barker/db/base.py @@ -1,30 +1,41 @@ # Import all the models, so that Base has them before being # imported by Alembic from barker.db.base_class import Base # noqa -from brewman.models import ( # noqa - Account, - AccountBase, - AccountType, - Attendance, - AttendanceType, - Batch, - Client, - CostCentre, - Employee, - EmployeeBenefit, - Fingerprint, - Inventory, - Journal, +from barker.models.auth import ( # noqa + Device, LoginHistory, Permission, - Product, - ProductGroup, - Recipe, - RecipeItem, Role, User, - Voucher, - VoucherType, - role_group, - user_group, + 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, + modifier_categories_products, +) +from barker.models.voucher import ( # noqa + GuestBook, + Inventory, + InventoryModifier, + Kot, + Overview, + Reprint, + Settlement, + Voucher, ) diff --git a/barker/barker/db/init_db.py b/barker/barker/db/init_db.py index e731531..ce03db8 100644 --- a/barker/barker/db/init_db.py +++ b/barker/barker/db/init_db.py @@ -1,15 +1,13 @@ import uuid from barker.core.config import settings # noqa: F401 -from barker.models import ( +from barker.models.auth import Permission, Role, User +from barker.models.master import ( Customer, DbSetting, ModifierCategory, - Permission, - Role, Section, SettleOption, - User, ) from brewman.db import base # noqa: F401 from sqlalchemy.orm import Session diff --git a/barker/barker/main.py b/barker/barker/main.py index 92c47c3..5a7cce3 100644 --- a/barker/barker/main.py +++ b/barker/barker/main.py @@ -19,6 +19,7 @@ from .routers import ( sale_category, section, section_printer, + settle_option, table, tax, update_product_prices, @@ -72,6 +73,7 @@ app.include_router(update_product_prices.router, prefix="/api/update-product-pri app.include_router(section.router, prefix="/api/sections", tags=["sections"]) app.include_router(section_printer.router, prefix="/api/section-printers", tags=["section-printers"]) +app.include_router(settle_option.router, prefix="/api/settle-options", tags=["settle-options"]) app.include_router(tax.router, prefix="/api/taxes", tags=["taxes"]) @@ -103,26 +105,6 @@ app.include_router(merge_move.router, prefix="/api", tags=["voucher"]) app.include_router(split.router, prefix="/api", tags=["voucher"]) app.include_router(change.router, prefix="/api/voucher", tags=["voucher"]) -# app.include_router(issue_grid.router, prefix="/api/issue-grid", tags=["vouchers"]) -# app.include_router(batch.router, prefix="/api/batch", tags=["vouchers"]) -# app.include_router(journal.router, prefix="/api/journal", tags=["vouchers"]) -# app.include_router(journal.router, prefix="/api/payment", tags=["vouchers"]) -# app.include_router(journal.router, prefix="/api/receipt", tags=["vouchers"]) -# app.include_router(purchase.router, prefix="/api/purchase", tags=["vouchers"]) -# app.include_router(purchase_return.router, prefix="/api/purchase-return", tags=["vouchers"]) -# app.include_router(issue.router, prefix="/api/issue", tags=["vouchers"]) -# app.include_router(employee_benefit.router, prefix="/api/employee-benefit", tags=["vouchers"]) -# app.include_router(incentive.router, prefix="/api/incentive", tags=["vouchers"]) -# app.include_router(credit_salary.router, prefix="/api/credit-salary", tags=["vouchers"]) -# app.include_router(voucher.router, prefix="/api", tags=["vouchers"]) - -# app.include_router(lock_information.router, prefix="/api/lock-information", tags=["settings"]) -# app.include_router(maintenance.router, prefix="/api/maintenance", tags=["settings"]) - -# app.include_router(db_integrity.router, prefix="/api/db-integrity", tags=["management"]) -# app.include_router(reset_stock.router, prefix="/api/reset-stock", tags=["management"]) -# app.include_router(rebase.router, prefix="/api/rebase", tags=["management"]) - def init(): uvicorn.run(app, host=settings.HOST, port=settings.PORT) diff --git a/barker/barker/models/__init__.py b/barker/barker/models/__init__.py index 0266113..e69de29 100644 --- a/barker/barker/models/__init__.py +++ b/barker/barker/models/__init__.py @@ -1,99 +0,0 @@ -from sqlalchemy import engine_from_config -from sqlalchemy.orm import configure_mappers, sessionmaker - -from .auth import Device, Permission, Role, User, role_permissions, user_roles -from .master import ( - Customer, - DbSetting, - FoodTable, - MenuCategory, - Modifier, - ModifierCategory, - Printer, - ProductNew, - ProductVersion, - SaleCategory, - Section, - SectionPrinter, - SettleOption, - Tax, -) - -# import or define all models here to ensure they are attached to the -# Base.metadata prior to any initialization routines -from .voucher import ( - GuestBook, - Inventory, - InventoryModifier, - Kot, - Overview, - Reprint, - Settlement, - Voucher, - VoucherType, -) - - -# run configure_mappers after defining all of the models to ensure -# all relationships can be setup -configure_mappers() - - -def get_engine(settings, prefix="sqlalchemy."): - return engine_from_config(settings, prefix) - - -def get_session_factory(engine): - factory = sessionmaker(expire_on_commit=False) - factory.configure(bind=engine) - return factory - - -def get_tm_session(session_factory, transaction_manager): - """ - Get a ``sqlalchemy.orm.Session`` instance backed by a transaction. - - This function will hook the session to the transaction manager which - will take care of committing any changes. - - - When using pyramid_tm it will automatically be committed or aborted - depending on whether an exception is raised. - - - When using scripts you should wrap the session in a manager yourself. - For example:: - - import transaction - - engine = get_engine(settings) - session_factory = get_session_factory(engine) - with transaction.manager: - dbsession = get_tm_session(session_factory, transaction.manager) - - """ - dbsession = session_factory() - zope.sqlalchemy.register(dbsession, transaction_manager=transaction_manager) - return dbsession - - -def includeme(config): - """ - Initialize the model for a Pyramid app. - - Activate this setup using ``config.include('.models')``. - - """ - settings = config.get_settings() - - # use pyramid_tm to hook the transaction lifecycle to the request - config.include("pyramid_tm") - - session_factory = get_session_factory(get_engine(settings)) - config.registry["dbsession_factory"] = session_factory - - # make request.dbsession available for use in Pyramid - config.add_request_method( - # r.tm is the transaction manager used by pyramid_tm - lambda r: get_tm_session(session_factory, r.tm), - "dbsession", - reify=True, - ) diff --git a/barker/barker/models/master.py b/barker/barker/models/master.py index 317a16c..be597c9 100644 --- a/barker/barker/models/master.py +++ b/barker/barker/models/master.py @@ -1,3 +1,4 @@ +import enum import uuid from sqlalchemy import ( @@ -5,6 +6,7 @@ from sqlalchemy import ( Boolean, Column, Date, + Enum, ForeignKey, Integer, Numeric, @@ -19,10 +21,25 @@ 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" @@ -138,7 +155,7 @@ class SaleCategory(Base): self.id = id_ -class ProductNew(Base): +class Product(Base): __tablename__ = "products" id = Column( "id", UUID(as_uuid=True), primary_key=True, server_default=text("gen_random_uuid()"), default=uuid.uuid4 @@ -203,7 +220,7 @@ class ProductVersion(Base): menu_category = relationship("MenuCategory", backref="products") sale_category = relationship("SaleCategory", backref="products") - product = relationship("ProductNew") + product = relationship("Product") __table_args__ = ( postgresql.ExcludeConstraint( @@ -413,48 +430,23 @@ class SettleOption(Base): id = Column("id", Integer, primary_key=True) name = Column("name", Unicode(255), unique=True, nullable=False) - show_in_choices = Column("show_in_choices", Boolean, nullable=False) - display_group = Column("display_group", Integer, nullable=False) - is_print = Column("is_print", Boolean, 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, - show_in_choices=None, - display_group=None, - is_print=None, - id_=None, - ): + 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.show_in_choices = show_in_choices - self.display_group = display_group - self.is_print = is_print + 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 CASH(cls): - return 2 - - @classmethod - def CREDIT_CARD(cls): - return 3 - - @classmethod - def NO_CHARGE(cls): - return 4 - - @classmethod - def BILL_TO_COMPANY(cls): - return 5 - - @classmethod - def TIP(cls): - return 6 - @classmethod def ROUND_OFF(cls): return 7 @@ -466,7 +458,3 @@ class SettleOption(Base): @classmethod def VOID(cls): return 9 - - @classmethod - def STAFF(cls): - return 10 diff --git a/barker/barker/models/voucher.py b/barker/barker/models/voucher.py index 68754ae..a6b7628 100644 --- a/barker/barker/models/voucher.py +++ b/barker/barker/models/voucher.py @@ -2,12 +2,12 @@ import uuid from datetime import datetime from decimal import Decimal -from enum import Enum from sqlalchemy import ( Boolean, Column, DateTime, + Enum, ForeignKey, Integer, Numeric, @@ -19,20 +19,12 @@ from sqlalchemy import ( ) from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.ext.hybrid import hybrid_property -from sqlalchemy.orm import backref, relationship, synonym +from sqlalchemy.orm import backref, relationship -from .master import ProductNew +from .master import Product, VoucherType from .meta import Base -class VoucherType(Enum): - KOT = 0 - REGULAR_BILL = 1 - NO_CHARGE = 2 - STAFF = 4 - VOID = 5 - - class GuestBook(Base): __tablename__ = "guest_book" id = Column( @@ -131,7 +123,7 @@ class Voucher(Base): customer_id = Column("customer_id", UUID(as_uuid=True), ForeignKey("customers.id")) narration = Column("narration", Unicode(1000), nullable=True) reason = Column("reason", Unicode(255)) - _voucher_type = Column("voucher_type", Integer, nullable=False) + voucher_type = Column("voucher_type", Enum(VoucherType), nullable=False) user_id = Column("user_id", UUID(as_uuid=True), ForeignKey("users.id"), nullable=False) user = relationship("User", backref="vouchers") @@ -157,15 +149,6 @@ class Voucher(Base): cascade_backrefs=False, ) - def _get_voucher_type(self): - return VoucherType(self._voucher_type) - - def _set_voucher_type(self, voucher_type): - self._voucher_type = voucher_type.value - - voucher_type = property(_get_voucher_type, _set_voucher_type) - voucher_type = synonym("_voucher_type", descriptor=voucher_type) - def __init__( self, date, @@ -322,7 +305,7 @@ class Inventory(Base): kot = relationship("Kot", backref="inventories") tax = relationship("Tax", foreign_keys=tax_id) - product = relationship("ProductVersion", secondary=ProductNew.__table__, backref="inventories") + product = relationship("ProductVersion", secondary=Product.__table__, backref="inventories") def __init__( self, diff --git a/barker/barker/printing/bill.py b/barker/barker/printing/bill.py index 43d53f0..be0420b 100644 --- a/barker/barker/printing/bill.py +++ b/barker/barker/printing/bill.py @@ -11,15 +11,14 @@ from sqlalchemy import and_, or_ from sqlalchemy.orm import Session from ..core.arq import settings as redis_settings -from ..models import ( +from ..models.master import ( DbSetting, - Inventory, Printer, ProductVersion, SectionPrinter, - Voucher, VoucherType, ) +from ..models.voucher import Inventory, Voucher def print_bill(voucher_id: uuid.UUID, db: Session): diff --git a/barker/barker/printing/cashier_report.py b/barker/barker/printing/cashier_report.py index 558e01d..c91ea4a 100644 --- a/barker/barker/printing/cashier_report.py +++ b/barker/barker/printing/cashier_report.py @@ -8,7 +8,8 @@ from barker.schemas.cashier_report import CashierReport from sqlalchemy.orm import Session from ..core.arq import settings as redis_settings -from ..models import Device, Printer, SectionPrinter +from ..models.auth import Device +from ..models.master import Printer, SectionPrinter def print_cashier_report(report: CashierReport, device_id: uuid.UUID, db: Session): diff --git a/barker/barker/printing/discount_report.py b/barker/barker/printing/discount_report.py index fb4c2e5..1880750 100644 --- a/barker/barker/printing/discount_report.py +++ b/barker/barker/printing/discount_report.py @@ -5,7 +5,8 @@ from arq import ArqRedis, create_pool from sqlalchemy.orm import Session from ..core.arq import settings as redis_settings -from ..models import Device, Printer, SectionPrinter +from ..models.auth import Device +from ..models.master import Printer, SectionPrinter from ..schemas.discount_report import DiscountReport diff --git a/barker/barker/printing/kot.py b/barker/barker/printing/kot.py index 3c78498..71fdc3c 100644 --- a/barker/barker/printing/kot.py +++ b/barker/barker/printing/kot.py @@ -10,7 +10,8 @@ from sqlalchemy import and_, or_ from sqlalchemy.orm import Session from ..core.arq import settings as redis_settings -from ..models import Inventory, Kot, Printer, ProductVersion, SectionPrinter, Voucher +from ..models.master import Printer, ProductVersion, SectionPrinter +from ..models.voucher import Inventory, Kot, 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 e5283b7..349f9ff 100644 --- a/barker/barker/printing/sale_report.py +++ b/barker/barker/printing/sale_report.py @@ -7,7 +7,8 @@ from arq import ArqRedis, create_pool from sqlalchemy.orm import Session from ..core.arq import settings as redis_settings -from ..models import Device, Printer, SectionPrinter +from ..models.auth import Device +from ..models.master import Printer, SectionPrinter from ..schemas.sale_report import SaleReport diff --git a/barker/barker/routers/modifier_category.py b/barker/barker/routers/modifier_category.py index 18ef656..7dc06e9 100644 --- a/barker/barker/routers/modifier_category.py +++ b/barker/barker/routers/modifier_category.py @@ -14,7 +14,7 @@ from sqlalchemy.orm import Session, contains_eager, joinedload 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, ModifierCategory, ProductNew, ProductVersion +from ..models.master import MenuCategory, ModifierCategory, Product, ProductVersion from ..schemas.auth import UserToken @@ -185,7 +185,7 @@ def for_product( db: Session = Depends(get_db), user: UserToken = Security(get_user), ): - product: ProductNew = db.query(ProductNew).filter(ProductNew.id == id_).first() + product: Product = db.query(Product).filter(Product.id == id_).first() return [ { @@ -312,7 +312,7 @@ def add_products(modifier_category: ModifierCategory, menu_categories: List[sche old = [x for x in modifier_category.products if x.id == p.id_] old = None if len(old) == 0 else old[0] if p.enabled and old is None: - product_object = db.query(ProductNew).filter(ProductNew.id == p.id_).one() + product_object = db.query(Product).filter(Product.id == p.id_).one() modifier_category.products.append(product_object) elif not p.enabled and old: modifier_category.products.remove(old) diff --git a/barker/barker/routers/product.py b/barker/barker/routers/product.py index 78c0b83..f7cde53 100644 --- a/barker/barker/routers/product.py +++ b/barker/barker/routers/product.py @@ -14,7 +14,7 @@ from sqlalchemy.orm import Session, contains_eager, joinedload 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, ProductNew, ProductVersion, SaleCategory +from ..models.master import MenuCategory, Product, ProductVersion, SaleCategory from ..schemas.auth import UserToken @@ -86,7 +86,7 @@ def save( user: UserToken = Security(get_user, scopes=["products"]), ): try: - item = ProductNew() + item = Product() db.add(item) db.flush() product_version = ProductVersion( diff --git a/barker/barker/routers/reports/beer_consumption_report.py b/barker/barker/routers/reports/beer_consumption_report.py index 3c86b32..0408f00 100644 --- a/barker/barker/routers/reports/beer_consumption_report.py +++ b/barker/barker/routers/reports/beer_consumption_report.py @@ -8,7 +8,8 @@ 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 import Inventory, Kot, ProductVersion, Voucher, VoucherType +from ...models.master import ProductVersion, VoucherType +from ...models.voucher import Inventory, Kot, Voucher from ...schemas.auth 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 efaadba..eecddad 100644 --- a/barker/barker/routers/reports/bill_settlement_report.py +++ b/barker/barker/routers/reports/bill_settlement_report.py @@ -7,7 +7,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 import Reprint, Settlement, SettleOption, Voucher, VoucherType +from ...models.master import ReportingLevel, SettleOption +from ...models.voucher import Reprint, Settlement, Voucher from ...schemas.auth import UserToken from ...schemas.bill_settlement_report import BillSettlement, BillSettlementItem from . import report_finish_date, report_start_date @@ -60,13 +61,11 @@ def settlements(s: date, f: date, db: Session) -> List[BillSettlementItem]: report = [] for item in vouchers: - for so in (so for so in item.settlements if so.settle_option.show_in_choices): - if item.voucher_type == VoucherType.VOID: - details = f"Void: {item.reason}" - elif item.voucher_type == VoucherType.STAFF: - details = f"Staff: {item.reason}" - elif item.voucher_type == VoucherType.NO_CHARGE: - details = f"NC: {item.reason}" + for so in ( + so for so in item.settlements if so.settle_option.reporting_level >= ReportingLevel.Aggregate + ): # Only unsettled roundoff and amount is skipped + if so.settle_option.has_reason: + details = f"{so.settle_option.name}: {item.reason}" else: details = so.settle_option.name report.append( diff --git a/barker/barker/routers/reports/cashier_report.py b/barker/barker/routers/reports/cashier_report.py index 376572e..25f43fd 100644 --- a/barker/barker/routers/reports/cashier_report.py +++ b/barker/barker/routers/reports/cashier_report.py @@ -10,7 +10,9 @@ 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 import Settlement, User, Voucher +from ...models.auth import User +from ...models.master import ReportingLevel +from ...models.voucher import Settlement, Voucher from ...printing.cashier_report import print_cashier_report from ...schemas.auth import UserLink, UserToken from ...schemas.cashier_report import ( @@ -102,12 +104,14 @@ def get_id(id_: uuid.UUID, start_date: date, finish_date: date, user: UserLink, info: Dict[SettleOptionSchema, List[InfoItem]] = {} amounts = {} for item in vouchers: - for so in (so for so in item.settlements if so.settle_option.show_in_choices or so.settle_option.is_print): + for so in ( + so for so in item.settlements if so.settle_option.reporting_level >= ReportingLevel.Aggregate + ): # Only Roundoff and Amount is skipped if so.settle_option.name not in info: info[so.settle_option.name] = [] amounts[so.settle_option.name] = 0 amounts[so.settle_option.name] += so.amount - if so.settle_option.is_print: + if so.settle_option.reporting_level == ReportingLevel.Detailed: # Only additionally Cash is skipped info[so.settle_option.name].append( InfoItem( date=item.date, diff --git a/barker/barker/routers/reports/discount_report.py b/barker/barker/routers/reports/discount_report.py index 93313ca..a02645f 100644 --- a/barker/barker/routers/reports/discount_report.py +++ b/barker/barker/routers/reports/discount_report.py @@ -10,7 +10,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 import Inventory, Kot, ProductVersion, SaleCategory, Voucher, VoucherType +from ...models.master import ProductVersion, SaleCategory, VoucherType +from ...models.voucher import Inventory, Kot, Voucher from ...printing.discount_report import print_discount_report from ...schemas.auth import UserToken from ...schemas.discount_report import DiscountReport, DiscountReportItem diff --git a/barker/barker/routers/reports/product_sale_report.py b/barker/barker/routers/reports/product_sale_report.py index 014dfda..17ed08d 100644 --- a/barker/barker/routers/reports/product_sale_report.py +++ b/barker/barker/routers/reports/product_sale_report.py @@ -7,15 +7,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 import ( - Inventory, - Kot, - MenuCategory, - ProductVersion, - SaleCategory, - Voucher, - VoucherType, -) +from ...models.master import MenuCategory, ProductVersion, SaleCategory, VoucherType +from ...models.voucher import Inventory, Kot, Voucher from ...schemas import to_camel from ...schemas.auth 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 0693c65..7af6668 100644 --- a/barker/barker/routers/reports/product_updates_report.py +++ b/barker/barker/routers/reports/product_updates_report.py @@ -7,7 +7,7 @@ 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 import MenuCategory, ProductVersion +from ...models.master import MenuCategory, ProductVersion from ...schemas.auth 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 4148bfa..9e3170e 100644 --- a/barker/barker/routers/reports/sale_report.py +++ b/barker/barker/routers/reports/sale_report.py @@ -10,16 +10,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 import ( - Inventory, - Kot, - ProductVersion, - SaleCategory, - Settlement, - SettleOption, - Voucher, - VoucherType, -) +from ...models.master import ProductVersion, SaleCategory, SettleOption, VoucherType +from ...models.voucher import Inventory, Kot, Settlement, Voucher from ...printing.sale_report import print_sale_report from ...schemas.auth import UserLink, UserToken from ...schemas.sale_report import SaleReport, SaleReportItem diff --git a/barker/barker/routers/reports/tax_report.py b/barker/barker/routers/reports/tax_report.py index aae95d5..c548aa3 100644 --- a/barker/barker/routers/reports/tax_report.py +++ b/barker/barker/routers/reports/tax_report.py @@ -8,7 +8,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 import Inventory, Kot, Tax, Voucher, VoucherType +from ...models.master import Tax, VoucherType +from ...models.voucher import Inventory, Kot, Voucher from ...schemas.auth import UserToken from ...schemas.tax_report import TaxReport, TaxReportItem from . import report_finish_date, report_start_date diff --git a/barker/barker/routers/settle_option.py b/barker/barker/routers/settle_option.py new file mode 100644 index 0000000..9c140cf --- /dev/null +++ b/barker/barker/routers/settle_option.py @@ -0,0 +1,154 @@ +from typing import List + +import barker.schemas.settle_option as schemas + +from fastapi import APIRouter, Depends, HTTPException, Security, status +from sqlalchemy.exc import SQLAlchemyError +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 ..schemas.auth import UserToken + + +router = APIRouter() + + +# Dependency +def get_db(): + try: + db = SessionLocal() + yield db + finally: + db.close() + + +@router.post("", response_model=schemas.SettleOption) +def save( + data: schemas.SettleOption, + db: Session = Depends(get_db), + user: UserToken = Security(get_user, scopes=["owner"]), +) -> schemas.SettleOption: + try: + item = SettleOption( + id_=data.id_, + name=data.name, + voucher_type=data.voucher_type, + reporting_level=data.reporting_level, + has_reason=data.has_reason, + ) + db.add(item) + db.commit() + return settle_option_info(item) + except SQLAlchemyError as e: + db.rollback() + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail=str(e), + ) + except Exception: + db.rollback() + raise + + +@router.put("/{id_}", response_model=schemas.SettleOption) +def update( + id_: int, + data: schemas.SettleOption, + db: Session = Depends(get_db), + user: UserToken = Security(get_user, scopes=["owner"]), +) -> schemas.SettleOption: + try: + item: SettleOption = db.query(SettleOption).filter(SettleOption.id == id_).first() + if item.is_fixture: + raise HTTPException( + status_code=status.HTTP_423_LOCKED, + detail=f"{item.name} is a fixture and cannot be edited or deleted.", + ) + item.name = data.name + item.voucher_type = data.voucher_type + item.reporting_level = data.reporting_level + item.has_reason = data.has_reason + db.commit() + return settle_option_info(item) + except SQLAlchemyError as e: + db.rollback() + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail=str(e), + ) + except Exception: + db.rollback() + raise + + +@router.delete("/{id_}") +def delete( + id_: int, + db: Session = Depends(get_db), + user: UserToken = Security(get_user, scopes=["owner"]), +): + try: + item: SettleOption = db.query(SettleOption).filter(SettleOption.id == id_).first() + if item is None: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="Sale Category not found", + ) + else: + raise HTTPException( + status_code=status.HTTP_501_NOT_IMPLEMENTED, + detail="Sale Category deletion not implemented", + ) + except Exception: + db.rollback() + raise + + +@router.get("", response_model=schemas.SettleOption) +def show_blank( + db: Session = Depends(get_db), + user: UserToken = Security(get_user, scopes=["owner"]), +) -> schemas.SettleOption: + return settle_option_blank() + + +@router.get("/list", response_model=List[schemas.SettleOption]) +def show_list(db: Session = Depends(get_db), user: UserToken = Depends(get_user)): + return [settle_option_info(item) for item in db.query(SettleOption).order_by(SettleOption.id).all()] + + +@router.get("/for-type/{vt}", response_model=List[schemas.SettleOption]) +def show_list_for_type(vt: VoucherType, db: Session = Depends(get_db), user: UserToken = Depends(get_user)): + return [ + settle_option_info(item) + for item in db.query(SettleOption).filter(SettleOption.voucher_type == vt).order_by(SettleOption.id).all() + ] + + +@router.get("/{id_}", response_model=schemas.SettleOption) +def show_id( + id_: int, + db: Session = Depends(get_db), + user: UserToken = Security(get_user, scopes=["owner"]), +) -> schemas.SettleOption: + item: SettleOption = db.query(SettleOption).filter(SettleOption.id == id_).first() + return settle_option_info(item) + + +def settle_option_info(item: SettleOption) -> schemas.SettleOption: + return schemas.SettleOption( + id=item.id, + name=item.name, + voucherType=item.voucher_type, + reportingLevel=item.reporting_level, + hasReason=item.has_reason, + isFixture=item.is_fixture, + ) + + +def settle_option_blank() -> schemas.SettleOption: + return schemas.SettleOption( + id=0, name="", voucherType=VoucherType.KOT, reportingLevel=ReportingLevel.Skip, hasReason=False, isFixture=False + ) diff --git a/barker/barker/routers/table.py b/barker/barker/routers/table.py index e10e3cc..a640065 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 import Overview from ..models.master import FoodTable +from ..models.voucher import Overview from ..schemas.auth import UserToken diff --git a/barker/barker/routers/update_product_prices.py b/barker/barker/routers/update_product_prices.py index 335c7b0..8a109a2 100644 --- a/barker/barker/routers/update_product_prices.py +++ b/barker/barker/routers/update_product_prices.py @@ -10,7 +10,7 @@ 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 import MenuCategory, ProductVersion +from ..models.master import MenuCategory, ProductVersion from ..schemas.auth import UserToken from ..schemas.update_product_prices import UpdateProductPrices, UpdateProductPricesItem from . import optional_query_date diff --git a/barker/barker/routers/voucher/__init__.py b/barker/barker/routers/voucher/__init__.py index 26f5a8e..f34e95b 100644 --- a/barker/barker/routers/voucher/__init__.py +++ b/barker/barker/routers/voucher/__init__.py @@ -6,14 +6,8 @@ from fastapi import HTTPException, status from sqlalchemy import func from sqlalchemy.orm import Session -from ...models import ( - GuestBook, - Overview, - Settlement, - SettleOption, - Voucher, - VoucherType, -) +from ...models.master import SettleOption, VoucherType +from ...models.voucher import GuestBook, Overview, Settlement, Voucher from ...schemas.receive_payment import ReceivePaymentItem as SettleSchema @@ -29,13 +23,11 @@ def get_tax(tax, voucher_type): ) -def get_bill_id(voucher_type, db): +def get_bill_id(voucher_type: VoucherType, db: Session) -> Optional[int]: if voucher_type == VoucherType.KOT: return None bill_id = ( - db.query(func.coalesce(func.max(Voucher.bill_id), 0) + 1) - .filter(Voucher.voucher_type == voucher_type.value) - .scalar() + db.query(func.coalesce(func.max(Voucher.bill_id), 0) + 1).filter(Voucher.voucher_type == voucher_type).scalar() ) if voucher_type == VoucherType.REGULAR_BILL and bill_id % 10000 == 0: bill_id += 1 diff --git a/barker/barker/routers/voucher/change.py b/barker/barker/routers/voucher/change.py index f630ecd..ec938f2 100644 --- a/barker/barker/routers/voucher/change.py +++ b/barker/barker/routers/voucher/change.py @@ -4,14 +4,14 @@ from typing import Optional import barker.schemas.voucher as schemas -from barker.models import VoucherType from fastapi import APIRouter, Depends, HTTPException, Security, status from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.orm import Session from ...core.security import get_current_active_user as get_user from ...db.session import SessionLocal -from ...models import Overview, Reprint, SettleOption, Voucher +from ...models.master import SettleOption, VoucherType +from ...models.voucher import Overview, Reprint, Voucher from ...routers.voucher import do_update_settlements, get_guest_book from ...schemas.auth import UserToken from ...schemas.receive_payment import ReceivePaymentItem as SettleSchema diff --git a/barker/barker/routers/voucher/merge_move.py b/barker/barker/routers/voucher/merge_move.py index 2c08554..0ffc4e7 100644 --- a/barker/barker/routers/voucher/merge_move.py +++ b/barker/barker/routers/voucher/merge_move.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 import Kot, Overview, Settlement, Voucher, VoucherType +from ...models.master import VoucherType +from ...models.voucher import Kot, Overview, Settlement, Voucher from ...routers.voucher import do_update_settlements, do_update_table, get_bill_id from ...schemas.auth import UserToken diff --git a/barker/barker/routers/voucher/receive_payment.py b/barker/barker/routers/voucher/receive_payment.py index 90c05b9..1921d42 100644 --- a/barker/barker/routers/voucher/receive_payment.py +++ b/barker/barker/routers/voucher/receive_payment.py @@ -8,7 +8,8 @@ from sqlalchemy.orm import Session from ...core.security import get_current_active_user as get_user from ...db.session import SessionLocal -from ...models import Overview, SettleOption, Voucher, VoucherType +from ...models.master import SettleOption, VoucherType +from ...models.voucher import Overview, Voucher from ...schemas.auth import UserToken from . import do_update_settlements diff --git a/barker/barker/routers/voucher/save.py b/barker/barker/routers/voucher/save.py index 155c5d3..3c1c1b8 100644 --- a/barker/barker/routers/voucher/save.py +++ b/barker/barker/routers/voucher/save.py @@ -13,15 +13,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 import ( - GuestBook, - Inventory, - InventoryModifier, - Kot, - ProductVersion, - Voucher, - VoucherType, -) +from ...models.master import ProductVersion, VoucherType +from ...models.voucher import GuestBook, Inventory, InventoryModifier, Kot, Voucher from ...printing import print_bill, print_kot from ...routers.voucher import ( check_permissions, @@ -50,14 +43,14 @@ def get_db(): def save( data: schemas.VoucherIn, u: bool, # Update table? - p: str, # Print type + p: int, # Print type g: Optional[uuid.UUID] = None, # Guest book id db: Session = Depends(get_db), user: UserToken = Security(get_user), ): try: update_table = u - voucher_type = VoucherType[p] + voucher_type = VoucherType(p) guest_book = get_guest_book(g, db) item: Voucher = do_save(data, voucher_type, guest_book, db, user) if update_table: diff --git a/barker/barker/routers/voucher/show.py b/barker/barker/routers/voucher/show.py index 89c0179..6d5d27b 100644 --- a/barker/barker/routers/voucher/show.py +++ b/barker/barker/routers/voucher/show.py @@ -10,14 +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 import ( - FoodTable, - GuestBook, - Overview, - ProductVersion, - Voucher, - VoucherType, -) +from ...models.master import FoodTable, ProductVersion, VoucherType +from ...models.voucher import GuestBook, Overview, Voucher from ...schemas.auth import UserToken @@ -154,7 +148,7 @@ def voucher_info(item: Voucher, db: Session): "settlements": [], "narration": item.narration, "reason": item.reason, - "voucherType": item.voucher_type.name, + "voucherType": item.voucher_type, "kotId": item.kot_id, "kots": [ { @@ -195,7 +189,7 @@ def voucher_blank(table: FoodTable, guest: Optional[GuestBook]): return { "pax": table.seats if guest is None else guest.pax, "table": {"id": table.id, "name": table.name}, - "voucherType": VoucherType.KOT.name, + "voucherType": VoucherType.KOT, "customer": {"id": guest.customer_id, "name": guest.customer.name} if guest is not None else None, "kots": [], } diff --git a/barker/barker/routers/voucher/split.py b/barker/barker/routers/voucher/split.py index a78cd43..60c92d8 100644 --- a/barker/barker/routers/voucher/split.py +++ b/barker/barker/routers/voucher/split.py @@ -12,15 +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 import ( - Inventory, - InventoryModifier, - Kot, - Overview, - SettleOption, - Voucher, - VoucherType, -) +from ...models.master import SettleOption, VoucherType +from ...models.voucher import Inventory, InventoryModifier, Kot, Overview, Voucher 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 a5361d6..c5e282f 100644 --- a/barker/barker/routers/voucher/update.py +++ b/barker/barker/routers/voucher/update.py @@ -13,14 +13,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 import ( - Inventory, - InventoryModifier, - Kot, - ProductVersion, - Voucher, - VoucherType, -) +from ...models.master import ProductVersion, VoucherType +from ...models.voucher import Inventory, InventoryModifier, Kot, Voucher from ...printing import print_bill, print_kot from ...routers.voucher import ( check_permissions, @@ -50,7 +44,7 @@ def update( id_: uuid.UUID, data: schemas.VoucherIn, u: bool, # Update table? - p: str, # Print type + p: int, # Print type g: Optional[uuid.UUID] = None, # Guest book id db: Session = Depends(get_db), user: UserToken = Security(get_user), @@ -59,7 +53,7 @@ def update( now = datetime.now() product_date = (now - timedelta(minutes=settings.NEW_DAY_OFFSET_MINUTES)).date() update_table = u - voucher_type = VoucherType[p] + voucher_type = VoucherType(p) guest_book = get_guest_book(g, db) need_to_print_kot = False diff --git a/barker/barker/routers/voucher/void.py b/barker/barker/routers/voucher/void.py index 6bc57da..9b428d6 100644 --- a/barker/barker/routers/voucher/void.py +++ b/barker/barker/routers/voucher/void.py @@ -6,7 +6,8 @@ from sqlalchemy.orm import Session from ...core.security import get_current_active_user as get_user from ...db.session import SessionLocal -from ...models import Overview, SettleOption, Voucher, VoucherType +from ...models.master import SettleOption, VoucherType +from ...models.voucher import Overview, Voucher from ...schemas.auth import UserToken from ...schemas.receive_payment import ReceivePaymentItem as SettleSchema from . import do_update_settlements diff --git a/barker/barker/schemas/settle_option.py b/barker/barker/schemas/settle_option.py new file mode 100644 index 0000000..802e905 --- /dev/null +++ b/barker/barker/schemas/settle_option.py @@ -0,0 +1,17 @@ +from pydantic import BaseModel + +from ..models.master import ReportingLevel, VoucherType +from . import to_camel + + +class SettleOption(BaseModel): + id_: int + name: str + voucher_type: VoucherType + reporting_level: ReportingLevel + has_reason: bool + is_fixture: bool + + class Config: + anystr_strip_whitespace = True + alias_generator = to_camel diff --git a/bookie/src/app/app-routing.module.ts b/bookie/src/app/app-routing.module.ts index b68f66c..a4b73b1 100644 --- a/bookie/src/app/app-routing.module.ts +++ b/bookie/src/app/app-routing.module.ts @@ -106,6 +106,11 @@ const routes: Routes = [ loadChildren: () => import('./section-printers/section-printers.module').then((mod) => mod.SectionPrintersModule), }, + { + path: 'settle-options', + loadChildren: () => + import('./settle-option/settle-options.module').then((mod) => mod.SettleOptionsModule), + }, { path: 'tables', loadChildren: () => import('./tables/tables.module').then((mod) => mod.TableModule), diff --git a/bookie/src/app/core/receive-payment-item.ts b/bookie/src/app/core/receive-payment-item.ts index f63c38f..16c3c65 100644 --- a/bookie/src/app/core/receive-payment-item.ts +++ b/bookie/src/app/core/receive-payment-item.ts @@ -1,5 +1,5 @@ -export interface ReceivePaymentItem { - id: number; - name: string; +import { SettleOption } from './settle-option'; + +export interface ReceivePaymentItem extends SettleOption { amount: number; } diff --git a/bookie/src/app/core/receive-payment-list.ts b/bookie/src/app/core/receive-payment-list.ts deleted file mode 100644 index 955b60b..0000000 --- a/bookie/src/app/core/receive-payment-list.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { ReceivePaymentItem } from './receive-payment-item'; - -export interface ReceivePaymentList { - [billType: string]: ReceivePaymentItem[]; -} diff --git a/bookie/src/app/core/reporting-level.ts b/bookie/src/app/core/reporting-level.ts new file mode 100644 index 0000000..232bf1f --- /dev/null +++ b/bookie/src/app/core/reporting-level.ts @@ -0,0 +1,5 @@ +export enum ReportingLevel { + Skip = 0, + Aggregate = 1, + Detailed = 2, +} diff --git a/bookie/src/app/core/settle-option.ts b/bookie/src/app/core/settle-option.ts new file mode 100644 index 0000000..dfb6bd4 --- /dev/null +++ b/bookie/src/app/core/settle-option.ts @@ -0,0 +1,22 @@ +import { VoucherType } from '../sales/bills/voucher-type'; + +import { ReportingLevel } from './reporting-level'; + +export class SettleOption { + id: number; + name: string; + voucherType: VoucherType; + reportingLevel: ReportingLevel; + hasReason: boolean; + isFixture: boolean; + + public constructor(init?: Partial) { + this.id = 0; + this.name = ''; + this.voucherType = VoucherType.Kot; + this.reportingLevel = ReportingLevel.Skip; + this.hasReason = false; + this.isFixture = false; + Object.assign(this, init); + } +} diff --git a/bookie/src/app/home/home.component.html b/bookie/src/app/home/home.component.html index 67f78bc..1f3381e 100644 --- a/bookie/src/app/home/home.component.html +++ b/bookie/src/app/home/home.component.html @@ -232,6 +232,15 @@ >

Header / Footer

+ +

Settle Options

+