Repository navigation
Expand file tree
/
Copy pathviews_tabs.py
More file actions
125 lines (109 loc) · 3.64 KB
/
Copy pathviews_tabs.py
File metadata and controls
125 lines (109 loc) · 3.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import json
from datetime import datetime, timezone
from http import HTTPStatus
from typing import Any
from fastapi import APIRouter, HTTPException, Query
from .crud import get_tpos
from .models import CreateTposTabCharge, CreateTposTabData, Tpos, TposTab, TposTabList
from .services import ensure_tpos_tabs_access
from .services_tabs import (
create_tab_charge_for_tpos,
create_tab_for_tpos,
fetch_tabs_for_tpos,
get_tab_for_tpos,
)
tpos_tabs_router = APIRouter()
async def _get_tpos_or_404(tpos_id: str) -> Tpos:
tpos = await get_tpos(tpos_id)
if not tpos:
raise HTTPException(
status_code=HTTPStatus.NOT_FOUND, detail="TPoS does not exist."
)
return tpos
def _tpos_currency(tpos: Tpos) -> str:
return (tpos.currency or "sats").lower()
@tpos_tabs_router.get("/api/v1/tposs/{tpos_id}/tabs", response_model=TposTabList)
async def api_tpos_tabs(
tpos_id: str,
status: str = Query("open"),
q: str | None = Query(None),
) -> TposTabList:
tpos = await _get_tpos_or_404(tpos_id)
user_id = await ensure_tpos_tabs_access(tpos)
tabs = await fetch_tabs_for_tpos(
user_id=user_id,
wallet_id=tpos.wallet,
status=status,
query=q,
)
return TposTabList(data=[TposTab(**tab) for tab in tabs])
@tpos_tabs_router.post("/api/v1/tposs/{tpos_id}/tabs", response_model=TposTab)
async def api_tpos_create_tab(
tpos_id: str,
data: CreateTposTabData,
) -> TposTab:
tpos = await _get_tpos_or_404(tpos_id)
user_id = await ensure_tpos_tabs_access(tpos)
if not tpos.tabs_allow_create:
raise HTTPException(
status_code=HTTPStatus.FORBIDDEN,
detail="Tab creation is not enabled for this TPoS.",
)
tab_currency = (data.currency or _tpos_currency(tpos)).lower()
if tab_currency != _tpos_currency(tpos):
raise HTTPException(
status_code=HTTPStatus.BAD_REQUEST,
detail="Tab currency must match TPoS currency.",
)
payload = {
"wallet": tpos.wallet,
"name": data.name,
"customer_name": data.customer_name,
"reference": data.reference,
"currency": tab_currency,
"limit_type": data.limit_type,
"limit_amount": data.limit_amount,
}
tab = await create_tab_for_tpos(user_id=user_id, payload=payload)
return TposTab(**tab)
@tpos_tabs_router.post("/api/v1/tposs/{tpos_id}/tabs/{tab_id}/charges")
async def api_tpos_add_tab_charge(
tpos_id: str,
tab_id: str,
data: CreateTposTabCharge,
) -> dict[str, Any]:
tpos = await _get_tpos_or_404(tpos_id)
user_id = await ensure_tpos_tabs_access(tpos)
await get_tab_for_tpos(user_id, tpos, tab_id)
metadata = {
"source": "tpos",
"tpos_id": tpos.id,
"tpos_name": tpos.name,
"currency": tpos.currency,
"amount": data.amount,
"items": data.items,
"notes": data.notes,
"internal_memo": data.internal_memo,
"created_at": datetime.now(timezone.utc).isoformat(),
}
payload = {
"entry_type": "charge",
"amount": data.amount,
"description": data.description or "TPoS order charge",
"metadata": json.dumps(metadata),
"source": "tpos",
"source_id": tpos.id,
"source_action": "order_charge",
"idempotency_key": data.idempotency_key,
}
entry = await create_tab_charge_for_tpos(
user_id=user_id,
tab_id=tab_id,
payload=payload,
)
updated_tab = await get_tab_for_tpos(user_id, tpos, tab_id)
return {
"tab_id": tab_id,
"entry": entry,
"tab": TposTab(**updated_tab).model_dump(),
}