13 Commits

Author SHA1 Message Date
jimathy
3e036d6996 v2.1 - Add confirmation popups for payments 2022-03-11 00:30:49 +00:00
jimathy
a4a67da493 Move bank enabling varibles to Config.lua 2022-03-10 23:42:35 +00:00
jimathy
2dc29de368 Move bank enabling varibles to Config.lua 2022-03-10 23:41:49 +00:00
jimathy
8379179631 Update config.lua 2022-02-25 12:52:10 +00:00
jimathy
e3e8d71bea Fix for data being nil 2022-02-25 10:10:08 +00:00
jimathy
07c0195d26 Support for upcoming features 2022-02-23 20:35:50 +00:00
jimathy
0df97ac406 oops, gangmenu isn't bossmenu 2022-02-21 09:05:56 +00:00
jimathy
ad4f5dd203 Improve disabling certain bank features 2022-02-20 16:22:41 +00:00
jimathy
76ff8dcfec Remov /cashregister command, didn't work correctly 2022-02-20 15:32:42 +00:00
jimathy
61fc56d82d Add ability to disable receipts 2022-02-20 15:30:15 +00:00
jimathy
b4d185105d Pulling job names from wrong place
This caused errors while trying to access banks or ATMs if you had jobs in the config but not in your shared.

This was left in by mistake
2022-02-20 15:09:50 +00:00
jimathy
4e16ff4e04 Added banking images to readme 2022-02-19 12:18:23 +00:00
jimathy
7d059c27d0 Updated Readme 2022-02-19 11:57:01 +00:00
6 changed files with 138 additions and 104 deletions

View File

