No automatic signout

Voucher basic working
running tables shifted to cards from buttons, this gives us immense styling oportunities
This commit is contained in:
Amritanshu
2019-07-12 12:36:38 +05:30
parent 4513e8b263
commit bcad4cdae3
31 changed files with 1085 additions and 713 deletions

View File

@ -19,7 +19,7 @@ def main(global_config, **settings):
settings['sqlalchemy.url'] = DB_URI
SECRET_KEY = os.environ.get('SECRET_KEY', settings.get('secret_key', ''))
session_factory = SignedCookieSessionFactory(SECRET_KEY)
session_factory = SignedCookieSessionFactory(SECRET_KEY, timeout=None)
config = Configurator(
settings=settings,

View File

@ -347,6 +347,9 @@ def includeme(config):
permission="Authenticated",
)
config.add_route("v1_vouchers_new", "/v1/vouchers/new")
config.add_route("v1_vouchers_id", "/v1/vouchers/{id}")
# Done till here
config.add_route("customer", "/Customer.json")
@ -390,8 +393,6 @@ def includeme(config):
config.add_route("sa_st", "/SaleAnalysis/ServiceTax.json")
config.add_route("sa_vat", "/SaleAnalysis/Vat.json")
config.add_route("voucher", "/Voucher.json")
config.add_route("voucher_id", "/Voucher/{id}.json")
config.add_route("voucher_reprint", "/ReprintVoucher/{id}.json")
config.add_route("voucher_settle", "/Settle/{id}.json")
config.add_route("voucher_split", "/Split/{id}.json")

View File

