[HELP] Ensure invoices are paid directly

Hi all,
I use esx_billing and I would like the bills that police or paramedics put to be taken directly from players’ bank accounts without giving them a chance to decide whether or not they want to pay:)

Like here :

if Config.EnablePlayerManagement then
TriggerServerEvent(‘esx_billing:sendBill’, GetPlayerServerId(player), ‘society_police’, _U(‘fine_total’, label), amount)
else
TriggerServerEvent(‘esx_billing:sendBill’, GetPlayerServerId(player), ‘’, _U(‘fine_total’, label), amount)
end

Thanks everyone !

Please send the lines for esx_billing:sendBill from the server/main.lua

I have try with the function esx_billing:paybill but dont work or i have fail :confused:

ESX = nil

TriggerEvent(‘esx:getSharedObject’, function(obj) ESX = obj end)

RegisterServerEvent(‘esx_billing:sendBill’)
AddEventHandler(‘esx_billing:sendBill’, function(playerId, sharedAccountName, label, amount)
local _source = source
local xPlayer = ESX.GetPlayerFromId(_source)
local xTarget = ESX.GetPlayerFromId(playerId)
amount = ESX.Math.Round(amount)

TriggerEvent(‘esx_addonaccount:getSharedAccount’, sharedAccountName, function(account)

  if amount < 0 then
  	print(('esx_billing: %s attempted to send a negative bill!'):format(xPlayer.identifier))
  elseif account == nil then

  	if xTarget ~= nil then
  		MySQL.Async.execute('INSERT INTO billing (identifier, sender, target_type, target, label, amount) VALUES (@identifier, @sender, @target_type, @target, @label, @amount)',
  		{
  			['@identifier']  = xTarget.identifier,
  			['@sender']      = xPlayer.identifier,
  			['@target_type'] = 'player',
  			['@target']      = xPlayer.identifier,
  			['@label']       = label,
  			['@amount']      = amount
  		}, function(rowsChanged)
  			TriggerClientEvent('esx:showNotification', xTarget.source, _U('received_invoice'))
  		end)
  	end

  else

  	if xTarget ~= nil then
  		MySQL.Async.execute('INSERT INTO billing (identifier, sender, target_type, target, label, amount) VALUES (@identifier, @sender, @target_type, @target, @label, @amount)',
  		{
  			['@identifier']  = xTarget.identifier,
  			['@sender']      = xPlayer.identifier,
  			['@target_type'] = 'society',
  			['@target']      = sharedAccountName,
  			['@label']       = label,
  			['@amount']      = amount
  		}, function(rowsChanged)
  			TriggerClientEvent('esx:showNotification', xTarget.source, _U('received_invoice'))
  		end)
  	end

  end

end)

end)

ESX.RegisterServerCallback(‘esx_billing:getBills’, function(source, cb)
local xPlayer = ESX.GetPlayerFromId(source)

MySQL.Async.fetchAll(‘SELECT * FROM billing WHERE identifier = @identifier’, {
[‘@identifier’] = xPlayer.identifier
}, function(result)
local bills = {}
for i=1, #result, 1 do
table.insert(bills, {
id = result[i].id,
identifier = result[i].identifier,
sender = result[i].sender,
targetType = result[i].target_type,
target = result[i].target,
label = result[i].label,
amount = result[i].amount
})
end

  cb(bills)

end)
end)

ESX.RegisterServerCallback(‘esx_billing:getTargetBills’, function(source, cb, target)
local xPlayer = ESX.GetPlayerFromId(target)

MySQL.Async.fetchAll(‘SELECT * FROM billing WHERE identifier = @identifier’, {
[‘@identifier’] = xPlayer.identifier
}, function(result)
local bills = {}
for i=1, #result, 1 do
table.insert(bills, {
id = result[i].id,
identifier = result[i].identifier,
sender = result[i].sender,
targetType = result[i].target_type,
target = result[i].target,
label = result[i].label,
amount = result[i].amount
})
end

  cb(bills)

end)
end)

