barker/barker/views/voucher/void.py

58 lines
1.6 KiB
Python

import uuid
import transaction
from pyramid.view import view_config
from barker.models import Voucher, SettleOption, Settlement, Overview
@view_config(
request_method="POST",
route_name="v1_vouchers_id",
renderer="json",
request_param="v",
permission="Void Bill",
trans=True,
)
def void_voucher(request):
id_ = uuid.UUID(request.matchdict["id"])
reason = request.GET["v"]
update_table = request.GET["u"]
item = request.dbsession.query(Voucher).filter(Voucher.id == id_).first()
item.void = True
item.void_reason = reason
settlements = []
total_amount = item.amount
settlements.append({"id": SettleOption.AMOUNT(), "amount": -total_amount})
round_off = round(total_amount) - total_amount
if round_off != 0:
settlements.append({"id": SettleOption.ROUND_OFF(), "amount": -round_off})
settlements.append({"id": SettleOption.VOID(), "amount": round(total_amount)})
for i in settlements:
amount = i["amount"]
settlement_type_id = i["id"]
old = [s for s in item.settlements if s.settled == settlement_type_id]
if len(old) == 1:
old[0].amount = amount
else:
s = Settlement(item.id, settlement_type_id, amount)
item.settlements.append(s)
request.dbsession.add(s)
for i in (i for i in item.settlements if i.settled not in [x["id"] for x in settlements]):
item.settlements.remove(i)
request.dbsession.delete(i)
if update_table:
request.dbsession.query(Overview).filter(
Overview.voucher_id == item.id
).delete()
transaction.commit()
return True