@ -3,10 +3,7 @@ import sys
import uuid
import transaction
from pyramid.paster import (
get_appsettings,
setup_logging,
)
from pyramid.paster import get_appsettings, setup_logging
from pyramid.scripts.common import parse_vars
from barker.models import (
@ -19,13 +16,18 @@ from barker.models import (
get_session_factory,
get_tm_session,
SettleOption,
Role, Section, ModifierCategory)
Role,
Section,
ModifierCategory,
)
def usage(argv):
cmd = os.path.basename(argv[0])
print('usage: %s <config_uri> [var=value]\n'
'(example: "%s development.ini")' % (cmd, cmd))
print(
"usage: %s <config_uri> [var=value]\n"
'(example: "%s development.ini")' % (cmd, cmd)
)
sys.exit(1)
@ -43,64 +45,108 @@ def main(argv=sys.argv):
with transaction.manager:
dbsession = get_tm_session(session_factory, transaction.manager)
permissions = [Permission('Accounts Audit', uuid.UUID('f30fd1fb-df09-46f5-8c5d-181fd46f38de')),
Permission('Beer Consumption', uuid.UUID('efbb8f31-9631-4491-92f4-17cc98e6a0c0')),
Permission('Bill Details', uuid.UUID('612bb529-b50d-4653-a1c0-ebb725c7d728')),
Permission('Cashier Checkout', uuid.UUID('a86f8bcf-66f4-4c44-89e1-b714488b8331')),
Permission('Change Rate', uuid.UUID('10c63aae-0e48-4e54-b3b8-dd8a80b88fbf')),
Permission('Customers', uuid.UUID('e5fef133-cdbe-441f-bb54-1f0db0c5db79')),
Permission('Discount', uuid.UUID('1f66f131-0105-4466-8f8e-21e0ccc2ac27')),
Permission('Discount Report', uuid.UUID('0d8ba1d5-6731-417c-ab0e-be03cfdc96db')),
Permission('Edit Printed Bill', uuid.UUID('4ff6cb0f-93cb-4760-8219-4de280eaa957')),
Permission('Edit Printed Product', uuid.UUID('959713be-d753-4e14-8ecd-e27f33587499')),
Permission('Guest Book', uuid.UUID('7669dfc9-cc75-4e48-b267-145c8832a83c')),
Permission('Machines', uuid.UUID('f12b573f-edcb-490d-91c3-fa76f6502ffd')),
Permission('Merge Kots', uuid.UUID('bed774e9-4857-43b0-a4af-40230c9eb5db')),
Permission('Merge Tables', uuid.UUID('dfc493fb-ac14-4602-8596-f93f47b617de')),
Permission('Modifiers', uuid.UUID('9dc82529-1e86-41b4-a152-eaea9f775fea')),
Permission('Move Kot to New Table', uuid.UUID('5ed5796a-ca99-437f-8f67-483b1ade81ed')),
Permission('Move Table', uuid.UUID('cfdb69c9-d37a-40af-bef2-e29c04602543')),
Permission('NC Product', uuid.UUID('54263587-773e-4cbb-b1e4-4e814141158e')),
Permission('Open Bill', uuid.UUID('5811d233-a1ae-4d32-af52-cebbf46d274a')),
Permission('Owner', uuid.UUID('6d109b66-8452-42aa-bbe9-d4cef440b7a1')),
Permission('Print Bill', uuid.UUID('92242eae-bd38-4223-829b-2f981933b7f2')),
Permission('Print Kot', uuid.UUID('0eef56fb-7741-49fd-8b84-5069cccae767')),
Permission('Products', uuid.UUID('f1f892ed-34aa-4c50-be12-dbaf48be7d4c')),
Permission('Roles', uuid.UUID('d39f86f6-14e4-4fc3-b07e-01e2501a6f65')),
Permission('Sales', uuid.UUID('92ba45c4-2d34-4cbd-b5b8-d9164c3595d5')),
Permission('Sales Analysis', uuid.UUID('0c1acb7c-9116-46e2-a3be-9d632e811330')),
Permission('Sales Detail', uuid.UUID('e6476396-ef83-4c47-bc20-9f3b936813f9')),
Permission('Settle Bill', uuid.UUID('9f7b658a-25bc-4a53-8560-2dde1c7a188a')),
Permission('Split Bill', uuid.UUID('0a8cfaf4-624e-478f-be65-c3b6392078c7')),
Permission('Tables', uuid.UUID('ac4512e8-efdd-429e-a7ae-a34d18782663')),
Permission('Tax Analysis', uuid.UUID('bab36396-53dd-44ea-ab3c-426efa7830c8')),
Permission('Taxes', uuid.UUID('5c8fcdde-460d-4047-810f-e34fb899fadc')),
Permission('Users', uuid.UUID('243447b8-b403-47e6-8b3d-8e76f4df44a9')),
Permission('Void Bill', uuid.UUID('e3c76262-adc0-4936-8b4d-217c6292298b')),
Permission('Void or Reprinted Bill Report', uuid.UUID('30c8e743-c710-42d7-843a-0b75543b3516')),
Permission('Printers', uuid.UUID('5b66c6f6-003a-4ef8-ba28-49b8ff1ac33c')),
Permission('Sections', uuid.UUID('c973f32c-a37b-496a-8dc5-60d2e4c39e97'))]
permissions = [
Permission(
"Accounts Audit", uuid.UUID("f30fd1fb-df09-46f5-8c5d-181fd46f38de")
),
Permission(
"Beer Consumption", uuid.UUID("efbb8f31-9631-4491-92f4-17cc98e6a0c0")
),
Permission(
"Bill Details", uuid.UUID("612bb529-b50d-4653-a1c0-ebb725c7d728")
),
Permission(
"Cashier Checkout", uuid.UUID("a86f8bcf-66f4-4c44-89e1-b714488b8331")
),
Permission(
"Change Rate", uuid.UUID("10c63aae-0e48-4e54-b3b8-dd8a80b88fbf")
),
Permission("Customers", uuid.UUID("e5fef133-cdbe-441f-bb54-1f0db0c5db79")),
Permission("Discount", uuid.UUID("1f66f131-0105-4466-8f8e-21e0ccc2ac27")),
Permission(
"Discount Report", uuid.UUID("0d8ba1d5-6731-417c-ab0e-be03cfdc96db")
),
Permission(
"Edit Printed Bill", uuid.UUID("4ff6cb0f-93cb-4760-8219-4de280eaa957")
),
Permission(
"Edit Printed Product",
uuid.UUID("959713be-d753-4e14-8ecd-e27f33587499"),
),
Permission("Guest Book", uuid.UUID("7669dfc9-cc75-4e48-b267-145c8832a83c")),
Permission("Machines", uuid.UUID("f12b573f-edcb-490d-91c3-fa76f6502ffd")),
Permission("Merge Kots", uuid.UUID("bed774e9-4857-43b0-a4af-40230c9eb5db")),
Permission(
"Merge Tables", uuid.UUID("dfc493fb-ac14-4602-8596-f93f47b617de")
),
Permission("Modifiers", uuid.UUID("9dc82529-1e86-41b4-a152-eaea9f775fea")),
Permission(
"Move Kot to New Table",
uuid.UUID("5ed5796a-ca99-437f-8f67-483b1ade81ed"),
),
Permission("Move Table", uuid.UUID("cfdb69c9-d37a-40af-bef2-e29c04602543")),
Permission("NC Product", uuid.UUID("54263587-773e-4cbb-b1e4-4e814141158e")),
Permission("Open Bill", uuid.UUID("5811d233-a1ae-4d32-af52-cebbf46d274a")),
Permission("Owner", uuid.UUID("6d109b66-8452-42aa-bbe9-d4cef440b7a1")),
Permission("Print Bill", uuid.UUID("92242eae-bd38-4223-829b-2f981933b7f2")),
Permission("Print Kot", uuid.UUID("0eef56fb-7741-49fd-8b84-5069cccae767")),
Permission("Products", uuid.UUID("f1f892ed-34aa-4c50-be12-dbaf48be7d4c")),
Permission("Roles", uuid.UUID("d39f86f6-14e4-4fc3-b07e-01e2501a6f65")),
Permission("Sales", uuid.UUID("92ba45c4-2d34-4cbd-b5b8-d9164c3595d5")),
Permission(
"Sales Analysis", uuid.UUID("0c1acb7c-9116-46e2-a3be-9d632e811330")
),
Permission(
"Sales Detail", uuid.UUID("e6476396-ef83-4c47-bc20-9f3b936813f9")
),
Permission(
"Settle Bill", uuid.UUID("9f7b658a-25bc-4a53-8560-2dde1c7a188a")
),
Permission("Split Bill", uuid.UUID("0a8cfaf4-624e-478f-be65-c3b6392078c7")),
Permission("Tables", uuid.UUID("ac4512e8-efdd-429e-a7ae-a34d18782663")),
Permission(
"Tax Analysis", uuid.UUID("bab36396-53dd-44ea-ab3c-426efa7830c8")
),
Permission("Taxes", uuid.UUID("5c8fcdde-460d-4047-810f-e34fb899fadc")),
Permission("Users", uuid.UUID("243447b8-b403-47e6-8b3d-8e76f4df44a9")),
Permission("Void Bill", uuid.UUID("e3c76262-adc0-4936-8b4d-217c6292298b")),
Permission(
"Void or Reprinted Bill Report",
uuid.UUID("30c8e743-c710-42d7-843a-0b75543b3516"),
),
Permission("Printers", uuid.UUID("5b66c6f6-003a-4ef8-ba28-49b8ff1ac33c")),
Permission("Sections", uuid.UUID("c973f32c-a37b-496a-8dc5-60d2e4c39e97")),
]
for permission in permissions:
dbsession.add(permission)
roles = [Role('Owner', uuid.UUID('06ec0ddb-949c-4357-aefb-65e5e55a9ae7')),
Role('Accountant', uuid.UUID('57d4538c-257a-4bf4-9a42-342992cb6af3')),
Role('Bar Captain', uuid.UUID('5a8ebb05-4817-45a5-866f-e523c30bfa25')),
Role('Captain', uuid.UUID('8db7001f-0964-4607-84f5-b6f4d9183fef')),
Role('Cashier', uuid.UUID('f1f0b112-1404-4b55-b121-f07ee6e08d12')),
Role('Controller', uuid.UUID('d9a5a478-1fe4-4847-84da-63cfba1a094a')),
Role('Manager', uuid.UUID('90ea7b14-9057-4bfd-a7cf-0ee7a3bb2463')),
Role('Senior Captain', uuid.UUID('d9b1b433-1ed5-4109-8ab2-cbd48ff010cd')),
Role('Server', uuid.UUID('6b378b71-f091-4485-a589-8db94ff1d6a4'))]
roles = [
Role("Owner", uuid.UUID("06ec0ddb-949c-4357-aefb-65e5e55a9ae7")),
Role("Accountant", uuid.UUID("57d4538c-257a-4bf4-9a42-342992cb6af3")),
Role("Bar Captain", uuid.UUID("5a8ebb05-4817-45a5-866f-e523c30bfa25")),
Role("Captain", uuid.UUID("8db7001f-0964-4607-84f5-b6f4d9183fef")),
Role("Cashier", uuid.UUID("f1f0b112-1404-4b55-b121-f07ee6e08d12")),
Role("Controller", uuid.UUID("d9a5a478-1fe4-4847-84da-63cfba1a094a")),
Role("Manager", uuid.UUID("90ea7b14-9057-4bfd-a7cf-0ee7a3bb2463")),
Role("Senior Captain", uuid.UUID("d9b1b433-1ed5-4109-8ab2-cbd48ff010cd")),
Role("Server", uuid.UUID("6b378b71-f091-4485-a589-8db94ff1d6a4")),
]
roles[0].permissions = permissions
roles[1].permissions = list(permissions[i] for i in [2, 3, 11, 18, 24, 25, 26, 30, 34])
roles[1].permissions = list(
permissions[i] for i in [2, 3, 11, 18, 24, 25, 26, 30, 34]
)
roles[2].permissions = list(permissions[i] for i in [26])
roles[3].permissions = list(permissions[i] for i in [16])
roles[4].permissions = list(permissions[i] for i in [20, 24, 27])
roles[5].permissions = list(permissions[i] for i in [0, 2, 7, 11, 18, 22, 24, 25, 26, 34])
roles[6].permissions = list(permissions[i] for i in [2, 3, 4, 5, 6, 8, 11, 14, 18, 22, 25, 26, 28, 29, 33, 34])
roles[5].permissions = list(
permissions[i] for i in [0, 2, 7, 11, 18, 22, 24, 25, 26, 34]
)
roles[6].permissions = list(
permissions[i]
for i in [2, 3, 4, 5, 6, 8, 11, 14, 18, 22, 25, 26, 28, 29, 33, 34]
)
roles[7].permissions = list(permissions[i] for i in [9, 12, 13, 15, 16])
roles[8].permissions = list(permissions[i] for i in [21, 24])
@ -111,40 +157,80 @@ def main(argv=sys.argv):
admin.roles.append(roles[0])
dbsession.add(admin)
main_section = Section("Main")
main_section = Section(
"Main", uuid.UUID("3f13f6e7-dc76-4fca-8fdb-b2bbf29b35df")
)
dbsession.add(main_section)
mcs = [ModifierCategory("Bar Instructions", 0, 0, True, 0, uuid.UUID("b572f401-3c2f-48b9-8973-ada5a6e4d3a6")),
ModifierCategory("Delivery", 0, 0, True, 0, uuid.UUID("caa72832-5034-405e-8442-68a8cc12ace9")),
ModifierCategory("Kitchen Instructions", 0, 0, True, 0, uuid.UUID("d6a0595f-e209-42e4-bb12-b7499f9a9c4d")),
ModifierCategory("Mixers", 0, 0, True, 0, uuid.UUID("60ca9122-adc5-463b-ad5f-33a68df8c3ae")),
ModifierCategory("Pasta Sauce", 0, 0, True, 0, uuid.UUID("ef5b1a0b-5eb1-45ff-bd82-3209c8b888df"))]
mcs = [
ModifierCategory(
"Bar Instructions",
0,
0,
True,
0,
uuid.UUID("b572f401-3c2f-48b9-8973-ada5a6e4d3a6"),
),
ModifierCategory(
"Delivery",
0,
0,
True,
0,
uuid.UUID("caa72832-5034-405e-8442-68a8cc12ace9"),
),
ModifierCategory(
"Kitchen Instructions",
0,
0,
True,
0,
uuid.UUID("d6a0595f-e209-42e4-bb12-b7499f9a9c4d"),
),
ModifierCategory(
"Mixers",
0,
0,
True,
0,
uuid.UUID("60ca9122-adc5-463b-ad5f-33a68df8c3ae"),
),
ModifierCategory(
"Pasta Sauce",
0,
0,
True,
0,
uuid.UUID("ef5b1a0b-5eb1-45ff-bd82-3209c8b888df"),
),
]
for item in mcs:
dbsession.add(item)
for name in range(1, 20):
ft = FoodTable(str(name), 0, main_section.id, True)
ft.section = main_section
dbsession.add(ft)
options = [
SettleOption('Unsettled', False, 1, True, 1),
SettleOption('Cash', True, 2, False, 2),
SettleOption('Credit Card', True, 2, True, 3),
SettleOption('No Charge', True, 3, True, 4),
SettleOption('Bill To Company', True, 2, True, 5),
SettleOption('Tip', True, 2, True, 6),
SettleOption('Round Off', False, 1, False, 7),
SettleOption('Amount', False, 1, False, 8),
SettleOption('Void', True, 1, True, 9),
SettleOption('Staff', True, 4, True, 10),
SettleOption("Unsettled", False, 1, True, 1),
SettleOption("Cash", True, 2, False, 2),
SettleOption("Credit Card", True, 2, True, 3),
SettleOption("No Charge", True, 3, True, 4),
SettleOption("Bill To Company", True, 2, True, 5),
SettleOption("Tip", True, 2, True, 6),
SettleOption("Round Off", False, 1, False, 7),
SettleOption("Amount", False, 1, False, 8),
SettleOption("Void", True, 1, True, 9),
SettleOption("Staff", True, 4, True, 10),
]
for option in options:
dbsession.add(option)
dbsession.add(Customer("", "Cash", "", "", uuid.UUID('2c716f4b-0736-429a-ad51-610d7c47cb5e')))
dbsession.add(DbSetting(
uuid.UUID('fb738ba2-a3c9-40ed-891c-b930e6454974'),
'Header',
{'Text': """ Hops n Grains
dbsession.add(
Customer(
"", "Cash", "", "", uuid.UUID("2c716f4b-0736-429a-ad51-610d7c47cb5e")
)
)
dbsession.add(
DbSetting(
uuid.UUID("fb738ba2-a3c9-40ed-891c-b930e6454974"),
"Header",
{
"Text": """ Hops n Grains
The Microbrewery
SCO 358, Sector 9, Panchkula
A Unit of Peitho Foods Pvt. Ltd.
@ -152,10 +238,14 @@ def main(argv=sys.argv):
(Reg Add: Plot No. 907, Indl Area II, Chd)
TIN: 06592507323
Service Tax: AAFCP5097GSD001
"""}
))
dbsession.add(DbSetting(
uuid.UUID('f7799871-d16e-4c4d-9b57-2299a5839acb'),
'Footer',
{'Text': "Call: 0172-4026666, 8054923853, 8054923856"}
))
"""
},
)
)
dbsession.add(
DbSetting(
uuid.UUID("f7799871-d16e-4c4d-9b57-2299a5839acb"),
"Footer",
{"Text": "Call: 0172-4026666, 8054923853, 8054923856"},
)
)