ESX.RegisterServerCallback(‘esx_billing:payBill’, function(source, cb, id)
local xPlayer = ESX.GetPlayerFromId(source)

MySQL.Async.fetchAll(‘SELECT * FROM billing WHERE id = @id’, {
[‘@id’] = id
}, function(result)

  local sender     = result[1].sender
  local targetType = result[1].target_type
  local target     = result[1].target
  local amount     = result[1].amount

  local xTarget = ESX.GetPlayerFromIdentifier(sender)

  if targetType == 'player' then

  	if xTarget ~= nil then

  		if xPlayer.getMoney() >= amount then

  			MySQL.Async.execute('DELETE from billing WHERE id = @id', {
  				['@id'] = id
  			}, function(rowsChanged)
  				xPlayer.removeMoney(amount)
  				xTarget.addMoney(amount)

  				TriggerClientEvent('esx:showNotification', xPlayer.source, _U('paid_invoice', ESX.Math.GroupDigits(amount)))
  				TriggerClientEvent('esx:showNotification', xTarget.source, _U('received_payment', ESX.Math.GroupDigits(amount)))

  				cb()
  			end)

  		elseif xPlayer.getBank() >= amount then

  			MySQL.Async.execute('DELETE from billing WHERE id = @id', {
  				['@id'] = id
  			}, function(rowsChanged)
  				xPlayer.removeAccountMoney('bank', amount)
  				xTarget.addAccountMoney('bank', amount)

  				TriggerClientEvent('esx:showNotification', xPlayer.source, _U('paid_invoice', ESX.Math.GroupDigits(amount)))
  				TriggerClientEvent('esx:showNotification', xTarget.source, _U('received_payment', ESX.Math.GroupDigits(amount)))

  				cb()
  			end)

  		else
  			TriggerClientEvent('esx:showNotification', xTarget.source, _U('target_no_money'))
  			TriggerClientEvent('esx:showNotification', xPlayer.source, _U('no_money'))

  			cb()
  		end

  	else
  		TriggerClientEvent('esx:showNotification', xPlayer.source, _U('player_not_online'))
  		cb()
  	end

  else

  	TriggerEvent('esx_addonaccount:getSharedAccount', target, function(account)

  		if xPlayer.getMoney() >= amount then

  			MySQL.Async.execute('DELETE from billing WHERE id = @id', {
  				['@id'] = id
  			}, function(rowsChanged)
  				xPlayer.removeMoney(amount)
  				account.addMoney(amount)

  				TriggerClientEvent('esx:showNotification', xPlayer.source, _U('paid_invoice', ESX.Math.GroupDigits(amount)))
  				if xTarget ~= nil then
  					TriggerClientEvent('esx:showNotification', xTarget.source, _U('received_payment', ESX.Math.GroupDigits(amount)))
  				end

  				cb()
  			end)

  		elseif xPlayer.getBank() >= amount then

  			MySQL.Async.execute('DELETE from billing WHERE id = @id', {
  				['@id'] = id
  			}, function(rowsChanged)
  				xPlayer.removeAccountMoney('bank', amount)
  				account.addMoney(amount)

  				TriggerClientEvent('esx:showNotification', xPlayer.source, _U('paid_invoice', ESX.Math.GroupDigits(amount)))
  				if xTarget ~= nil then
  					TriggerClientEvent('esx:showNotification', xTarget.source, _U('received_payment', ESX.Math.GroupDigits(amount)))
  				end

  				cb()
  			end)

  		else
  			TriggerClientEvent('esx:showNotification', xPlayer.source, _U('no_money'))

  			if xTarget ~= nil then
  				TriggerClientEvent('esx:showNotification', xTarget.source, _U('target_no_money'))
  			end

  			cb()
  		end
  	end)

  end

end)
end)

If you can’t figure it out yourself I’ll send a fix here once I figure it out later today.

1 Like

I do not find how to do

Ever figure this out? Also wanting to make it so that when a player is fined, they are forces to pay it with no options.

any answer am also facing same

do you guys know, how i can make this work with a restaurant? i want to give a Bill to someone who orders something from me

any solution on this bro?