2025-08-05 11:16:01 +02:00
|
|
|
-- Initialize QBCore
|
2025-08-05 11:15:04 +02:00
|
|
|
local QBCore = exports['qb-core']:GetCoreObject()
|
|
|
|
|
2025-08-05 11:11:48 +02:00
|
|
|
local isUiOpen = false
|
|
|
|
local cooldown = false
|
|
|
|
|
2025-08-05 11:19:51 +02:00
|
|
|
-- Command to open main billing menu
|
2025-08-05 11:11:48 +02:00
|
|
|
RegisterCommand('bill', function()
|
2025-08-05 11:19:51 +02:00
|
|
|
OpenMainBillingMenu()
|
2025-08-05 11:11:48 +02:00
|
|
|
end, false)
|
|
|
|
|
|
|
|
-- Keybind registration
|
|
|
|
RegisterKeyMapping('bill', 'Open Billing Menu', 'keyboard', 'F7') -- Default key is F7, can be changed in settings
|
|
|
|
|
2025-08-05 11:19:51 +02:00
|
|
|
-- Function to open the main billing menu
|
|
|
|
function OpenMainBillingMenu()
|
|
|
|
lib.registerContext({
|
|
|
|
id = 'main_billing_menu',
|
|
|
|
title = 'Billing System',
|
|
|
|
options = {
|
|
|
|
{
|
2025-08-05 11:23:12 +02:00
|
|
|
title = 'Rechnung erstellen',
|
|
|
|
description = 'Sende eine Rechnung an einen Spieler in der Nähe',
|
2025-08-05 11:19:51 +02:00
|
|
|
icon = 'file-invoice-dollar',
|
|
|
|
onSelect = function()
|
|
|
|
OpenCreateBillMenu()
|
|
|
|
end
|
|
|
|
},
|
|
|
|
{
|
2025-08-05 11:23:12 +02:00
|
|
|
title = 'Meine Rechnungen',
|
|
|
|
description = 'Sehe & bezahle deine erhaltenen Rechnungen',
|
2025-08-05 11:19:51 +02:00
|
|
|
icon = 'money-check',
|
|
|
|
onSelect = function()
|
|
|
|
ViewBills()
|
|
|
|
end
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
lib.showContext('main_billing_menu')
|
|
|
|
end
|
|
|
|
|
|
|
|
-- Function to open the create bill menu
|
|
|
|
function OpenCreateBillMenu()
|
2025-08-05 11:11:48 +02:00
|
|
|
if cooldown then
|
|
|
|
lib.notify({
|
|
|
|
title = 'Billing System',
|
2025-08-05 14:07:51 +02:00
|
|
|
description = 'Bitte warte, bevor du das Abrechnungssystem erneut verwendest',
|
2025-08-05 11:11:48 +02:00
|
|
|
type = 'error'
|
|
|
|
})
|
|
|
|
return
|
|
|
|
end
|
|
|
|
|
|
|
|
-- Get nearby players
|
|
|
|
local players = GetNearbyPlayers()
|
|
|
|
if #players == 0 then
|
|
|
|
lib.notify({
|
|
|
|
title = 'Billing System',
|
2025-08-05 14:07:51 +02:00
|
|
|
description = 'Keine Spieler in der Nähe zum Abrechnen',
|
2025-08-05 11:11:48 +02:00
|
|
|
type = 'error'
|
|
|
|
})
|
|
|
|
return
|
|
|
|
end
|
|
|
|
|
|
|
|
-- Get player's accounts for receiving payment
|
|
|
|
local accounts = lib.callback.await('ps-banking:server:getAccounts', false) or {}
|
|
|
|
local accountOptions = {}
|
|
|
|
|
|
|
|
-- Add default bank account
|
|
|
|
table.insert(accountOptions, {
|
|
|
|
value = 'personal',
|
2025-08-05 14:07:51 +02:00
|
|
|
label = 'Persönliches Bankkonto'
|
2025-08-05 11:11:48 +02:00
|
|
|
})
|
|
|
|
|
|
|
|
-- Add other accounts
|
|
|
|
for _, account in ipairs(accounts) do
|
|
|
|
table.insert(accountOptions, {
|
|
|
|
value = account.id,
|
|
|
|
label = account.holder .. ' - ' .. account.cardNumber
|
|
|
|
})
|
|
|
|
end
|
|
|
|
|
2025-08-05 11:19:51 +02:00
|
|
|
-- Show the list of nearby players
|
2025-08-05 11:11:48 +02:00
|
|
|
local playerOptions = {}
|
|
|
|
for _, player in ipairs(players) do
|
|
|
|
table.insert(playerOptions, {
|
2025-08-05 11:16:01 +02:00
|
|
|
title = player.name,
|
|
|
|
description = 'ID: ' .. player.id,
|
2025-08-05 11:19:51 +02:00
|
|
|
icon = 'user',
|
2025-08-05 11:16:01 +02:00
|
|
|
onSelect = function()
|
|
|
|
-- When a player is selected, show the billing form
|
|
|
|
ShowBillingForm(player, accountOptions)
|
|
|
|
end
|
2025-08-05 11:11:48 +02:00
|
|
|
})
|
|
|
|
end
|
|
|
|
|
2025-08-05 11:16:01 +02:00
|
|
|
-- Register and show the player selection menu
|
|
|
|
lib.registerContext({
|
|
|
|
id = 'nearby_players_menu',
|
2025-08-05 14:07:51 +02:00
|
|
|
title = 'Spieler zum Abrechnen auswählen',
|
2025-08-05 11:19:51 +02:00
|
|
|
menu = 'main_billing_menu', -- Add back button to main menu
|
2025-08-05 11:16:01 +02:00
|
|
|
options = playerOptions
|
|
|
|
})
|
|
|
|
|
|
|
|
lib.showContext('nearby_players_menu')
|
|
|
|
end
|
|
|
|
|
|
|
|
-- Function to show the billing form after selecting a player
|
|
|
|
function ShowBillingForm(selectedPlayer, accountOptions)
|
2025-08-05 14:07:51 +02:00
|
|
|
local input = lib.inputDialog('Rechnung erstellen für ' .. selectedPlayer.name, {
|
2025-08-05 11:11:48 +02:00
|
|
|
{
|
|
|
|
type = 'number',
|
2025-08-05 14:07:51 +02:00
|
|
|
label = 'Betrag ($)',
|
|
|
|
description = 'Gib den Rechnungsbetrag ein',
|
2025-08-05 11:11:48 +02:00
|
|
|
icon = 'dollar-sign',
|
|
|
|
required = true,
|
|
|
|
min = 1,
|
|
|
|
max = 100000
|
|
|
|
},
|
|
|
|
{
|
|
|
|
type = 'input',
|
2025-08-05 14:07:51 +02:00
|
|
|
label = 'Grund',
|
|
|
|
description = 'Gib den Grund für die Rechnung ein',
|
|
|
|
placeholder = 'Erbrachte Dienstleistungen...',
|
2025-08-05 11:11:48 +02:00
|
|
|
required = true
|
|
|
|
},
|
|
|
|
{
|
|
|
|
type = 'select',
|
2025-08-05 14:07:51 +02:00
|
|
|
label = 'Empfangskonto',
|
2025-08-05 11:11:48 +02:00
|
|
|
options = accountOptions,
|
|
|
|
required = true
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
if not input then return end
|
|
|
|
|
|
|
|
-- Play animation
|
|
|
|
PlayBillingAnimation()
|
|
|
|
|
|
|
|
-- Send the bill
|
|
|
|
local success = lib.callback.await('billing:server:sendBill', false, {
|
2025-08-05 11:16:01 +02:00
|
|
|
playerId = selectedPlayer.id,
|
|
|
|
amount = input[1],
|
|
|
|
reason = input[2],
|
|
|
|
account = input[3]
|
2025-08-05 11:11:48 +02:00
|
|
|
})
|
|
|
|
|
|
|
|
if success then
|
|
|
|
lib.notify({
|
|
|
|
title = 'Billing System',
|
2025-08-05 14:07:51 +02:00
|
|
|
description = 'Rechnung erfolgreich an ' .. selectedPlayer.name .. ' gesendet',
|
2025-08-05 11:11:48 +02:00
|
|
|
type = 'success'
|
|
|
|
})
|
|
|
|
|
|
|
|
-- Set cooldown
|
|
|
|
cooldown = true
|
|
|
|
SetTimeout(5000, function()
|
|
|
|
cooldown = false
|
|
|
|
end)
|
2025-08-05 11:19:51 +02:00
|
|
|
|
|
|
|
-- Return to main menu
|
|
|
|
OpenMainBillingMenu()
|
2025-08-05 11:11:48 +02:00
|
|
|
else
|
|
|
|
lib.notify({
|
|
|
|
title = 'Billing System',
|
2025-08-05 14:07:51 +02:00
|
|
|
description = 'Fehler beim Senden der Rechnung',
|
2025-08-05 11:11:48 +02:00
|
|
|
type = 'error'
|
|
|
|
})
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2025-08-05 14:27:19 +02:00
|
|
|
-- Function to show payment account selection
|
|
|
|
function ShowPaymentAccountSelection(billId, amount, description)
|
|
|
|
-- Get player's accounts for payment
|
|
|
|
local accounts = lib.callback.await('ps-banking:server:getAccounts', false) or {}
|
|
|
|
local accountOptions = {}
|
|
|
|
|
|
|
|
-- Add default bank account
|
|
|
|
table.insert(accountOptions, {
|
|
|
|
value = 'personal',
|
|
|
|
label = 'Persönliches Bankkonto',
|
|
|
|
description = 'Bezahlen mit deinem Hauptkonto'
|
|
|
|
})
|
|
|
|
|
|
|
|
-- Add other accounts
|
|
|
|
for _, account in ipairs(accounts) do
|
|
|
|
table.insert(accountOptions, {
|
|
|
|
value = account.id,
|
|
|
|
label = account.holder .. ' - ' .. account.cardNumber,
|
|
|
|
description = 'Kontostand: $' .. account.balance
|
|
|
|
})
|
|
|
|
end
|
|
|
|
|
|
|
|
-- Register and show the account selection menu
|
|
|
|
lib.registerContext({
|
|
|
|
id = 'payment_account_menu',
|
|
|
|
title = 'Wähle Zahlungskonto',
|
|
|
|
menu = 'billing_menu', -- Add back button to bills menu
|
|
|
|
options = accountOptions,
|
|
|
|
onExit = function()
|
|
|
|
ViewBills() -- Return to bills menu
|
|
|
|
end,
|
|
|
|
onSelect = function(selected)
|
|
|
|
local accountId = selected.value
|
|
|
|
|
|
|
|
local confirm = lib.alertDialog({
|
|
|
|
header = 'Rechnung bezahlen',
|
|
|
|
content = ('Möchtest du $%s für %s von diesem Konto bezahlen?'):format(amount, description),
|
|
|
|
centered = true,
|
|
|
|
cancel = true
|
|
|
|
})
|
|
|
|
|
|
|
|
if confirm == 'confirm' then
|
|
|
|
local success = lib.callback.await('billing:server:payBillFromAccount', false, {
|
|
|
|
billId = billId,
|
|
|
|
accountId = accountId
|
|
|
|
})
|
|
|
|
|
|
|
|
if success then
|
|
|
|
lib.notify({
|
|
|
|
title = 'Billing System',
|
|
|
|
description = 'Rechnung erfolgreich bezahlt',
|
|
|
|
type = 'success'
|
|
|
|
})
|
|
|
|
ViewBills() -- Refresh the list
|
|
|
|
else
|
|
|
|
lib.notify({
|
|
|
|
title = 'Billing System',
|
|
|
|
description = 'Fehler beim Bezahlen der Rechnung. Unzureichendes Guthaben.',
|
|
|
|
type = 'error'
|
|
|
|
})
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
})
|
|
|
|
|
|
|
|
lib.showContext('payment_account_menu')
|
|
|
|
end
|
|
|
|
|
2025-08-05 11:11:48 +02:00
|
|
|
-- Function to view received bills
|
|
|
|
function ViewBills()
|
|
|
|
local bills = lib.callback.await('ps-banking:server:getBills', false)
|
|
|
|
|
|
|
|
if not bills or #bills == 0 then
|
|
|
|
lib.notify({
|
|
|
|
title = 'Billing System',
|
2025-08-05 14:07:51 +02:00
|
|
|
description = 'Du hast keine unbezahlten Rechnungen',
|
2025-08-05 11:11:48 +02:00
|
|
|
type = 'info'
|
|
|
|
})
|
2025-08-05 11:19:51 +02:00
|
|
|
|
|
|
|
-- Return to main menu after a short delay
|
|
|
|
SetTimeout(1000, function()
|
|
|
|
OpenMainBillingMenu()
|
|
|
|
end)
|
2025-08-05 11:11:48 +02:00
|
|
|
return
|
|
|
|
end
|
|
|
|
|
|
|
|
local billOptions = {}
|
|
|
|
for _, bill in ipairs(bills) do
|
|
|
|
local timestamp = os.date('%Y-%m-%d %H:%M', bill.date)
|
2025-08-05 14:07:51 +02:00
|
|
|
|
|
|
|
-- Check if bill is declined in our custom table
|
|
|
|
local billData = lib.callback.await('billing:server:getBillStatus', false, bill.id)
|
|
|
|
local isDeclined = billData and billData.declined == 1
|
|
|
|
|
|
|
|
local status = 'Unbezahlt'
|
|
|
|
if bill.isPaid then
|
|
|
|
status = 'Bezahlt'
|
|
|
|
elseif isDeclined then
|
|
|
|
status = 'Abgelehnt'
|
|
|
|
end
|
|
|
|
|
2025-08-05 11:11:48 +02:00
|
|
|
table.insert(billOptions, {
|
|
|
|
title = bill.description,
|
2025-08-05 14:07:51 +02:00
|
|
|
description = ('Betrag: $%s | Datum: %s'):format(bill.amount, timestamp),
|
2025-08-05 11:19:51 +02:00
|
|
|
icon = 'file-invoice',
|
2025-08-05 11:11:48 +02:00
|
|
|
metadata = {
|
2025-08-05 14:07:51 +02:00
|
|
|
{label = 'Rechnungs-ID', value = bill.id},
|
|
|
|
{label = 'Typ', value = bill.type},
|
|
|
|
{label = 'Status', value = status}
|
2025-08-05 11:11:48 +02:00
|
|
|
},
|
|
|
|
onSelect = function()
|
2025-08-05 14:07:51 +02:00
|
|
|
if not bill.isPaid and not isDeclined then
|
2025-08-05 14:27:19 +02:00
|
|
|
-- Show account selection for payment
|
|
|
|
ShowPaymentAccountSelection(bill.id, bill.amount, bill.description)
|
2025-08-05 11:11:48 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
})
|
|
|
|
end
|
|
|
|
|
|
|
|
lib.registerContext({
|
|
|
|
id = 'billing_menu',
|
2025-08-05 14:07:51 +02:00
|
|
|
title = 'Deine Rechnungen',
|
2025-08-05 11:19:51 +02:00
|
|
|
menu = 'main_billing_menu', -- Add back button to main menu
|
2025-08-05 11:11:48 +02:00
|
|
|
options = billOptions
|
|
|
|
})
|
|
|
|
|
|
|
|
lib.showContext('billing_menu')
|
|
|
|
end
|
|
|
|
|
|
|
|
-- Helper function to get nearby players
|
|
|
|
function GetNearbyPlayers()
|
|
|
|
local playerPed = PlayerPedId()
|
2025-08-05 11:16:01 +02:00
|
|
|
local playerCoords = GetEntityCoords(playerPed)
|
|
|
|
local players = {}
|
2025-08-05 11:11:48 +02:00
|
|
|
|
2025-08-05 11:16:01 +02:00
|
|
|
-- Get all players
|
|
|
|
local allPlayers = GetActivePlayers()
|
|
|
|
|
|
|
|
for _, player in ipairs(allPlayers) do
|
2025-08-05 11:11:48 +02:00
|
|
|
local targetPed = GetPlayerPed(player)
|
|
|
|
local targetCoords = GetEntityCoords(targetPed)
|
2025-08-05 11:16:01 +02:00
|
|
|
local distance = #(playerCoords - targetCoords)
|
2025-08-05 11:11:48 +02:00
|
|
|
|
|
|
|
if distance <= 5.0 and targetPed ~= playerPed then
|
|
|
|
local targetId = GetPlayerServerId(player)
|
|
|
|
local targetName = GetPlayerName(player)
|
2025-08-05 11:16:01 +02:00
|
|
|
table.insert(players, {id = targetId, name = targetName})
|
2025-08-05 11:11:48 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2025-08-05 11:16:01 +02:00
|
|
|
return players
|
2025-08-05 11:11:48 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
-- Animation function
|
|
|
|
function PlayBillingAnimation()
|
|
|
|
lib.requestAnimDict("cellphone@")
|
|
|
|
|
|
|
|
-- Request the prop model
|
|
|
|
local propModel = 'bzzz_prop_payment_terminal'
|
|
|
|
lib.requestModel(propModel)
|
|
|
|
|
|
|
|
-- Create prop
|
|
|
|
local playerPed = PlayerPedId()
|
|
|
|
local coords = GetEntityCoords(playerPed)
|
|
|
|
local prop = CreateObject(GetHashKey(propModel), coords.x, coords.y, coords.z, true, true, true)
|
|
|
|
|
|
|
|
-- Attach prop to player
|
|
|
|
AttachEntityToEntity(prop, playerPed, GetPedBoneIndex(playerPed, 57005),
|
|
|
|
0.18, 0.01, 0.0, -54.0, 220.0, 43.0,
|
|
|
|
true, true, false, true, 1, true)
|
|
|
|
|
|
|
|
-- Play animation
|
|
|
|
TaskPlayAnim(playerPed, "cellphone@", "cellphone_text_read_base", 2.0, 3.0, -1, 49, 0, false, false, false)
|
|
|
|
|
|
|
|
-- Wait for animation to complete
|
|
|
|
Wait(5000)
|
|
|
|
|
|
|
|
-- Clear animation and delete prop
|
|
|
|
ClearPedTasks(playerPed)
|
|
|
|
DeleteEntity(prop)
|
|
|
|
end
|
2025-08-05 14:07:51 +02:00
|
|
|
|
|
|
|
-- Event to show payment prompt when receiving a bill
|
|
|
|
RegisterNetEvent('billing:client:showPaymentPrompt', function(data)
|
|
|
|
-- Play a notification sound
|
|
|
|
PlaySound(-1, "Event_Start_Text", "GTAO_FM_Events_Soundset", 0, 0, 1)
|
|
|
|
|
2025-08-05 14:27:19 +02:00
|
|
|
-- Get player's accounts for payment
|
|
|
|
local accounts = lib.callback.await('ps-banking:server:getAccounts', false) or {}
|
|
|
|
local accountOptions = {}
|
|
|
|
|
|
|
|
-- Add default bank account
|
|
|
|
table.insert(accountOptions, {
|
|
|
|
title = 'Persönliches Bankkonto',
|
|
|
|
description = 'Bezahlen mit deinem Hauptkonto',
|
|
|
|
icon = 'credit-card',
|
|
|
|
onSelect = function()
|
|
|
|
local success = lib.callback.await('billing:server:handleBillResponse', false, {
|
|
|
|
action = 'pay',
|
|
|
|
billId = data.billId,
|
|
|
|
accountId = 'personal'
|
|
|
|
})
|
|
|
|
|
|
|
|
if success then
|
|
|
|
lib.notify({
|
|
|
|
title = 'Rechnung bezahlt',
|
|
|
|
description = 'Du hast die Rechnung erfolgreich bezahlt',
|
|
|
|
type = 'success'
|
|
|
|
})
|
|
|
|
else
|
|
|
|
lib.notify({
|
|
|
|
title = 'Zahlung fehlgeschlagen',
|
|
|
|
description = 'Du hast nicht genug Geld auf deinem Konto',
|
|
|
|
type = 'error'
|
|
|
|
})
|
|
|
|
end
|
|
|
|
end
|
|
|
|
})
|
|
|
|
|
|
|
|
-- Add other accounts
|
|
|
|
for _, account in ipairs(accounts) do
|
|
|
|
table.insert(accountOptions, {
|
|
|
|
title = account.holder .. ' - ' .. account.cardNumber,
|
|
|
|
description = 'Kontostand: $' .. account.balance,
|
|
|
|
icon = 'university',
|
|
|
|
onSelect = function()
|
|
|
|
local success = lib.callback.await('billing:server:handleBillResponse', false, {
|
|
|
|
action = 'pay',
|
|
|
|
billId = data.billId,
|
|
|
|
accountId = account.id
|
|
|
|
})
|
|
|
|
|
|
|
|
if success then
|
|
|
|
lib.notify({
|
|
|
|
title = 'Rechnung bezahlt',
|
|
|
|
description = 'Du hast die Rechnung erfolgreich bezahlt',
|
|
|
|
type = 'success'
|
|
|
|
})
|
|
|
|
else
|
|
|
|
lib.notify({
|
|
|
|
title = 'Zahlung fehlgeschlagen',
|
|
|
|
description = 'Nicht genug Geld auf diesem Konto',
|
|
|
|
type = 'error'
|
|
|
|
})
|
|
|
|
end
|
|
|
|
end
|
|
|
|
})
|
|
|
|
end
|
|
|
|
|
2025-08-05 14:07:51 +02:00
|
|
|
-- Create the payment prompt
|
|
|
|
lib.registerContext({
|
|
|
|
id = 'bill_payment_prompt',
|
|
|
|
title = 'Neue Rechnung erhalten',
|
|
|
|
options = {
|
|
|
|
{
|
|
|
|
title = 'Rechnung Details',
|
|
|
|
description = 'Von: ' .. data.sender,
|
|
|
|
metadata = {
|
|
|
|
{label = 'Betrag', value = '$' .. data.amount},
|
|
|
|
{label = 'Grund', value = data.reason},
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
title = 'Bezahlen',
|
2025-08-05 14:27:19 +02:00
|
|
|
description = 'Wähle ein Konto zum Bezahlen',
|
2025-08-05 14:07:51 +02:00
|
|
|
icon = 'money-bill',
|
2025-08-05 14:27:19 +02:00
|
|
|
menu = 'payment_account_selection'
|
2025-08-05 14:07:51 +02:00
|
|
|
},
|
|
|
|
{
|
|
|
|
title = 'Ablehnen',
|
|
|
|
description = 'Rechnung ablehnen',
|
|
|
|
icon = 'times-circle',
|
|
|
|
onSelect = function()
|
|
|
|
local confirm = lib.alertDialog({
|
|
|
|
header = 'Rechnung ablehnen',
|
|
|
|
content = 'Bist du sicher, dass du diese Rechnung ablehnen möchtest?',
|
|
|
|
centered = true,
|
|
|
|
cancel = true
|
|
|
|
})
|
|
|
|
|
|
|
|
if confirm == 'confirm' then
|
|
|
|
local success = lib.callback.await('billing:server:handleBillResponse', false, {
|
|
|
|
action = 'decline',
|
|
|
|
billId = data.billId
|
|
|
|
})
|
|
|
|
|
|
|
|
if success then
|
|
|
|
lib.notify({
|
|
|
|
title = 'Rechnung abgelehnt',
|
|
|
|
description = 'Du hast die Rechnung abgelehnt',
|
|
|
|
type = 'info'
|
|
|
|
})
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
},
|
|
|
|
{
|
|
|
|
title = 'Später bezahlen',
|
|
|
|
description = 'Rechnung für später speichern',
|
|
|
|
icon = 'clock',
|
|
|
|
onSelect = function()
|
|
|
|
lib.callback.await('billing:server:handleBillResponse', false, {
|
|
|
|
action = 'later',
|
|
|
|
billId = data.billId
|
|
|
|
})
|
|
|
|
|
|
|
|
lib.notify({
|
|
|
|
title = 'Rechnung gespeichert',
|
|
|
|
description = 'Die Rechnung wurde für später gespeichert',
|
|
|
|
type = 'info'
|
|
|
|
})
|
|
|
|
end
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
2025-08-05 14:27:19 +02:00
|
|
|
-- Register the account selection submenu
|
|
|
|
lib.registerContext({
|
|
|
|
id = 'payment_account_selection',
|
|
|
|
title = 'Wähle Zahlungskonto',
|
|
|
|
menu = 'bill_payment_prompt',
|
|
|
|
options = accountOptions
|
|
|
|
})
|
|
|
|
|
2025-08-05 14:07:51 +02:00
|
|
|
-- Show the payment prompt
|
|
|
|
lib.showContext('bill_payment_prompt')
|
|
|
|
end)
|