View File

@ -9,15 +9,15 @@ class PermissionAuthorizationPolicy(object):
if isinstance(permission, str):
return self.check(principals, permission)
for p in permission:
if self.check(principals,p):
if self.check(principals, p):
return True
return False
def check(self, principals, permission):
if permission == 'Authenticated':
permission = 'system.Authenticated'
if permission == 'Everyone':
permission = 'system.Everyone'
if permission == "Authenticated":
permission = "system.Authenticated"
if permission == "Everyone":
permission = "system.Everyone"
allowed = permission in principals
return allowed

View File

@ -128,23 +128,32 @@ def show_list(request):
active = request.GET.get("a", None)
list_ = request.dbsession.query(FoodTable)
if active is not None:
active = active == "true"
list_ = list_.filter(FoodTable.is_active == active)
list_ = list_.order_by(FoodTable.sort_order).all()
food_tables = []
for item in list_:
food_tables.append(
{
ft = {
"id": item.id,
"name": item.name,
"seats": item.seats,
"section": {"id": item.section_id, "name": item.section.name},
"isActive": item.is_active,
"sortOrder": item.sort_order,
"status": "" if item.status is None else item.status.status,
"voucherId": None if item.status is None else item.status.voucher_id,
"sortOrder": item.sort_order
}
)
if item.status is None:
ft["status"] = ""
else:
ft["status"] = item.status.status
if item.status.voucher is not None:
ft["voucherId"] = item.status.voucher_id
ft["pax"] = item.status.voucher.pax
ft["date"] = item.status.voucher.date.strftime("%d-%b-%Y %H:%M")
ft["amount"] = 12345
if item.status.guest is not None:
ft["name"] = item.status.guest.customer.name
food_tables.append(ft)
return food_tables

View File

@ -185,7 +185,7 @@ def show_list(request):
request_param="p",
permission="Authenticated",
)
def show_for_pg(request):
def show_for_product(request):
product_id = uuid.UUID(request.GET["p"])
product = request.dbsession.query(Product).filter(Product.id == product_id).first()
@ -197,7 +197,7 @@ def show_for_pg(request):
"maximum": item.maximum,
"isActive": item.is_active,
"modifiers": [
{"id": m.id, "name": m.name, "prince": m.price}
{"id": m.id, "name": m.name, "price": m.price}
for m in item.modifiers
if m.is_active == True
],

