Rounds up when adding multiple users to purchase instead of rounding down, meaning you cannot abuse the system by adding yourself multiple times.
Correctly logs transaction amount when applying penalty. Better shows penalty effect in purchase menu. Preparations for database format update.
This commit is contained in:
parent
033a93bd4c
commit
8954ab4304
9
db.py
9
db.py
|
@ -1,6 +1,7 @@
|
||||||
from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey, create_engine, DateTime, Boolean, or_
|
from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey, create_engine, DateTime, Boolean, or_
|
||||||
from sqlalchemy.orm import sessionmaker, relationship, backref
|
from sqlalchemy.orm import sessionmaker, relationship, backref
|
||||||
from sqlalchemy.ext.declarative import declarative_base
|
from sqlalchemy.ext.declarative import declarative_base
|
||||||
|
from math import ceil
|
||||||
import datetime
|
import datetime
|
||||||
import conf
|
import conf
|
||||||
|
|
||||||
|
@ -89,6 +90,7 @@ class Transaction(Base):
|
||||||
amount = Column(Integer)
|
amount = Column(Integer)
|
||||||
description = Column(String(50))
|
description = Column(String(50))
|
||||||
purchase_id = Column(Integer, ForeignKey('purchases.id'))
|
purchase_id = Column(Integer, ForeignKey('purchases.id'))
|
||||||
|
#penalty = Column(Integer)
|
||||||
|
|
||||||
user = relationship(User, backref=backref('transactions', order_by=time))
|
user = relationship(User, backref=backref('transactions', order_by=time))
|
||||||
|
|
||||||
|
@ -97,11 +99,12 @@ class Transaction(Base):
|
||||||
self.amount = amount
|
self.amount = amount
|
||||||
self.description = description
|
self.description = description
|
||||||
self.purchase = purchase
|
self.purchase = purchase
|
||||||
self.penalty_ratio = penalty_ratio
|
self.penalty = penalty_ratio
|
||||||
|
|
||||||
def perform_transaction(self):
|
def perform_transaction(self):
|
||||||
self.time = datetime.datetime.now()
|
self.time = datetime.datetime.now()
|
||||||
self.user.credit -= self.amount * self.penalty_ratio
|
self.amount *= self.penalty
|
||||||
|
self.user.credit -= self.amount
|
||||||
if self.purchase:
|
if self.purchase:
|
||||||
for entry in self.purchase.entries:
|
for entry in self.purchase.entries:
|
||||||
entry.product.stock -= entry.amount
|
entry.product.stock -= entry.amount
|
||||||
|
@ -131,7 +134,7 @@ class Purchase(Base):
|
||||||
return len(self.transactions) > 0 and len(self.entries) > 0
|
return len(self.transactions) > 0 and len(self.entries) > 0
|
||||||
|
|
||||||
def price_per_transaction(self):
|
def price_per_transaction(self):
|
||||||
return self.price/len(self.transactions)
|
return int(ceil(float(self.price)/len(self.transactions)))
|
||||||
|
|
||||||
def set_price(self):
|
def set_price(self):
|
||||||
self.price = 0
|
self.price = 0
|
||||||
|
|
|
@ -787,6 +787,8 @@ class ShowUserMenu(Menu):
|
||||||
string += ', '.join(map(lambda e: e.product.name,
|
string += ', '.join(map(lambda e: e.product.name,
|
||||||
t.purchase.entries))
|
t.purchase.entries))
|
||||||
string += ')'
|
string += ')'
|
||||||
|
#if t.penalty > 1:
|
||||||
|
# string += ' * %dx penalty applied' % t.penalty
|
||||||
else:
|
else:
|
||||||
string += t.description
|
string += t.description
|
||||||
string += '\n'
|
string += '\n'
|
||||||
|
@ -808,6 +810,8 @@ class ShowUserMenu(Menu):
|
||||||
string += ', '.join(map(lambda e: e.product.name,
|
string += ', '.join(map(lambda e: e.product.name,
|
||||||
t.purchase.entries))
|
t.purchase.entries))
|
||||||
string += ')'
|
string += ')'
|
||||||
|
#if t.penalty > 1:
|
||||||
|
# string += ' * %dx penalty applied' % t.penalty
|
||||||
else:
|
else:
|
||||||
string += t.description
|
string += t.description
|
||||||
string += '\n'
|
string += '\n'
|
||||||
|
@ -922,7 +926,7 @@ When finished, write an empty line to confirm the purchase.
|
||||||
print '--------------------------------------------'
|
print '--------------------------------------------'
|
||||||
|
|
||||||
if not self.credit_check(thing):
|
if not self.credit_check(thing):
|
||||||
if self.low_credit_warning(user=thing, timeout=self.superfast_mode ):
|
if self.low_credit_warning(user=thing, timeout=self.superfast_mode):
|
||||||
Transaction(thing, purchase=self.purchase, penalty_ratio=2)
|
Transaction(thing, purchase=self.purchase, penalty_ratio=2)
|
||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
@ -1022,7 +1026,7 @@ When finished, write an empty line to confirm the purchase.
|
||||||
if len(transactions) == 0:
|
if len(transactions) == 0:
|
||||||
string += '(empty)'
|
string += '(empty)'
|
||||||
else:
|
else:
|
||||||
string += ', '.join(map(lambda t: t.user.name,
|
string += ', '.join(map(lambda t: t.user.name + ("*" if t.user.credit < conf.user_recent_transaction_limit else ""),
|
||||||
transactions))
|
transactions))
|
||||||
string += '\n products: '
|
string += '\n products: '
|
||||||
if len(entries) == 0:
|
if len(entries) == 0:
|
||||||
|
@ -1032,7 +1036,14 @@ When finished, write an empty line to confirm the purchase.
|
||||||
entries))
|
entries))
|
||||||
if len(transactions) > 1:
|
if len(transactions) > 1:
|
||||||
string += '\n price per person: %d kr' % self.purchase.price_per_transaction()
|
string += '\n price per person: %d kr' % self.purchase.price_per_transaction()
|
||||||
|
if any(t.penalty > 1 for t in transactions):
|
||||||
|
string += ' *(%d kr)' % (self.purchase.price_per_transaction() * 2)
|
||||||
|
|
||||||
string += '\n total price: %d kr' % self.purchase.price
|
string += '\n total price: %d kr' % self.purchase.price
|
||||||
|
|
||||||
|
if any(t.penalty > 1 for t in transactions):
|
||||||
|
string += '\n *total with penalty: %d kr' % sum(self.purchase.price_per_transaction() * t.penalty for t in transactions)
|
||||||
|
|
||||||
return string
|
return string
|
||||||
|
|
||||||
def print_purchase(self):
|
def print_purchase(self):
|
||||||
|
|
Loading…
Reference in New Issue