@@ -1,14 +1,16 @@
# jim-payments # jim-payments
QBCore based payment system QBCore based payment system
If you think I did a good job here, consider donating as it keeps by lights on and my cat fat:
https://ko-fi.com/jixelpatterns
--------------
If you use a different phone/invoice system let me know and I will add support for it as best I can! If you use a different phone/invoice system let me know and I will add support for it as best I can!
--------------
Enchanced QB-Input payment system from my other scripts now free on its own Enchanced QB-Input payment system from my other scripts now free on its own
![General](https://i.imgur.com/37d2mE3.jpeg) ![General](https://i.imgur.com/ICbQyeQ.jpeg) ![General](https://i.imgur.com/37d2mE3.jpeg) ![General](https://i.imgur.com/AIdXzxX.jpeg)
![General](https://i.imgur.com/RYADcI2.jpeg) ![General](https://i.imgur.com/ICbQyeQ.jpeg)
# Installation # Installation
To make use of this payment system you need trigger the event To make use of this payment system you need trigger the event
@@ -49,3 +51,13 @@ Go to [qb] > qb-phone > client > main.lua
-------------- --------------
NOTE: If you are converting from my older job scripts, I recommend removing the previous triggers from qb-phone NOTE: If you are converting from my older job scripts, I recommend removing the previous triggers from qb-phone
--------------
The latest banking systems are very simple to use and add,
simply look in the atms.lua and change the config options at the top
Choose wether to use atm's, choose wether to use banking locations
Choose wether to add bank blips (if you want to disable qb-banking)
Choose wether to add ATM blips (if you like $ signs)

View File

@@ -5,12 +5,6 @@ local QBCore = exports['qb-core']:GetCoreObject()
-- This requires QB-Target and has the location of every ATM, ATM prop and bank window -- This requires QB-Target and has the location of every ATM, ATM prop and bank window
-- If Config.useATM = false, then none of this load -- If Config.useATM = false, then none of this load
--Specific to ATM config options
Config.useATM = true
Config.useBanks = true
Config.BankBlips = true
Config.ATMBlips = false
Config.ATMModels = {"prop_atm_01", "prop_atm_02", "prop_atm_03", "prop_fleeca_atm" } Config.ATMModels = {"prop_atm_01", "prop_atm_02", "prop_atm_03", "prop_fleeca_atm" }
Config.ATMLocations = { Config.ATMLocations = {
@@ -107,19 +101,6 @@ local function cv(amount)
end end
local function createBlips() local function createBlips()
if Config.useATM then if Config.useATM then
if Config.BankBlips then
for k, v in pairs(Config.BankLocations) do
blip = AddBlipForCoord(v)
SetBlipSprite(blip, 108)
SetBlipDisplay(blip, 4)
SetBlipScale(blip, 0.55)
SetBlipColour(blip, 2)
SetBlipAsShortRange(blip, true)
BeginTextCommandSetBlipName("STRING")
AddTextComponentString("Bank")
EndTextCommandSetBlipName(blip)
end
end
if Config.ATMBlips then if Config.ATMBlips then
for k, v in pairs(Config.ATMLocations) do for k, v in pairs(Config.ATMLocations) do
blip = AddBlipForCoord(v) blip = AddBlipForCoord(v)
@@ -134,6 +115,21 @@ local function createBlips()
end end
end end
end end
if Config.useBanks then
if Config.BankBlips then
for k, v in pairs(Config.BankLocations) do
blip = AddBlipForCoord(v)
SetBlipSprite(blip, 108)
SetBlipDisplay(blip, 4)
SetBlipScale(blip, 0.55)
SetBlipColour(blip, 2)
SetBlipAsShortRange(blip, true)
BeginTextCommandSetBlipName("STRING")
AddTextComponentString("Bank")
EndTextCommandSetBlipName(blip)
end
end
end
end end
AddEventHandler('onResourceStart', function(resource) if GetCurrentResourceName() == resource then createBlips() end end) AddEventHandler('onResourceStart', function(resource) if GetCurrentResourceName() == resource then createBlips() end end)
@@ -141,8 +137,9 @@ AddEventHandler('onResourceStart', function(resource) if GetCurrentResourceName(
RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function() createBlips() end) RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function() createBlips() end)
Citizen.CreateThread(function() Citizen.CreateThread(function()
if Config.useATM or Config.useBanks then
local bossroles = {} local bossroles = {}
for k, v in pairs(Config.Jobs) do for k, v in pairs(QBCore.Shared.Jobs) do
for l, b in pairs(QBCore.Shared.Jobs[tostring(k)].grades) do for l, b in pairs(QBCore.Shared.Jobs[tostring(k)].grades) do
if QBCore.Shared.Jobs[tostring(k)].grades[l].isboss == true then if QBCore.Shared.Jobs[tostring(k)].grades[l].isboss == true then
if bossroles[tostring(k)] ~= nil then if bossroles[tostring(k)] ~= nil then
@@ -166,7 +163,7 @@ Citizen.CreateThread(function()
end end
end end
end end
end
if Config.useATM then if Config.useATM then
exports['qb-target']:AddTargetModel(Config.ATMModels, { options = { { event = "jim-payments:Client:ATM:use", icon = "fas fa-money-check-alt", label = "Use ATM", id = "atm" },}, distance = 1.5, }) exports['qb-target']:AddTargetModel(Config.ATMModels, { options = { { event = "jim-payments:Client:ATM:use", icon = "fas fa-money-check-alt", label = "Use ATM", id = "atm" },}, distance = 1.5, })
for k,v in pairs(Config.ATMLocations) do for k,v in pairs(Config.ATMLocations) do

View File

@@ -82,7 +82,7 @@ RegisterServerEvent('jim-payments:server:ATM:use', function(amount, billtype, ba
TriggerClientEvent("QBCore:Notify", src, "Deposited $"..cv(amount).." into the "..Player.PlayerData.job.label.." account", "success") TriggerClientEvent("QBCore:Notify", src, "Deposited $"..cv(amount).." into the "..Player.PlayerData.job.label.." account", "success")
end end
end end
-- Transfers between players -- -- Transfer from boss account to players --
elseif account == "societytransfer" then elseif account == "societytransfer" then
local bannedCharacters = {'%','$',';'} local bannedCharacters = {'%','$',';'}
local newAmount = tostring(amount) local newAmount = tostring(amount)
@@ -97,10 +97,10 @@ RegisterServerEvent('jim-payments:server:ATM:use', function(amount, billtype, ba
local Player = QBCore.Functions.GetPlayer(src) local Player = QBCore.Functions.GetPlayer(src)
if (society - amount) >= 0 then if (society - amount) >= 0 then
local query = '%"account":"' .. baccount .. '"%' local query = '%"account":"' .. baccount .. '"%'
local result = exports.oxmysql:executeSync('SELECT * FROM players WHERE charinfo LIKE ?', {query}) local result = MySQL.Sync.fetchAll('SELECT * FROM players WHERE charinfo LIKE ?', {query})
if result[1] ~= nil then if result[1] ~= nil then
local Reciever = QBCore.Functions.GetPlayerByCitizenId(result[1].citizenid) local Reciever = QBCore.Functions.GetPlayerByCitizenId(result[1].citizenid)
TriggerEvent("qb-gangmenu:server:removeAccountMoney", tostring(Player.PlayerData.gang.name), amount) TriggerEvent("qb-bossmenu:server:removeAccountMoney", tostring(Player.PlayerData.job.name), amount)
if Reciever ~= nil then if Reciever ~= nil then
Reciever.Functions.AddMoney('bank', amount) Reciever.Functions.AddMoney('bank', amount)
TriggerClientEvent("QBCore:Notify", src, "Sent $"..amount.." to "..Reciever.PlayerData.charinfo.firstname.." "..Reciever.PlayerData.charinfo.lastname, "success") TriggerClientEvent("QBCore:Notify", src, "Sent $"..amount.." to "..Reciever.PlayerData.charinfo.firstname.." "..Reciever.PlayerData.charinfo.lastname, "success")
@@ -108,14 +108,13 @@ RegisterServerEvent('jim-payments:server:ATM:use', function(amount, billtype, ba
else else
local RecieverMoney = json.decode(result[1].money) local RecieverMoney = json.decode(result[1].money)
RecieverMoney.bank = (RecieverMoney.bank + amount) RecieverMoney.bank = (RecieverMoney.bank + amount)
exports.oxmysql:execute('UPDATE players SET money = ? WHERE citizenid = ?', {json.encode(RecieverMoney), result[1].citizenid}) MySQL.Async.execute('UPDATE players SET money = ? WHERE citizenid = ?', {json.encode(RecieverMoney), result[1].citizenid})
end end
elseif result[1] == nil then TriggerClientEvent("QBCore:Notify", src, "Error: Account '"..baccount.."' not found", "error") elseif result[1] == nil then TriggerClientEvent("QBCore:Notify", src, "Error: Account '"..baccount.."' not found", "error")
end end
end end
--Simple transfers from society account to bank -- --Simple transfers from gang society account to bank --
elseif account == "gang" then elseif account == "gang" then
if billtype == "withdraw" then if billtype == "withdraw" then
if tonumber(gsociety) < amount then TriggerClientEvent("QBCore:Notify", src, "Society balance too low", "error") if tonumber(gsociety) < amount then TriggerClientEvent("QBCore:Notify", src, "Society balance too low", "error")
@@ -132,7 +131,7 @@ RegisterServerEvent('jim-payments:server:ATM:use', function(amount, billtype, ba
TriggerClientEvent("QBCore:Notify", src, "Deposited $"..cv(amount).." into the "..Player.PlayerData.gang.label.." account", "success") TriggerClientEvent("QBCore:Notify", src, "Deposited $"..cv(amount).." into the "..Player.PlayerData.gang.label.." account", "success")
end end
end end
-- Transfers between players -- -- Transfer from gang account to players --
elseif account == "gangtransfer" then elseif account == "gangtransfer" then
local bannedCharacters = {'%','$',';'} local bannedCharacters = {'%','$',';'}
local newAmount = tostring(amount) local newAmount = tostring(amount)
@@ -147,7 +146,7 @@ RegisterServerEvent('jim-payments:server:ATM:use', function(amount, billtype, ba
local Player = QBCore.Functions.GetPlayer(src) local Player = QBCore.Functions.GetPlayer(src)
if (gsociety - amount) >= 0 then if (gsociety - amount) >= 0 then
local query = '%"account":"' .. baccount .. '"%' local query = '%"account":"' .. baccount .. '"%'
local result = exports.oxmysql:executeSync('SELECT * FROM players WHERE charinfo LIKE ?', {query}) local result = MySQL.Sync.fetchAll('SELECT * FROM players WHERE charinfo LIKE ?', {query})
if result[1] ~= nil then if result[1] ~= nil then
local Reciever = QBCore.Functions.GetPlayerByCitizenId(result[1].citizenid) local Reciever = QBCore.Functions.GetPlayerByCitizenId(result[1].citizenid)
TriggerEvent("qb-bossmenu:server:removeAccountMoney", tostring(Player.PlayerData.gang.name), amount) TriggerEvent("qb-bossmenu:server:removeAccountMoney", tostring(Player.PlayerData.gang.name), amount)
@@ -158,7 +157,7 @@ RegisterServerEvent('jim-payments:server:ATM:use', function(amount, billtype, ba
else else
local RecieverMoney = json.decode(result[1].money) local RecieverMoney = json.decode(result[1].money)
RecieverMoney.bank = (RecieverMoney.bank + amount) RecieverMoney.bank = (RecieverMoney.bank + amount)
exports.oxmysql:execute('UPDATE players SET money = ? WHERE citizenid = ?', {json.encode(RecieverMoney), result[1].citizenid}) MySQL.Async.execute('UPDATE players SET money = ? WHERE citizenid = ?', {json.encode(RecieverMoney), result[1].citizenid})
end end
elseif result[1] == nil then TriggerClientEvent("QBCore:Notify", src, "Error: Account '"..baccount.."' not found", "error") elseif result[1] == nil then TriggerClientEvent("QBCore:Notify", src, "Error: Account '"..baccount.."' not found", "error")
@@ -180,7 +179,7 @@ RegisterServerEvent('jim-payments:server:ATM:use', function(amount, billtype, ba
local Player = QBCore.Functions.GetPlayer(src) local Player = QBCore.Functions.GetPlayer(src)
if (Player.PlayerData.money.bank - amount) >= 0 then if (Player.PlayerData.money.bank - amount) >= 0 then
local query = '%"account":"' .. baccount .. '"%' local query = '%"account":"' .. baccount .. '"%'
local result = exports.oxmysql:executeSync('SELECT * FROM players WHERE charinfo LIKE ?', {query}) local result = MySQL.Sync.fetchAll('SELECT * FROM players WHERE charinfo LIKE ?', {query})
if result[1] ~= nil then if result[1] ~= nil then
local Reciever = QBCore.Functions.GetPlayerByCitizenId(result[1].citizenid) local Reciever = QBCore.Functions.GetPlayerByCitizenId(result[1].citizenid)
Player.Functions.RemoveMoney('bank', amount) Player.Functions.RemoveMoney('bank', amount)
@@ -191,7 +190,7 @@ RegisterServerEvent('jim-payments:server:ATM:use', function(amount, billtype, ba
else else
local RecieverMoney = json.decode(result[1].money) local RecieverMoney = json.decode(result[1].money)
RecieverMoney.bank = (RecieverMoney.bank + amount) RecieverMoney.bank = (RecieverMoney.bank + amount)
exports.oxmysql:execute('UPDATE players SET money = ? WHERE citizenid = ?', {json.encode(RecieverMoney), result[1].citizenid}) MySQL.Async.execute('UPDATE players SET money = ? WHERE citizenid = ?', {json.encode(RecieverMoney), result[1].citizenid})
end end
elseif result[1] == nil then TriggerClientEvent("QBCore:Notify", src, "Error: Account '"..baccount.."' not found", "error") elseif result[1] == nil then TriggerClientEvent("QBCore:Notify", src, "Error: Account '"..baccount.."' not found", "error")

View File

@@ -3,33 +3,13 @@ local QBCore = exports['qb-core']:GetCoreObject()
PlayerJob = {} PlayerJob = {}
local onDuty = false local onDuty = false
RegisterNetEvent('QBCore:Client:OnPlayerLoaded') RegisterNetEvent('QBCore:Client:OnPlayerLoaded') AddEventHandler('QBCore:Client:OnPlayerLoaded', function() QBCore.Functions.GetPlayerData(function(PlayerData) PlayerJob = PlayerData.job PlayerGang = PlayerData.gang end) end)
AddEventHandler('QBCore:Client:OnPlayerLoaded', function() RegisterNetEvent('QBCore:Client:OnJobUpdate') AddEventHandler('QBCore:Client:OnJobUpdate', function(JobInfo) PlayerJob = JobInfo onDuty = PlayerJob.onduty end)
QBCore.Functions.GetPlayerData(function(PlayerData) RegisterNetEvent('QBCore:Client:SetDuty') AddEventHandler('QBCore:Client:SetDuty', function(duty) onDuty = duty end)
PlayerJob = PlayerData.job RegisterNetEvent('QBCore:Client:OnGangUpdate') AddEventHandler('QBCore:Client:OnGangUpdate', function(GangInfo) PlayerGang = GangInfo end)
PlayerGang = PlayerData.gang
end)
end)
RegisterNetEvent('QBCore:Client:OnJobUpdate')
AddEventHandler('QBCore:Client:OnJobUpdate', function(JobInfo)
PlayerJob = JobInfo
onDuty = PlayerJob.onduty
end)
RegisterNetEvent('QBCore:Client:SetDuty')
AddEventHandler('QBCore:Client:SetDuty', function(duty)
onDuty = duty
end)
RegisterNetEvent('QBCore:Client:OnGangUpdate')
AddEventHandler('QBCore:Client:OnGangUpdate', function(GangInfo)
PlayerGang = GangInfo
end)
--Keeps track of duty on script restarts --Keeps track of duty on script restarts
AddEventHandler('onResourceStart', function(resource) AddEventHandler('onResourceStart', function(resource) if GetCurrentResourceName() == resource then QBCore.Functions.GetPlayerData(function(PlayerData) PlayerJob = PlayerData.job PlayerGang = PlayerData.gang onDuty = PlayerJob.onduty end) end end)
if GetCurrentResourceName() == resource then QBCore.Functions.GetPlayerData(function(PlayerData) PlayerJob = PlayerData.job PlayerGang = PlayerData.gang onDuty = PlayerJob.onduty end) end end)
Citizen.CreateThread(function() Citizen.CreateThread(function()
local jobroles = {} local jobroles = {}
@@ -38,7 +18,7 @@ Citizen.CreateThread(function()
{ options = { { event = "jim-payments:Tickets:Menu", icon = "fas fa-receipt", label = "Cash in Receipts", job = jobroles } }, distance = 2.0 }) { options = { { event = "jim-payments:Tickets:Menu", icon = "fas fa-receipt", label = "Cash in Receipts", job = jobroles } }, distance = 2.0 })
end) end)
RegisterNetEvent('jim-payments:client:Charge', function() RegisterNetEvent('jim-payments:client:Charge', function(data)
if not onDuty then TriggerEvent("QBCore:Notify", "Not Clocked in!", "error") return end -- Require to be on duty when making a payment if not onDuty then TriggerEvent("QBCore:Notify", "Not Clocked in!", "error") return end -- Require to be on duty when making a payment
local onlineList = {} local onlineList = {}
local nearbyList = {} local nearbyList = {}
@@ -48,17 +28,15 @@ RegisterNetEvent('jim-payments:client:Charge', function()
for i = 1, #onlineList do for i = 1, #onlineList do
if onlineList[i].value == GetPlayerServerId(v) then if onlineList[i].value == GetPlayerServerId(v) then
if v ~= PlayerId() then if v ~= PlayerId() then
nearbyList[#nearbyList+1] = onlineList[i] nearbyList[#nearbyList+1] = { value = onlineList[i].value, text = onlineList[i].text..' ('..math.floor(dist+0.05)..'m)' }
nearbyList[#nearbyList].text = nearbyList[#nearbyList].text..' ('..math.floor(dist+0.05)..'m)'
end end
end end
end end
dist = nil dist = nil
end end
if data.img == nil then img = "" else img = data.img end
if nearbyList[#nearbyList] == nil then TriggerEvent("QBCore:Notify", "No one near by to charge", "error") return end if nearbyList[#nearbyList] == nil then TriggerEvent("QBCore:Notify", "No one near by to charge", "error") return end
local dialog = exports['qb-input']:ShowInput({ header = PlayerJob.label.." Cash Register", submitText = "Send", local dialog = exports['qb-input']:ShowInput({ header = img..PlayerJob.label.." Cash Register", submitText = "Send",
inputs = { inputs = {
{ text = " ", name = "citizen", type = "select", options = nearbyList }, { text = " ", name = "citizen", type = "select", options = nearbyList },
{ type = 'radio', name = 'billtype', text = 'Payment Type', options = { { value = "cash", text = "Cash" }, { value = "card", text = "Card" } } }, { type = 'radio', name = 'billtype', text = 'Payment Type', options = { { value = "cash", text = "Cash" }, { value = "card", text = "Card" } } },
@@ -78,11 +56,19 @@ RegisterNetEvent('jim-payments:Tickets:Menu', function()
else exports['qb-menu']:openMenu({ else exports['qb-menu']:openMenu({
{ isMenuHeader = true, header = "🧾 "..PlayerJob.label.." Receipts 🧾", txt = "Do you want trade your receipts for payment?" }, { isMenuHeader = true, header = "🧾 "..PlayerJob.label.." Receipts 🧾", txt = "Do you want trade your receipts for payment?" },
{ isMenuHeader = true, header = "", txt = "Amount of Tickets: "..amount.."<br>Total Payment: $"..(Config.Jobs[PlayerJob.name].PayPerTicket * amount) }, { isMenuHeader = true, header = "", txt = "Amount of Tickets: "..amount.."<br>Total Payment: $"..(Config.Jobs[PlayerJob.name].PayPerTicket * amount) },
{ header = "Yes", txt = "", params = { event = "jim-payments:Tickets:Sell:yes" } }, { header = "Yes", txt = "", params = { event = "jim-payments:Tickets:Sell:yes" } },
{ header = "No", txt = "", params = { event = "jim-payments:Tickets:Sell:no" } }, }) { header = "No", txt = "", params = { event = "jim-payments:Tickets:Sell:no" } }, })
end end
end end
end) end)
RegisterNetEvent("jim-payments:client:PayPopup", function(amount, biller, billtype)
exports['qb-menu']:openMenu({
{ isMenuHeader = true, header = "🧾 "..PlayerJob.label.." Payment 🧾", txt = "Do you want accept the payment?" },
{ isMenuHeader = true, header = "", txt = billtype:gsub("^%l", string.upper).." Payment: $"..amount },
{ header = "✅ Yes", txt = "", params = { isServer = true, event = "jim-payments:server:PayPopup", args = { accept = true, amount = amount, biller = biller, billtype = billtype } } },
{ header = "❌ No", txt = "", params = { isServer = true, event = "jim-payments:server:PayPopup", args = { accept = false, amount = amount, biller = biller, billtype = billtype } } }, })
end)
RegisterNetEvent('jim-payments:Tickets:Sell:yes', function() TriggerServerEvent('jim-payments:Tickets:Sell') end) RegisterNetEvent('jim-payments:Tickets:Sell:yes', function() TriggerServerEvent('jim-payments:Tickets:Sell') end)
RegisterNetEvent('jim-payments:Tickets:Sell:no', function() exports['qb-menu']:closeMenu() end) RegisterNetEvent('jim-payments:Tickets:Sell:no', function() exports['qb-menu']:closeMenu() end)

View File

@@ -1,4 +1,4 @@
print("Jim-Payments v2 - Payments Script by Jimathy") print("Jim-Payments v2.1 - Payments Script by Jimathy")
-- If you need support I now have a discord available, it helps me keep track of issues and give better support. -- If you need support I now have a discord available, it helps me keep track of issues and give better support.
@@ -6,16 +6,28 @@ print("Jim-Payments v2 - Payments Script by Jimathy")
Config = {} Config = {}
Config.PaymentRadius = 30 -- This is how far the player list will check Config.TicketSystem = true -- Enable this if you want to use the ticket system
Config.PaymentRadius = 30 -- This is how far the playerlist will check for nearby players (based on the person charging)
Config.useATM = true -- Enable this to use my ATM's
Config.useBanks = true -- Enable this to use my banking stuff
Config.BankBlips = true -- Enable this if you disabled qb-banking and need bank locations
Config.ATMBlips = false -- Enable this if you are a pyscho and need every ATM to be on the map too
Config.PhoneBank = true -- Set this to false to use the popup payment system FOR CARD/BANK PAYMENTS instead of using phone invoices
-- This doesn't affect Cash payments as they by default use confirmation now
-- This is helpful for phones that don't support invoices well
-- MinAmountforTicket should be your cheapest item -- MinAmountforTicket should be your cheapest item
-- PayPerTicket should never be higher than MinAmountforTicket -- PayPerTicket should never be higher than MinAmountforTicket
Config.Jobs = { Config.Jobs = {
['popsdiner'] = { MinAmountforTicket = 50, PayPerTicket = 50 }, ['beanmachine'] = { MinAmountforTicket = 50, PayPerTicket = 50 },
['henhouse'] = { MinAmountforTicket = 50, PayPerTicket = 50 },
['pizzathis'] = { MinAmountforTicket = 50, PayPerTicket = 50 },
['burgershot'] = { MinAmountforTicket = 50, PayPerTicket = 50 }, ['burgershot'] = { MinAmountforTicket = 50, PayPerTicket = 50 },
['catcafe'] = { MinAmountforTicket = 50, PayPerTicket = 50 }, ['catcafe'] = { MinAmountforTicket = 50, PayPerTicket = 50 },
['henhouse'] = { MinAmountforTicket = 50, PayPerTicket = 50 },
['pizzathis'] = { MinAmountforTicket = 50, PayPerTicket = 50 },
['popsdiner'] = { MinAmountforTicket = 50, PayPerTicket = 50 },
['tequilala'] = { MinAmountforTicket = 50, PayPerTicket = 50 }, ['tequilala'] = { MinAmountforTicket = 50, PayPerTicket = 50 },
['vanilla'] = { MinAmountforTicket = 50, PayPerTicket = 50 }, ['vanilla'] = { MinAmountforTicket = 50, PayPerTicket = 50 },
['mechanic'] = { MinAmountforTicket = 1000, PayPerTicket = 500 }, ['mechanic'] = { MinAmountforTicket = 1000, PayPerTicket = 500 },

View File

@@ -1,7 +1,20 @@
local QBCore = exports['qb-core']:GetCoreObject() local QBCore = exports['qb-core']:GetCoreObject()
RegisterServerEvent('jim-payments:Tickets:Give') local function cv(amount)
AddEventHandler('jim-payments:Tickets:Give', function(amount, job) local formatted = amount
while true do
formatted, k = string.gsub(formatted, "^(-?%d+)(%d%d%d)", '%1,%2')
if (k==0) then
break
end
end
return formatted
end
--QBCore.Commands.Add("cashregister", "Use mobile cash register", {}, false, function(source) TriggerClientEvent("jim-payments:client:Charge", source, true) end)
RegisterServerEvent('jim-payments:Tickets:Give', function(amount, job)
if Config.TicketSystem then
for k, v in pairs(QBCore.Functions.GetPlayers()) do for k, v in pairs(QBCore.Functions.GetPlayers()) do
local Player = QBCore.Functions.GetPlayer(v) local Player = QBCore.Functions.GetPlayer(v)
if Player ~= nil then if Player ~= nil then
@@ -16,6 +29,7 @@ AddEventHandler('jim-payments:Tickets:Give', function(amount, job)
end end
end end
end end
end
end) end)
RegisterServerEvent('jim-payments:Tickets:Sell', function() RegisterServerEvent('jim-payments:Tickets:Sell', function()
@@ -27,7 +41,7 @@ RegisterServerEvent('jim-payments:Tickets:Sell', function()
pay = (tickets * Config.Jobs[Player.PlayerData.job.name].PayPerTicket) pay = (tickets * Config.Jobs[Player.PlayerData.job.name].PayPerTicket)
Player.Functions.AddMoney('bank', pay, 'ticket-payment') Player.Functions.AddMoney('bank', pay, 'ticket-payment')
TriggerClientEvent('inventory:client:ItemBox', source, QBCore.Shared.Items['payticket'], "remove", tickets) TriggerClientEvent('inventory:client:ItemBox', source, QBCore.Shared.Items['payticket'], "remove", tickets)
TriggerClientEvent('QBCore:Notify', source, "Tickets traded: "..tickets.." Total: $"..pay, 'success') TriggerClientEvent('QBCore:Notify', source, "Tickets traded: "..tickets.." Total: $"..cv(pay), 'success')
end end
end) end)
@@ -38,32 +52,46 @@ QBCore.Functions.CreateCallback('jim-payments:Ticket:Count', function(source, cb
end) end)
RegisterServerEvent("jim-payments:server:Charge", function(citizen, price, billtype) RegisterServerEvent("jim-payments:server:Charge", function(citizen, price, billtype)
local biller = QBCore.Functions.GetPlayer(source) local src = source
local biller = QBCore.Functions.GetPlayer(src)
local billed = QBCore.Functions.GetPlayer(tonumber(citizen)) local billed = QBCore.Functions.GetPlayer(tonumber(citizen))
local amount = tonumber(price) local amount = tonumber(price)
local billtype = string.lower(tostring(billtype))
if amount and amount > 0 then if amount and amount > 0 then
if billtype == "cash" then balance = billed.Functions.GetMoney(billtype) if billtype == "cash" then balance = billed.Functions.GetMoney(billtype)
if balance >= amount then if balance >= amount then
billed.Functions.RemoveMoney('cash', amount) TriggerEvent("qb-bossmenu:server:addAccountMoney", tostring(biller.PlayerData.job.name), amount) TriggerClientEvent("jim-payments:client:PayPopup", billed.PlayerData.source, amount, src, billtype)
TriggerEvent('jim-payments:Tickets:Give', amount, tostring(biller.PlayerData.job.name))
elseif balance < amount then elseif balance < amount then
TriggerClientEvent("QBCore:Notify", source, "Customer doesn't have enough cash to pay", "error") TriggerClientEvent("QBCore:Notify", src, "Customer doesn't have enough cash to pay", "error")
TriggerClientEvent("QBCore:Notify", tonumber(citizen), "You don't have enough cash to pay", "error") TriggerClientEvent("QBCore:Notify", tonumber(citizen), "You don't have enough cash to pay", "error")
end end
elseif billtype == "card" then elseif billtype == "card" then
if Config.PhoneBank == false then
TriggerClientEvent("jim-payments:client:PayPopup", billed.PlayerData.source, amount, src, billtype)
else
MySQL.Async.insert( MySQL.Async.insert(
'INSERT INTO phone_invoices (citizenid, amount, society, sender, sendercitizenid) VALUES (?, ?, ?, ?, ?)', 'INSERT INTO phone_invoices (citizenid, amount, society, sender, sendercitizenid) VALUES (?, ?, ?, ?, ?)',
{billed.PlayerData.citizenid, amount, biller.PlayerData.job.name, {billed.PlayerData.citizenid, amount, biller.PlayerData.job.name, biller.PlayerData.charinfo.firstname, biller.PlayerData.citizenid})
biller.PlayerData.charinfo.firstname, biller.PlayerData.citizenid})
TriggerClientEvent('qb-phone:RefreshPhone', billed.PlayerData.source) TriggerClientEvent('qb-phone:RefreshPhone', billed.PlayerData.source)
TriggerClientEvent('QBCore:Notify', source, 'Invoice Successfully Sent', 'success') TriggerClientEvent('QBCore:Notify', src, 'Invoice Successfully Sent', 'success')
TriggerClientEvent('QBCore:Notify', billed.PlayerData.source, 'New Invoice Received') TriggerClientEvent('QBCore:Notify', billed.PlayerData.source, 'New Invoice Received')
end end
end
else TriggerClientEvent('QBCore:Notify', source, "You can't charge $0", 'error') return end else TriggerClientEvent('QBCore:Notify', source, "You can't charge $0", 'error') return end
end) end)
RegisterServerEvent("jim-payments:server:PayPopup", function(data)
local src = source
local billed = QBCore.Functions.GetPlayer(src)
local biller = QBCore.Functions.GetPlayer(tonumber(data.biller))
if data.accept == true then
billed.Functions.RemoveMoney(tostring(data.billtype), data.amount) TriggerEvent("qb-bossmenu:server:addAccountMoney", tostring(biller.PlayerData.job.name), data.amount)
TriggerEvent('jim-payments:Tickets:Give', data.amount, tostring(billed.PlayerData.job.name))
elseif data.accept == false then
TriggerClientEvent("QBCore:Notify", src, "You declined the payment")
TriggerClientEvent("QBCore:Notify", data.biller, billed.PlayerData.charinfo.firstname.." declined the payment", "error")
end
end)
QBCore.Functions.CreateCallback('jim-payments:MakePlayerList', function(source, cb) QBCore.Functions.CreateCallback('jim-payments:MakePlayerList', function(source, cb)
local onlineList = {} local onlineList = {}
for k, v in pairs(QBCore.Functions.GetPlayers()) do for k, v in pairs(QBCore.Functions.GetPlayers()) do