View File

@ -1,509 +0,0 @@
import re
import uuid
from datetime import datetime
from decimal import Decimal
import transaction
from pyramid.httpexceptions import HTTPForbidden
from pyramid.view import view_config
from sqlalchemy import func
from barker.exceptions import ValidationFailure
from barker.models import (
Inventory,
InventoryModifier,
Kot,
Settlement,
SettleOption,
Voucher,
Overview,
VoucherType,
)
@view_config(request_method="PUT", route_name="voucher", renderer="json", trans=True)
def save(request):
update_table = request.GET["u"]
json = request.json_body
if not json["Printed"] and "Print Kot" not in request.effective_principals:
raise HTTPForbidden("You are not allowed to print a kot")
if json["Printed"] and "Print Bill" not in request.effective_principals:
raise HTTPForbidden("You are not allowed to print bill")
item = save_voucher(json, request.dbsession)
if update_table:
status = "printed" if item.is_printed else "running"
item.status = Overview(
voucher_id=None, food_table_id=item.food_table_id, status=status
)
request.dbsession.add(item.status)
transaction.commit()
item = request.dbsession.query(Voucher).filter(Voucher.id == item.id).first()
return voucher_info(item)
@view_config(
request_method="POST", route_name="voucher_id", renderer="json", trans=True
)
def update(request):
now = datetime.now()
update_table = request.GET["u"]
json = request.json_body
id = uuid.UUID(request.matchdict["id"])
item = request.dbsession.query(Voucher).filter(Voucher.id == id).first()
if not json["Printed"] and "Print Kot" not in request.effective_principals:
raise HTTPForbidden("You are not allowed to print a kot")
if json["Printed"] and "Print Bill" not in request.effective_principals:
raise HTTPForbidden("You are not allowed to print bill")
if item.is_printed and "Edit Printed Bill" not in request.effective_principals:
raise HTTPForbidden("You are not allowed to edit a printed bill")
if item.is_printed and not json["Printed"]:
transaction.abort()
raise ValidationFailure("This Bill is already printed\nCannot add a Kot to it.")
if item.is_void:
transaction.abort()
raise ValidationFailure(
"This Bill is already void.\nReason: {0}".format(item.void_reason)
)
if item.is_printed and not json["Printed"]:
transaction.abort()
raise ValidationFailure("This Bill is already printed\nCannot add a Kot to it.")
item.pax = json["Pax"]
item.food_table_id = json["Table"]["FoodTableID"]
item.customer_id = json["Customer"]["CustomerID"]
item.voucher_type = json["VoucherType"]
if not item.is_printed and json["Printed"]:
item.date = now
type = [1, 3] if item.voucher_type in [1, 3] else [item.voucher_type]
item.bill_id = (
request.dbsession.query(func.coalesce(func.max(Voucher.bill_id), 0) + 1)
.filter(Voucher.voucher_type.in_(type))
.scalar()
)
item.is_printed = item.is_printed or json["Printed"]
item.user_id = json["User"]["UserID"]
item.last_edit_date = now
for k in item.kots:
for i in k.inventories:
i.service_tax_rate, i.vat_rate = get_st_vat(
i.service_tax_rate, i.vat_rate, item.voucher_type
)
i.discount = next(
Decimal(inv["Discount"])
for ko in json["Kots"]
for inv in ko["Inventories"]
if uuid.UUID(inv["InventoryID"]) == i.id
)
for k in (
k for k in json["Kots"] if k["KotID"] == "00000000-0000-0000-0000-000000000000"
):
kot = Kot(
item.id,
item.food_table_id,
item.date,
item.user_id,
dbsession=request.dbsession,
)
item.kots.append(kot)
request.dbsession.add(kot)
for index, i in enumerate(k["Inventories"]):
st, vat = get_st_vat(i["ServiceTaxRate"], i["VatRate"], json["VoucherType"])
inv = Inventory(
kot.id,
uuid.UUID(i["ProductID"]),
i["Quantity"],
i["Price"],
i["Discount"],
i["IsHappyHour"],
i["ServiceTaxID"],
st,
i["VatID"],
vat,
index,
)
kot.inventories.append(inv)
request.dbsession.add(inv)
for m in i["Modifiers"]:
mod = InventoryModifier(None, uuid.UUID(m["ModifierID"]), 0)
inv.modifiers.append(mod)
request.dbsession.add(mod)
get_settlements(item, request.dbsession)
if update_table:
vft = (
request.dbsession.query(Overview)
.filter(Overview.voucher_id == item.id)
.first()
)
status = "printed" if item.is_printed else "running"
if vft is None:
item.status = Overview(
voucher_id=None, food_table_id=item.food_table_id, status=status
)
request.dbsession.add(item.status)
else:
vft.status = status
vft.food_table_id = item.food_table_id
transaction.commit()
item = request.dbsession.query(Voucher).filter(Voucher.id == item.id).first()
return voucher_info(item)
@view_config(
request_method="POST",
route_name="voucher_settle",
renderer="json",
permission="Settle Bill",
trans=False,
)
def settle_voucher(request):
update_table = request.GET["u"]
json = request.json_body
id_ = uuid.UUID(request.matchdict["id"])
item = request.dbsession.query(Voucher).filter(Voucher.id == id_).first()
allowed = [
SettleOption.AMOUNT(),
SettleOption.ROUND_OFF(),
SettleOption.UNSETTLED(),
]
for i in (j for j in json if j["Amount"] != 0):
amount = i["Amount"]
so = i["Settled"]
so_settled = [s for s in item.settlements if s.settled == so]
if len(so_settled) == 1:
so_settled[0].amount = amount
else:
s = Settlement(item.id, so, amount)
item.settlements.append(s)
request.dbsession.add(s)
allowed.append(so)
for i in (s for s in item.settlements if s.settled not in allowed):
item.settlements.remove(i)
request.dbsession.delete(i)
unsettled = get_settlements(item, request.dbsession)
if unsettled == 0 and update_table:
request.dbsession.query(Overview).filter(
Overview.voucher_id == item.id
).delete()
transaction.commit()
item = request.dbsession.query(Voucher).filter(Voucher.id == item.id).first()
return voucher_info(item)
@view_config(
request_method="POST",
route_name="voucher_reprint",
renderer="json",
permission="Edit Printed Bill",
trans=True,
) # Permission error
def voucher_change(request):
json = request.json_body
id_ = uuid.UUID(request.matchdict["id"])
item = save_voucher(json, request.dbsession)
old = request.dbsession.query(Voucher).filter(Voucher.id == id_).first()
old.void = True
old.void_reason = "Bill Discounted / Changed. New Bill ID is {0}".format(
item.full_bill_id
)
# TODO: Set the Void Settlement
if old.status is None:
item.status = Overview(
voucher_id=None, food_table_id=item.food_table_id, status="printed"
)
request.dbsession.add(item.status)
else:
request.dbsession.query(Overview).filter(Overview.voucher_id == old.id).update(
{Overview.voucher_id: item.id}
)
transaction.commit()
item = request.dbsession.query(Voucher).filter(Voucher.id == item.id).first()
return voucher_info(item)
@view_config(
request_method="POST",
route_name="voucher_void",
renderer="json",
permission="Void Bill",
trans=True,
)
def void_voucher(request):
update_table = request.GET["u"]
json = request.json_body
id_ = uuid.UUID(request.matchdict["id"])
item = request.dbsession.query(Voucher).filter(Voucher.id == id_).first()
item.void = True
item.void_reason = json["Reason"]
amount = round(-1 * sum(i.amount for k in item.kots for i in k.inventories), 5) * -1
s = Settlement(item.id, SettleOption.VOID(), amount)
item.settlements.append(s)
request.dbsession.add(s)
allowed = [
SettleOption.AMOUNT(),
SettleOption.ROUND_OFF(),
SettleOption.UNSETTLED(),
SettleOption.VOID(),
]
for i in (s for s in item.settlements if s.settled not in allowed):
item.settlements.remove(i)
request.dbsession.delete(i)
get_settlements(item, request.dbsession)
if update_table:
request.dbsession.delete(item.status)
transaction.commit()
item = request.dbsession.query(Voucher).filter(Voucher.id == item.id).first()
return voucher_info(item)
@view_config(
request_method="POST",
route_name="voucher_split",
renderer="json",
permission="Split Bill",
trans=True,
)
def split_voucher(request):
json = request.json_body
id_ = uuid.UUID(request.matchdict["id"])
item = request.dbsession.query(Voucher).filter(Voucher.id == id_).first()
item.void = True
item.void_reason = "Bill Split"
# TODO: Set the Void Settlement
new_one = save_voucher(json["One"], request.dbsession)
new_two = save_voucher(json["Two"], request.dbsession)
status = "printed" if item.is_printed else "running"
new_one.status = Overview(
voucher_id=None, food_table_id=new_one.food_table_id, status=status
)
request.dbsession.add(new_one.status)
request.dbsession.query(Overview).filter(Overview.voucher_id == item.id).update(
{Overview.voucher_id: new_two.id}
)
transaction.commit()
@view_config(
request_method="GET",
route_name="voucher_id",
renderer="json",
permission="Authenticated",
)
def show_id(request):
id_ = uuid.UUID(request.matchdict["id"])
item = request.dbsession.query(Voucher).filter(Voucher.id == id_).first()
return voucher_info(item)
@view_config(
request_method="GET",
route_name="voucher",
request_param="b",
renderer="json",
permission="Authenticated",
)
def show(request):
bill_id = request.GET["b"]
item = request.dbsession.query(Voucher)
if re.compile("^\d{2,}-\d{4}$").match(bill_id):
item = item.filter(
Voucher.bill_id == int(bill_id.replace("-", "")),
Voucher.voucher_type.in_([1, 3]),
)
elif re.compile("^NC-\d+$").match(bill_id):
item = item.filter(
Voucher.bill_id == int(bill_id.replace("NC-", "")),
Voucher.voucher_type == 2,
)
elif re.compile("^ST-\d+$").match(bill_id):
item = item.filter(
Voucher.bill_id == int(bill_id.replace("ST-", "")),
Voucher.voucher_type == 4,
)
item = item.first()
if item is None:
return {}
return voucher_info(item)
def voucher_info(item):
return {
"id": item.id,
"date": item.date.strftime("%d-%b-%Y %H:%M:%S"),
"pax": item.pax,
"user": {"id": item.user_id, "name": item.user.name},
"creationDate": item.creation_date.strftime("%d-%b-%Y %H:%M:%S"),
"lastEditDate": item.last_edit_date.strftime("%d-%b-%Y %H:%M:%S"),
"billId": item.bill_id,
"table": {"id": item.food_table_id, "name": item.food_table.name},
"customer": {"id": item.customer_id, "name": item.customer.name},
"settlements": [],
"narration": item.narration,
"void": item.is_void,
"voidReason": item.void_reason,
"printed": item.is_printed,
"voucherType": item.voucher_type,
"kotId": item.kot_id,
"kots": [
{
"id": k.id,
"code": k.code,
"date": k.date.strftime("%d-%b-%Y %H:%M:%S"),
"user": {"id": k.user_id, "name": k.user.name},
"inventories": [
{
"id": i.id,
"sortOrder": i.sort_order,
"product": {
"id": i.product_id,
"name": i.product.name,
"units": i.product.units,
"menuCategory": {
"id": i.product.menu_category_id,
"name": i.product.menu_category.name,
"discountLimit": i.product.menu_category.discount_limit,
},
"saleCategory": {
"id": i.product.sale_category_id,
"name": i.product.sale_category.name
},
},
"quantity": i.quantity,
"price": i.price,
"isHappyHour": i.is_happy_hour,
"taxRate": i.tax_rate,
"tax": {"id": i.vat_id, "name": i.vat.name},
"discount": i.discount,
"inventoryModifier": [
{
"modifier": {
"id": m.modifier.id,
"name": m.modifier.name,
"showInBill": m.modifier.show_in_bill,
},
"price": m.price,
}
for m in i.modifiers
],
}
for i in k.inventories
],
}
for k in item.kots
],
"reprints": [],
}
def get_st_vat(st, vat, voucher_type):
if voucher_type == VoucherType.STAFF.value:
return 0, 0
elif voucher_type == VoucherType.NO_CHARGE.value:
return 0, 0
else: # voucher_type in [REGULAR_BILL, TAKE_AWAY]:
return st, vat
def get_settlements(voucher, dbsession):
amount = round(
-1 * sum(sum(i.amount for i in k.inventories) for k in voucher.kots), 5
)
so_amount = [s for s in voucher.settlements if s.settled == SettleOption.AMOUNT()]
if len(so_amount) == 1:
so_amount[0].amount = amount
else:
s = Settlement(voucher.id, SettleOption.AMOUNT(), amount)
voucher.settlements.append(s)
dbsession.add(s)
round_off = round(amount) - amount
so_round_off = [
s for s in voucher.settlements if s.settled == SettleOption.ROUND_OFF()
]
if len(so_round_off) == 1 and round_off != 0:
so_round_off[0].amount = round_off
elif len(so_round_off) == 1 and round_off == 0:
voucher.settlements.remove(so_round_off[0])
dbsession.delete(so_round_off[0])
elif len(so_round_off) == 0 and round_off != 0:
s = Settlement(voucher.id, SettleOption.ROUND_OFF(), round_off)
voucher.settlements.append(s)
dbsession.add(s)
unsettled = sum(
s.amount for s in voucher.settlements if s.settled != SettleOption.UNSETTLED()
)
so_unsettled = [
s for s in voucher.settlements if s.settled == SettleOption.UNSETTLED()
]
if len(so_unsettled) == 1 and unsettled != 0:
so_unsettled[0].amount = unsettled
elif len(so_unsettled) == 1 and unsettled == 0:
voucher.settlements.remove(so_unsettled[0])
dbsession.delete(so_unsettled[0])
elif len(so_unsettled) == 0 and unsettled != 0:
s = Settlement(voucher.id, SettleOption.UNSETTLED(), unsettled)
voucher.settlements.append(s)
dbsession.add(s)
return unsettled
def save_voucher(json, dbsession):
item = Voucher(
json["Pax"],
json["Table"]["FoodTableID"],
json["Customer"]["CustomerID"],
json["Printed"],
json["VoucherType"],
json["User"]["UserID"],
dbsession,
)
dbsession.add(item)
for k in json["Kots"]:
kot = Kot(
item.id, item.food_table_id, item.date, item.user_id, dbsession=dbsession
)
item.kots.append(kot)
dbsession.add(kot)
for index, i in enumerate(k["Inventories"]):
st, vat = get_st_vat(i["ServiceTaxRate"], i["VatRate"], json["VoucherType"])
inv = Inventory(
kot.id,
uuid.UUID(i["ProductID"]),
i["Quantity"],
i["Price"],
i["Discount"],
i["IsHappyHour"],
i["ServiceTaxID"],
st,
i["VatID"],
vat,
index,
)
kot.inventories.append(inv)
dbsession.add(inv)
for m in i["Modifiers"]:
mod = InventoryModifier(None, uuid.UUID(m["ModifierID"]), 0)
inv.modifiers.append(mod)
dbsession.add(mod)
get_settlements(item, dbsession)
return item

