Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions services.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from lnbits.core.models import User
from lnbits.helpers import create_access_token
from lnbits.settings import settings
from loguru import logger

from .helpers import from_csv, inventory_tags_to_list

Expand Down Expand Up @@ -118,3 +119,48 @@ def has_omit_tag(item_omit_tags: str | list[str] | None) -> bool:

def inventory_available_for_user(user: User | None) -> bool:
return bool(user and "inventory" in (user.extensions or []))


async def push_order_to_orders(
user_id: str,
payment,
tpos,
base_url: str | None = None,
) -> None:
details = payment.extra.get("details") or {}
payload = {
"source": "tpos",
"tpos_id": payment.extra.get("tpos_id"),
"tpos_name": tpos.name if tpos else None,
"payment_hash": payment.payment_hash,
"checking_id": payment.checking_id,
"amount_msat": payment.amount,
"fee_msat": payment.fee,
"memo": payment.memo,
"paid_in_fiat": bool(payment.extra.get("paid_in_fiat")),
"currency": details.get("currency"),
"exchange_rate": details.get("exchangeRate")
or payment.extra.get("exchangeRate"),
"tax_included": details.get("taxIncluded"),
"tax_value": details.get("taxValue"),
"items": details.get("items") or [],
"notes": payment.extra.get("notes"),
"created_at": payment.time.isoformat() if payment.time else None,
"paid": True,
"shipped": True,
}

access = create_access_token({"sub": "", "usr": user_id}, token_expire_minutes=1)
params = {}
if base_url:
params["base_url"] = base_url
async with httpx.AsyncClient() as client:
try:
await client.post(
url=f"http://{settings.host}:{settings.port}/orders/api/v1/orders",
headers={"Authorization": f"Bearer {access}"},
params=params,
json=payload,
)
except Exception as exc:
logger.warning(f"tpos: failed to push order to orders: {exc}")
1 change: 1 addition & 0 deletions static/js/tpos.js
Original file line number Diff line number Diff line change
Expand Up @@ -787,6 +787,7 @@ window.app = Vue.createApp({
formattedPrice: item.formattedPrice,
quantity: item.quantity,
title: item.title,
weight_grams: item.weight_grams,
tax: item.tax || this.taxDefault,
note: item.note || null
})),
Expand Down
27 changes: 25 additions & 2 deletions tasks.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import asyncio

from lnbits.core.crud import get_user_active_extensions_ids, get_wallet
from lnbits.core.models import Payment
from lnbits.core.services import (
create_invoice,
Expand All @@ -11,7 +12,7 @@
from loguru import logger

from .crud import get_tpos
from .services import deduct_inventory_stock
from .services import deduct_inventory_stock, push_order_to_orders


async def wait_for_paid_invoices():
Expand Down Expand Up @@ -65,9 +66,14 @@ async def on_invoice_paid(payment: Payment) -> None:

await websocket_updater(tpos_id, str(stripped_payment))

await maybe_push_order(payment, tpos)

inventory_payload = payment.extra.get("inventory")
if inventory_payload:
await deduct_inventory_stock(payment.wallet_id, inventory_payload)
try:
await deduct_inventory_stock(payment.wallet_id, inventory_payload)
except Exception as exc:
logger.warning(f"tpos: inventory deduction failed: {exc}")

if not tip_amount:
# no tip amount
Expand All @@ -90,3 +96,20 @@ async def on_invoice_paid(payment: Payment) -> None:
extra={**payment.extra, "tipSplitted": True},
)
logger.debug(f"tpos: tip invoice paid: {paid_payment.checking_id}")


async def maybe_push_order(payment: Payment, tpos) -> None:
wallet = await get_wallet(payment.wallet_id)
if not wallet:
return

active_extensions = await get_user_active_extensions_ids(wallet.user)
if "orders" not in active_extensions:
return

await push_order_to_orders(
wallet.user,
payment,
tpos,
base_url=payment.extra.get("base_url"),
)
7 changes: 5 additions & 2 deletions views_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from typing import Any

import httpx
from fastapi import APIRouter, Depends, HTTPException, Query
from fastapi import APIRouter, Depends, HTTPException, Query, Request
from lnbits.core.crud import (
get_latest_payments_by_extension,
get_standalone_payment,
Expand Down Expand Up @@ -164,7 +164,9 @@ async def api_tpos_delete(
@tpos_api_router.post(
"/api/v1/tposs/{tpos_id}/invoices", status_code=HTTPStatus.CREATED
)
async def api_tpos_create_invoice(tpos_id: str, data: CreateTposInvoice) -> Payment:
async def api_tpos_create_invoice(
tpos_id: str, data: CreateTposInvoice, request: Request
) -> Payment:
tpos = await get_tpos(tpos_id)

if not tpos:
Expand Down Expand Up @@ -227,6 +229,7 @@ async def api_tpos_create_invoice(tpos_id: str, data: CreateTposInvoice) -> Paym
"lnaddress": data.user_lnaddress if data.user_lnaddress else None,
"internal_memo": data.internal_memo if data.internal_memo else None,
"paid_in_fiat": data.pay_in_fiat,
"base_url": str(request.base_url),
}
if inventory_payload:
extra["inventory"] = inventory_payload.dict()
Expand Down