barker/barker/views/voucher/settle.py

54 lines
1.6 KiB
Python

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)