View File

@ -0,0 +1,77 @@
# import re
# import uuid
# from datetime import datetime
# from decimal import Decimal
#
# import transaction
# from pyramid.httpexceptions import HTTPForbidden
# from pyramid.view import view_config
# from sqlalchemy import func
#
# from barker.exceptions import ValidationFailure
# from barker.models import (
# Inventory,
# InventoryModifier,
# Kot,
# Settlement,
# SettleOption,
# Voucher,
# Overview,
# VoucherType,
# )
from barker.models import VoucherType, Settlement, SettleOption
def get_st_vat(st, vat, voucher_type):
if voucher_type == VoucherType.STAFF.value:
return 0, 0
elif voucher_type == VoucherType.NO_CHARGE.value:
return 0, 0
else: # voucher_type in [REGULAR_BILL, TAKE_AWAY]:
return st, vat
def get_settlements(voucher, dbsession):
amount = round(
-1 * sum(sum(i.amount for i in k.inventories) for k in voucher.kots), 5
)
so_amount = [s for s in voucher.settlements if s.settled == SettleOption.AMOUNT()]
if len(so_amount) == 1:
so_amount[0].amount = amount
else:
s = Settlement(voucher.id, SettleOption.AMOUNT(), amount)
voucher.settlements.append(s)
dbsession.add(s)
round_off = round(amount) - amount
so_round_off = [
s for s in voucher.settlements if s.settled == SettleOption.ROUND_OFF()
]
if len(so_round_off) == 1 and round_off != 0:
so_round_off[0].amount = round_off
elif len(so_round_off) == 1 and round_off == 0:
voucher.settlements.remove(so_round_off[0])
dbsession.delete(so_round_off[0])
elif len(so_round_off) == 0 and round_off != 0:
s = Settlement(voucher.id, SettleOption.ROUND_OFF(), round_off)
voucher.settlements.append(s)
dbsession.add(s)
unsettled = sum(
s.amount for s in voucher.settlements if s.settled != SettleOption.UNSETTLED()
)
so_unsettled = [
s for s in voucher.settlements if s.settled == SettleOption.UNSETTLED()
]
if len(so_unsettled) == 1 and unsettled != 0:
so_unsettled[0].amount = unsettled
elif len(so_unsettled) == 1 and unsettled == 0:
voucher.settlements.remove(so_unsettled[0])
dbsession.delete(so_unsettled[0])
elif len(so_unsettled) == 0 and unsettled != 0:
s = Settlement(voucher.id, SettleOption.UNSETTLED(), unsettled)
voucher.settlements.append(s)
dbsession.add(s)
return unsettled

