furizon_webint/money.py

54 lines
2.3 KiB
Python

from sanic import Blueprint, exceptions, response
from time import time
from asyncio import Future
import asyncio
from datetime import datetime
bp = Blueprint("money", url_prefix="/money")
@bp.post("/pos")
async def do_transaction(request):
message = ''
tx_id = request.app.ctx.money.execute('INSERT INTO tx(tag_id, amount, ts) VALUES (?,?,?) RETURNING id', (request.form.get('nfc_id'), request.form.get('total'), time())).fetchone()[0]
for item, qty in request.form.items():
if not item.startswith('itm_'): continue
if qty[0] == '0': continue
request.app.ctx.money.execute('INSERT INTO tx_items(tx_id, item_id, qty) VALUES (?,?,?)', (tx_id, item[4:], qty[0]))
request.app.ctx.money.commit()
return await show_transactions(request, message='Transazione eseguita con successo!')
@bp.get("/pos")
async def show_transactions(request, message=None):
tpl = request.app.ctx.tpl.get_template('pos.html')
items = request.app.ctx.money.execute('SELECT * FROM item')
tx_info = {}
last_tx = request.app.ctx.money.execute('SELECT * FROM tx WHERE amount < 0 ORDER BY ts DESC LIMIT 3').fetchall()
for tx in last_tx:
tx_info[tx['id']] = {'items': request.app.ctx.money.execute('SELECT * FROM tx_items JOIN item ON item_id = item.id AND tx_id = ?', (tx['id'],)).fetchall(), 'order': await request.app.ctx.om.get_order(nfc_id=tx['tag_id']), 'time': datetime.fromtimestamp(tx['ts'] or 0).strftime('%H:%M')}
return response.html(tpl.render(items=items, message=message, last_tx=last_tx, tx_info=tx_info))
@bp.get("/poll_barcode")
async def give_barcode(request):
request.app.ctx.nfc_reads[request.ip] = Future()
try:
bcd = await asyncio.wait_for(request.app.ctx.nfc_reads[request.ip], 20)
except asyncio.TimeoutError:
if not request.ip in request.app.ctx.nfc_reads:
del request.app.ctx.nfc_reads[request.ip]
return response.json({'error': 'no_barcode'})
info = request.app.ctx.money.execute("SELECT count(*), coalesce(sum(amount), 0) FROM tx WHERE coalesce(is_canceled, 0) != 1 AND tag_id = ?", (bcd['id'],)).fetchone()
order = await request.app.ctx.om.get_order(nfc_id=bcd['id'])
desc = ("⚠️" if not bcd['is_secure'] else '') + (f"👤 {order.code} {order.name}" if order else f"🪙 {bcd['id']}") + f" · Transazioni: {info[0]}"
return response.json({**bcd, 'txamt': info[0], 'balance': info[1], 'desc': desc})