summer/summer/models/voucher.py

263 lines
9.4 KiB
Python

__author__ = 'tanshu'
import uuid
from sqlalchemy.ext.hybrid import hybrid_property
from sqlalchemy import Column, Integer, DateTime, Numeric, ForeignKey, Boolean, UniqueConstraint
from sqlalchemy.orm import relationship, synonym, backref
from summer.models.master import Tax
from summer.models.guidtype import GUID
from summer.models import Base
class VoucherType:
def __init__(self, id, name, show_in_choices, group):
self.id = id
self.name = name
self.show_in_choices = show_in_choices
self.group = group
@classmethod
def list(cls):
list = []
list.append(VoucherType(1, 'Regular Bill', True, 2))
list.append(VoucherType(2, 'No Charge', True, 3))
list.append(VoucherType(3, 'Take Away', True, 2))
list.append(VoucherType(4, 'Staff Bill', True, 4))
return list
@classmethod
def by_name(cls, name):
list = cls.list()
for item in list:
if item.name == name:
return item
@classmethod
def by_id(cls, id):
list = cls.list()
for item in list:
if item.id == id:
return item
class Voucher(Base):
__tablename__ = 'vouchers'
__tableagrs__ = (UniqueConstraint('voucher_type', 'bill_id'))
id = Column('voucher_id', GUID(), primary_key=True, default=uuid.uuid4)
date = Column('date', DateTime(timezone=True), nullable=False)
creation_date = Column('creation_date', DateTime(timezone=True), nullable=False)
last_edit_date = Column('last_edit_date', DateTime(timezone=True), nullable=False)
_type = Column('voucher_type', Integer, nullable=False)
kot_id = Column('kot_id', Integer, unique=True, nullable=False)
bill_id = Column('bill_id', Integer, nullable=True)
pax = Column('pax', Integer, nullable=False)
per_chair = Column('per_chair', Boolean, nullable=False)
user_id = Column('user_id', GUID(), ForeignKey('auth_users.user_id'), nullable=False)
food_table_id = Column('table_id', GUID(), ForeignKey('food_tables.food_table_id'), nullable=False)
user = relationship('User', primaryjoin="User.id==Voucher.user_id", cascade=None)
food_table = relationship('FoodTable', primaryjoin="FoodTable.id==Voucher.food_table_id", cascade=None)
kots = relationship('Kot', backref='voucher', cascade="delete, delete-orphan", cascade_backrefs=False)
def _get_type(self):
return self._type
# for item in VoucherType.list():
# if self._type == item.id:
# return item
def _set_type(self, value):
if type(value) == int:
self._type = value
else:
self._type = value.id
type = property(_get_type, _set_type)
type = synonym('_type', descriptor=type)
@property
def __name__(self):
return self.name
def __init__(self, date=None, creation_date=None, last_edit_date=None, type=None, kot_id=None, bill_id=None,
user_id=None, food_table_id=None, pax=None, per_seat=None, id=None):
self.id = id
self.date = date
self.creation_date = creation_date
self.last_edit_date = last_edit_date
self.type = type
self.kot_id = kot_id
self.bill_id = bill_id
self.user_id = user_id
self.food_table_id = food_table_id
self.pax = pax
self.per_seat = per_seat
@classmethod
def by_id(cls, id, *, DBSession=None):
return DBSession.query(cls).filter(cls.id == id).first()
@classmethod
def list(cls, *, DBSession=None):
return DBSession.query(cls).all()
@classmethod
def query(cls, *, DBSession=None):
return DBSession.query(cls)
class Kot(Base):
__tablename__ = 'kots'
id = Column('kot_id', GUID(), primary_key=True, default=uuid.uuid4)
voucher_id = Column('voucher_id', GUID(), ForeignKey('vouchers.voucher_id'), nullable=False)
code = Column('code', Integer, unique=True, nullable=False)
food_table_id = Column('table_id', GUID(), ForeignKey('food_tables.food_table_id'), nullable=False)
date = Column('date', DateTime, nullable=False)
user_id = Column('user_id', GUID(), ForeignKey('auth_users.user_id'), nullable=False)
food_table = relationship('FoodTable', primaryjoin="FoodTable.id==Kot.food_table_id", cascade=None)
@hybrid_property
def signed_amount(self):
return self.debit * self.amount
@property
def __name__(self):
return self.name
def __init__(self, code=None, food_table_id=None, date=None, user_id=None, voucher_id=None, id=None):
self.id = id
self.voucher_id = voucher_id
self.code = code
self.food_table_id = food_table_id
self.date = date
self.user_id = user_id
@classmethod
def by_id(cls, id):
return DBSession.query(cls).filter(cls.id == id).first()
@classmethod
def list(cls, voucher_id):
return DBSession.query(cls).filter(cls.voucher_id == voucher_id).all()
@classmethod
def query(cls):
return DBSession.query(cls)
class Inventory(Base):
__tablename__ = 'inventories'
# __tableagrs__ = (UniqueConstraint('VoucherID', 'ProductID'))
id = Column('inventory_id', GUID(), primary_key=True, default=uuid.uuid4)
kot_id = Column('kot_id', GUID(), ForeignKey('kots.kot_id'), nullable=False)
chair = Column('chair', Integer, nullable=False)
product_id = Column('product_id', GUID(), ForeignKey('products.product_id'), nullable=False)
quantity = Column('quantity', Numeric, nullable=False)
price = Column('rate', Numeric, nullable=False)
discount = Column('discount', Numeric, nullable=False)
is_happy_hour = Column('is_happy_hour', Boolean, nullable=False)
_service_tax_rate = Column('service_tax_rate', Numeric, nullable=False)
service_tax_id = Column('service_tax_id', GUID(), ForeignKey('taxes.tax_id'), nullable=False)
_vat_rate = Column('vat_rate', Numeric, nullable=False)
vat_id = Column('vat_id', GUID(), ForeignKey('taxes.tax_id'), nullable=False)
service_charge = Column('service_charge', Numeric, nullable=False)
sc_taxable = Column('sc_taxable', Boolean, nullable=False)
service_tax = relationship('Tax', foreign_keys=service_tax_id)
vat = relationship('Tax', foreign_keys=vat_id)
def __init__(self, chair=0, product_id=None, quantity=None, price=None, discount=None, is_happy_hour=None,
service_tax_id=None, service_tax_rate=None, vat_id=None, vat_rate=None, service_charge=None,
sc_taxable=None, kot_id=None, id=None):
self.id = id
self.kot_id = kot_id
self.chair = chair
self.product_id = product_id
self.quantity = quantity
self.price = price
self.discount = discount
self.is_happy_hour = is_happy_hour
self.service_tax_id = service_tax_id
self.service_tax_rate = service_tax_rate
self.vat_id = vat_id
self.vat_rate = vat_rate
self.service_charge = service_charge
self.sc_taxable = sc_taxable
def _get_service_tax_rate(self):
if self._service_tax_rate is not None:
return self._service_tax_rate
if self.service_tax is not None:
return self.service_tax.rate
if self.service_tax_id is not None:
return Tax.by_id(self.service_tax_id).rate
return None
def _set_service_tax_rate(self, value):
self._service_tax_rate = value
service_tax_rate = property(_get_service_tax_rate, _set_service_tax_rate)
service_tax_rate = synonym('_service_tax_rate', descriptor=service_tax_rate)
def _get_vat_rate(self):
if self._vat_rate is not None:
return self._vat_rate
if self.vat is not None:
return self.vat.rate
if self.vat_id is not None:
return Tax.by_id(self.vat_id).rate
return None
def _set_vat_rate(self, value):
self._vat_rate = value
vat_rate = property(_get_vat_rate, _set_vat_rate)
vat_rate = synonym('_vat_rate', descriptor=vat_rate)
@hybrid_property
def amount(self):
if self.is_happy_hour:
return 0
base = self.quantity * self.rate * (1 - self.discount)
if self.sc_taxable:
return base * (1 + self.service_charge) * (1 + self.service_tax_rate + self.vat_rate)
return base * (1 + self.service_charge + self.service_tax_rate + self.vat_rate)
class RunningTable(Base):
__tablename__ = 'running_tables'
id = Column('running_table_id', GUID(), primary_key=True, default=uuid.uuid4)
voucher_id = Column('voucher_id', GUID(), ForeignKey('vouchers.voucher_id'), nullable=False, unique=True)
food_table_id = Column('food_table_id', GUID(), ForeignKey('food_tables.food_table_id'), nullable=False,
unique=True)
_status = Column('table_status', Integer, nullable=False)
food_table = relationship('FoodTable', backref=backref('info', uselist=False))
def _get_status(self):
for item in RunningTable.list():
if self._status == item.id:
return item
def _set_status(self, value):
if type(value) == int:
self._status = value
else:
self._status = value.id
status = property(_get_status, _set_status)
status = synonym('_status', descriptor=status)
def __init__(self, id=None, voucher_id=None, food_table_id=None, status=None):
self.id = id
self.voucher_id = voucher_id
self.food_table_id = food_table_id
self.status = status