View File

@ -0,0 +1,42 @@
import uuid
import transaction
from pyramid.view import view_config
from barker.models import Voucher, Overview
from barker.views.voucher.save import save_voucher
from barker.views.voucher.show import voucher_info
@view_config(
request_method="POST",
route_name="voucher_reprint",
renderer="json",
permission="Edit Printed Bill",
trans=True,
) # Permission error
def voucher_change(request):
json = request.json_body
id_ = uuid.UUID(request.matchdict["id"])
item = save_voucher(json, request.dbsession)
old = request.dbsession.query(Voucher).filter(Voucher.id == id_).first()
old.void = True
old.void_reason = "Bill Discounted / Changed. New Bill ID is {0}".format(
item.full_bill_id
)
# TODO: Set the Void Settlement
if old.status is None:
item.status = Overview(
voucher_id=None, food_table_id=item.food_table_id, status="printed"
)
request.dbsession.add(item.status)
else:
request.dbsession.query(Overview).filter(Overview.voucher_id == old.id).update(
{Overview.voucher_id: item.id}
)
transaction.commit()
item = request.dbsession.query(Voucher).filter(Voucher.id == item.id).first()
return voucher_info(item)

View File

@ -0,0 +1,74 @@
import uuid
import transaction
from pyramid.httpexceptions import HTTPForbidden
from pyramid.view import view_config
from barker.models import Overview, Voucher, Kot, Inventory, InventoryModifier
from barker.views.voucher import get_st_vat, get_settlements
from barker.views.voucher.show import voucher_info
@view_config(request_method="PUT", route_name="v1_vouchers_new", renderer="json", trans=True)
def save(request):
update_table = request.GET["u"]
json = request.json_body
if not json["Printed"] and "Print Kot" not in request.effective_principals:
raise HTTPForbidden("You are not allowed to print a kot")
if json["Printed"] and "Print Bill" not in request.effective_principals:
raise HTTPForbidden("You are not allowed to print bill")
item = save_voucher(json, request.dbsession)
if update_table:
status = "printed" if item.is_printed else "running"
item.status = Overview(
voucher_id=None, food_table_id=item.food_table_id, status=status
)
request.dbsession.add(item.status)
transaction.commit()
item = request.dbsession.query(Voucher).filter(Voucher.id == item.id).first()
return voucher_info(item)
def save_voucher(json, dbsession):
item = Voucher(
json["Pax"],
json["Table"]["FoodTableID"],
json["Customer"]["CustomerID"],
json["Printed"],
json["VoucherType"],
json["User"]["UserID"],
dbsession,
)
dbsession.add(item)
for k in json["Kots"]:
kot = Kot(
item.id, item.food_table_id, item.date, item.user_id, dbsession=dbsession
)
item.kots.append(kot)
dbsession.add(kot)
for index, i in enumerate(k["Inventories"]):
st, vat = get_st_vat(i["ServiceTaxRate"], i["VatRate"], json["VoucherType"])
inv = Inventory(
kot.id,
uuid.UUID(i["ProductID"]),
i["Quantity"],
i["Price"],
i["Discount"],
i["IsHappyHour"],
i["ServiceTaxID"],
st,
i["VatID"],
vat,
index,
)
kot.inventories.append(inv)
dbsession.add(inv)
for m in i["Modifiers"]:
mod = InventoryModifier(None, uuid.UUID(m["ModifierID"]), 0)
inv.modifiers.append(mod)
dbsession.add(mod)
get_settlements(item, dbsession)
return item

View File

@ -0,0 +1,53 @@
import uuid
import transaction
from pyramid.view import view_config
from barker.models import SettleOption, Voucher, Settlement, Overview
from barker.views.voucher import get_settlements
from barker.views.voucher.show import voucher_info
@view_config(
request_method="POST",
route_name="voucher_settle",
renderer="json",
permission="Settle Bill",
trans=False,
)
def settle_voucher(request):
update_table = request.GET["u"]
json = request.json_body
id_ = uuid.UUID(request.matchdict["id"])
item = request.dbsession.query(Voucher).filter(Voucher.id == id_).first()
allowed = [
SettleOption.AMOUNT(),
SettleOption.ROUND_OFF(),
SettleOption.UNSETTLED(),
]
for i in (j for j in json if j["Amount"] != 0):
amount = i["Amount"]
so = i["Settled"]
so_settled = [s for s in item.settlements if s.settled == so]
if len(so_settled) == 1:
so_settled[0].amount = amount
else:
s = Settlement(item.id, so, amount)
item.settlements.append(s)
request.dbsession.add(s)
allowed.append(so)
for i in (s for s in item.settlements if s.settled not in allowed):
item.settlements.remove(i)
request.dbsession.delete(i)
unsettled = get_settlements(item, request.dbsession)
if unsettled == 0 and update_table:
request.dbsession.query(Overview).filter(
Overview.voucher_id == item.id
).delete()
transaction.commit()
item = request.dbsession.query(Voucher).filter(Voucher.id == item.id).first()
return voucher_info(item)

View File

@ -0,0 +1,160 @@
import re
import uuid
from pyramid.view import view_config
from barker.exceptions import ValidationFailure
from barker.models import Voucher, Overview, FoodTable, GuestBook
@view_config(
request_method="GET",
route_name="v1_vouchers_id",
renderer="json",
permission="Authenticated",
)
def show_id(request):
id_ = uuid.UUID(request.matchdict["id"])
item = request.dbsession.query(Voucher).filter(Voucher.id == id_).first()
return voucher_info(item)
@view_config(
request_method="GET",
route_name="v1_vouchers_new",
request_param="b",
renderer="json",
permission="Authenticated",
)
def show(request):
bill_id = request.GET["b"]
item = request.dbsession.query(Voucher)
if re.compile("^\d{2,}-\d{4}$").match(bill_id):
item = item.filter(
Voucher.bill_id == int(bill_id.replace("-", "")),
Voucher.voucher_type.in_([1, 3]),
)
elif re.compile("^NC-\d+$").match(bill_id):
item = item.filter(
Voucher.bill_id == int(bill_id.replace("NC-", "")),
Voucher.voucher_type == 2,
)
elif re.compile("^ST-\d+$").match(bill_id):
item = item.filter(
Voucher.bill_id == int(bill_id.replace("ST-", "")),
Voucher.voucher_type == 4,
)
item = item.first()
if item is None:
return {}
return voucher_info(item)
@view_config(
request_method="GET",
route_name="v1_vouchers_new",
request_param="t",
renderer="json",
permission="Authenticated",
)
def show_for_table(request):
table_id = uuid.UUID(request.GET["t"])
voucher_id = request.GET.get("v", None)
guest_id = request.GET.get("g", None)
if voucher_id is not None:
item = (
request.dbsession.query(Overview)
.filter(
Overview.voucher_id == uuid.UUID(voucher_id),
Overview.food_table_id == table_id,
)
.first()
)
if item is None:
raise ValidationFailure("Bill Not Found")
else:
return voucher_info(item.voucher)
table = request.dbsession.query(FoodTable).filter(FoodTable.id == table_id).first()
if guest_id is not None:
guest = request.dbsession.query(GuestBook).filter(GuestBook.id == guest_id).first()
return voucher_blank(table, guest)
def voucher_info(item):
return {
"id": item.id,
"date": item.date.strftime("%d-%b-%Y %H:%M:%S"),
"pax": item.pax,
"user": {"id": item.user_id, "name": item.user.name},
"creationDate": item.creation_date.strftime("%d-%b-%Y %H:%M:%S"),
"lastEditDate": item.last_edit_date.strftime("%d-%b-%Y %H:%M:%S"),
"billId": item.bill_id,
"table": {"id": item.food_table_id, "name": item.food_table.name},
"customer": {"id": item.customer_id, "name": item.customer.name},
"settlements": [],
"narration": item.narration,
"void": item.is_void,
"voidReason": item.void_reason,
"printed": item.is_printed,
"voucherType": item.voucher_type,
"kotId": item.kot_id,
"kots": [
{
"id": k.id,
"code": k.code,
"date": k.date.strftime("%d-%b-%Y %H:%M:%S"),
"user": {"id": k.user_id, "name": k.user.name},
"inventories": [
{
"id": i.id,
"sortOrder": i.sort_order,
"product": {
"id": i.product_id,
"name": i.product.name,
"units": i.product.units,
"menuCategory": {
"id": i.product.menu_category_id,
"name": i.product.menu_category.name,
"discountLimit": i.product.menu_category.discount_limit,
},
"saleCategory": {
"id": i.product.sale_category_id,
"name": i.product.sale_category.name,
},
},
"quantity": i.quantity,
"price": i.price,
"isHappyHour": i.is_happy_hour,
"taxRate": i.tax_rate,
"tax": {"id": i.tax_id, "name": i.tax.name},
"discount": i.discount,
"inventoryModifier": [
{
"modifier": {
"id": m.modifier.id,
"name": m.modifier.name,
"showInBill": m.modifier.show_in_bill,
},
"price": m.price,
}
for m in i.modifiers
],
}
for i in k.inventories
],
}
for k in item.kots
],
"reprints": [],
}
def voucher_blank(table, guest):
return {
"pax": table.seats if guest is None else guest.pax,
"table": {"id": table.id, "name": table.name},
"customer": {"id": guest.customer_id, "name": guest.customer.name},
"kots": []
}

View File

@ -0,0 +1,40 @@
import uuid
import transaction
from pyramid.view import view_config
from barker.models import Voucher, Overview
from barker.views.voucher.save import save_voucher
@view_config(
request_method="POST",
route_name="voucher_split",
renderer="json",
permission="Split Bill",
trans=True,
)
def split_voucher(request):
json = request.json_body
id_ = uuid.UUID(request.matchdict["id"])
item = request.dbsession.query(Voucher).filter(Voucher.id == id_).first()
item.void = True
item.void_reason = "Bill Split"
# TODO: Set the Void Settlement
new_one = save_voucher(json["One"], request.dbsession)
new_two = save_voucher(json["Two"], request.dbsession)
status = "printed" if item.is_printed else "running"
new_one.status = Overview(
voucher_id=None, food_table_id=new_one.food_table_id, status=status
)
request.dbsession.add(new_one.status)
request.dbsession.query(Overview).filter(Overview.voucher_id == item.id).update(
{Overview.voucher_id: new_two.id}
)
transaction.commit()

View File

@ -0,0 +1,129 @@
import datetime
import uuid
from decimal import Decimal
import transaction
from pyramid.httpexceptions import HTTPForbidden
from pyramid.view import view_config
from sqlalchemy import func
from barker.exceptions import ValidationFailure
from barker.models import Voucher, Kot, Inventory, InventoryModifier, Overview
from barker.views.voucher import get_st_vat, get_settlements
from barker.views.voucher.show import voucher_info
@view_config(
request_method="POST", route_name="v1_vouchers_id", renderer="json", trans=True
)
def update(request):
now = datetime.now()
update_table = request.GET["u"]
json = request.json_body
id = uuid.UUID(request.matchdict["id"])
item = request.dbsession.query(Voucher).filter(Voucher.id == id).first()
if not json["Printed"] and "Print Kot" not in request.effective_principals:
raise HTTPForbidden("You are not allowed to print a kot")
if json["Printed"] and "Print Bill" not in request.effective_principals:
raise HTTPForbidden("You are not allowed to print bill")
if item.is_printed and "Edit Printed Bill" not in request.effective_principals:
raise HTTPForbidden("You are not allowed to edit a printed bill")
if item.is_printed and not json["Printed"]:
transaction.abort()
raise ValidationFailure("This Bill is already printed\nCannot add a Kot to it.")
if item.is_void:
transaction.abort()
raise ValidationFailure(
"This Bill is already void.\nReason: {0}".format(item.void_reason)
)
if item.is_printed and not json["Printed"]:
transaction.abort()
raise ValidationFailure("This Bill is already printed\nCannot add a Kot to it.")
item.pax = json["Pax"]
item.food_table_id = json["Table"]["FoodTableID"]
item.customer_id = json["Customer"]["CustomerID"]
item.voucher_type = json["VoucherType"]
if not item.is_printed and json["Printed"]:
item.date = now
type = [1, 3] if item.voucher_type in [1, 3] else [item.voucher_type]
item.bill_id = (
request.dbsession.query(func.coalesce(func.max(Voucher.bill_id), 0) + 1)
.filter(Voucher.voucher_type.in_(type))
.scalar()
)
item.is_printed = item.is_printed or json["Printed"]
item.user_id = json["User"]["UserID"]
item.last_edit_date = now
for k in item.kots:
for i in k.inventories:
i.service_tax_rate, i.vat_rate = get_st_vat(
i.service_tax_rate, i.vat_rate, item.voucher_type
)
i.discount = next(
Decimal(inv["Discount"])
for ko in json["Kots"]
for inv in ko["Inventories"]
if uuid.UUID(inv["InventoryID"]) == i.id
)
for k in (
k for k in json["Kots"] if k["KotID"] == "00000000-0000-0000-0000-000000000000"
):
kot = Kot(
item.id,
item.food_table_id,
item.date,
item.user_id,
dbsession=request.dbsession,
)
item.kots.append(kot)
request.dbsession.add(kot)
for index, i in enumerate(k["Inventories"]):
st, vat = get_st_vat(i["ServiceTaxRate"], i["VatRate"], json["VoucherType"])
inv = Inventory(
kot.id,
uuid.UUID(i["ProductID"]),
i["Quantity"],
i["Price"],
i["Discount"],
i["IsHappyHour"],
i["ServiceTaxID"],
st,
i["VatID"],
vat,
index,
)
kot.inventories.append(inv)
request.dbsession.add(inv)
for m in i["Modifiers"]:
mod = InventoryModifier(None, uuid.UUID(m["ModifierID"]), 0)
inv.modifiers.append(mod)
request.dbsession.add(mod)
get_settlements(item, request.dbsession)
if update_table:
vft = (
request.dbsession.query(Overview)
.filter(Overview.voucher_id == item.id)
.first()
)
status = "printed" if item.is_printed else "running"
if vft is None:
item.status = Overview(
voucher_id=None, food_table_id=item.food_table_id, status=status
)
request.dbsession.add(item.status)
else:
vft.status = status
vft.food_table_id = item.food_table_id
transaction.commit()
item = request.dbsession.query(Voucher).filter(Voucher.id == item.id).first()
return voucher_info(item)

View File

@ -0,0 +1,48 @@
import uuid
import transaction
from pyramid.view import view_config
from barker.models import Voucher, SettleOption, Settlement
from barker.views.voucher import get_settlements
from barker.views.voucher.show import voucher_info
@view_config(
request_method="POST",
route_name="voucher_void",
renderer="json",
permission="Void Bill",
trans=True,
)
def void_voucher(request):
update_table = request.GET["u"]
json = request.json_body
id_ = uuid.UUID(request.matchdict["id"])
item = request.dbsession.query(Voucher).filter(Voucher.id == id_).first()
item.void = True
item.void_reason = json["Reason"]
amount = round(-1 * sum(i.amount for k in item.kots for i in k.inventories), 5) * -1
s = Settlement(item.id, SettleOption.VOID(), amount)
item.settlements.append(s)
request.dbsession.add(s)
allowed = [
SettleOption.AMOUNT(),
SettleOption.ROUND_OFF(),
SettleOption.UNSETTLED(),
SettleOption.VOID(),
]
for i in (s for s in item.settlements if s.settled not in allowed):
item.settlements.remove(i)
request.dbsession.delete(i)
get_settlements(item, request.dbsession)
if update_table:
request.dbsession.delete(item.status)
transaction.commit()
item = request.dbsession.query(Voucher).filter(Voucher.id == item.id).first()
return voucher_info(item)