-- BEST SCRIPTS/ MLOS/ CARS IN DISCORD.GG/DEMONDEV!!! -- BEST SCRIPTS/ MLOS/ CARS IN DISCORD.GG/DEMONDEV!!! -- BEST SCRIPTS/ MLOS/ CARS IN DISCORD.GG/DEMONDEV!!! bot_Token = "" bot_logo = "https://cdn.discordapp.com/attachments/1025789416456867961/1106324039808594011/512x512_Logo.png" bot_name = "Codem Store" local discord_webhook = { ['bill'] = "https://discord.com/api/webhooks/1492737603840245962/R-c5tZhs5ayIQngxJP2gPrQPxZJxUJHlFzIj9wuCesApWft57KdPc1pIgT3CdDzRnyDX", ['cancelled'] = "https://discord.com/api/webhooks/1492737603840245962/R-c5tZhs5ayIQngxJP2gPrQPxZJxUJHlFzIj9wuCesApWft57KdPc1pIgT3CdDzRnyDX", ['paybill'] = "https://discord.com/api/webhooks/1492737603840245962/R-c5tZhs5ayIQngxJP2gPrQPxZJxUJHlFzIj9wuCesApWft57KdPc1pIgT3CdDzRnyDX" } function discordLogBilling(src, data, discordWebhook, desc) local xPlayer = GetPlayerFromIdentifier(data.targetIdentifier) or 'undefined' local xSource = GetSource(xPlayer) or 'undefined' local message = { username = bot_name, embeds = { { title = botname, color = 0xFFA500, author = { name = desc, }, fields = { { name = "Invoiced Player Name", value = data.name or false, inline = true }, { name = "Invoiced Player ID", value = src or false, inline = true }, { name = "Invoiced Player JOB", value = data.societyname or 'undefined', inline = true }, { name = "──────────────────────────────────────────────────", value = "", inline = false }, { name = "Player Name", value = data.targetname or false, inline = true }, { name = "Player ID", value = xSource or 'undefined', inline = true }, { name = "Amount", value = data.amount or 'undefined', inline = true }, { name = "Reason", value = data.invoicelabel or 'undefined', inline = true }, { name = "Unique Id", value = data.uniqueid or 'undefined', inline = true }, }, footer = { text = "Codem Store - https://", icon_url = "https://cdn.discordapp.com/attachments/1025789416456867961/1106324039808594011/512x512_Logo.png" }, timestamp = os.date("!%Y-%m-%dT%H:%M:%SZ") } }, avatar_url = bot_logo } PerformHttpRequest(discord_webhook[discordWebhook], function(err, text, headers) end, "POST", json.encode(message), { ["Content-Type"] = "application/json" }) end local cooldowns = {} Citizen.CreateThread(function() while Core == nil do Citizen.Wait(0) end Citizen.Wait(500) RegisterCallback('codem-billing:getMyBilling', function(source, cb) local src = source local identifier = GetIdentifier(src) local billingData = allBillingData[identifier] if billingData then cb(billingData) else cb(false) end end) RegisterCallback('codem-billing:getPlayerName', function(source, cb, targetSrc) local src = source local Player = GetPlayer(targetSrc) if Player then cb(GetName(tonumber(targetSrc))) else cb(false) end end) RegisterCallback('codem-billing:findBillingPlayer', function(source, cb, plyid) local src = source local myPed = GetPlayerPed(source) local myCoords = GetEntityCoords(myPed) if tonumber(plyid) == tonumber(src) then cb(false) return Config.Notification(Config.NotificationText['notbillyour'].text, Config.NotificationText['notbillyour'].type, true, src) end local data = {} for _, v in pairs(GetPlayers()) do if tonumber(v) == tonumber(plyid) then local targetPed = GetPlayerPed(v) local targetCoords = GetEntityCoords(targetPed) local dist = #(myCoords - targetCoords) if dist < 8.0 then local name = GetName(tonumber(v)) data = { name = name, id = v, } end end end if data then cb(data) else Config.Notification(Config.NotificationText['notfindplayer'].text, Config.NotificationText['notfindplayer'].type, true, src) cb(false) end end) RegisterCallback('codem-billing:GetNearbyPlayers', function(source, cb) local src = source local players = {} local myPed = GetPlayerPed(source) local myCoords = GetEntityCoords(myPed) for _, v in pairs(GetPlayers()) do if tonumber(v) ~= tonumber(src) then local targetPed = GetPlayerPed(v) local targetCoords = GetEntityCoords(targetPed) local dist = #(myCoords - targetCoords) if dist < 8.0 then local name = GetName(tonumber(v)) local avatar = GetDiscordAvatar(tonumber(v)) or Config.ExampleProfilePicture table.insert(players, { name = name, id = v, avatar = avatar }) end end end cb(players) end) RegisterCallback('codem-billing:cancelBilling', function(source, cb, id) local src = source local identifier = GetIdentifier(src) local isAdmin = false if Config.Admin[GetIdentifier(src)] then isAdmin = true end if not isAdmin then cb(false) return Config.Notification(Config.NotificationText['notacces'].text, Config.NotificationText['notacces'] .type, true, src) end for identifier, invoices in pairs(allBillingData) do for _, invoice in pairs(invoices) do if tonumber(invoice.uniqueid) == tonumber(id) then ExecuteSql("UPDATE `codem_billing` SET `status` = 'canceled' WHERE uniqueid = '" .. tonumber(invoice.uniqueid) .. "'") invoice.status = 'canceled' Citizen.Wait(100) discordLogBilling(src, invoice, 'cancelled', Config.Locales['CANCELBILLING']) cb(allBillingData) return end end end end) RegisterCallback('codem-billing:cancelmybilling', function(source, cb, id) local src = source local identifier = GetIdentifier(src) local isAdmin = false for identifier, invoices in pairs(allBillingData) do for _, invoice in pairs(invoices) do if tonumber(invoice.uniqueid) == tonumber(id) then ExecuteSql("UPDATE `codem_billing` SET `status` = 'canceled' WHERE uniqueid = '" .. tonumber(invoice.uniqueid) .. "'") invoice.status = 'canceled' Citizen.Wait(100) discordLogBilling(src, invoice, 'cancelled', Config.Locales['CANCELBILLING']) cb(allBillingData[identifier]) return end end end end) RegisterCallback('codem-billing:checkInvoice', function(source, cb, uniqueid) local src = source for identifier, invoices in pairs(allBillingData) do for _, invoice in pairs(invoices) do if tonumber(invoice.uniqueid) == tonumber(uniqueid) then if invoice.status == 'unpaid' then cb(invoice) return elseif invoice.status == 'canceled' then cb(false) return Config.Notification(Config.NotificationText['cancelledbill'].text, Config.NotificationText['cancelledbill'].type, true, src) else cb(false) return Config.Notification(Config.NotificationText['paidbill'].text, Config.NotificationText['paidbill'].type, true, src) end end end end Config.Notification(Config.NotificationText['wrongbillid'].text, Config.NotificationText['wrongbillid'].type, true, src) cb(false) end) RegisterCallback('codem-billing:cancelBillingJob', function(source, cb, id) local src = source for identifier, invoices in pairs(allBillingData) do for _, invoice in pairs(invoices) do if tonumber(invoice.uniqueid) == tonumber(id) then if invoice.identifier == GetIdentifier(src) then ExecuteSql("UPDATE `codem_billing` SET `status` = 'canceled' WHERE uniqueid = '" .. tonumber(invoice.uniqueid) .. "'") invoice.status = 'canceled' Citizen.Wait(100) discordLogBilling(src, invoice, 'cancelled', Config.Locales['CANCELBILLING']) else cb(false) return Config.Notification(Config.NotificationText['notowner'].text, Config.NotificationText['notowner'].type, true, src) end end end end cb(allBillingData) return end) RegisterCallback('codem-billing:getAllBill', function(source, cb) local newData = {} for identifier, invoices in pairs(allBillingData) do for _, invoice in pairs(invoices) do table.insert(newData, invoice) end end if #newData > 0 then cb(newData) else cb(false) end end) RegisterCallback('codem-billing:getPlayerMoney', function(source, cb) local src = source local playerMoney = getPlayerMoney(src) cb(playerMoney) end) RegisterCallback('codem-billing:getPlayerAccount', function(source, cb) local src = source local isAdmin = false if Config.Admin[GetIdentifier(src)] then isAdmin = true end local data = { money = getPlayerMoney(src), avatar = GetDiscordAvatar(src) or Config.ExampleProfilePicture, name = GetName(src), isAdmin = isAdmin } cb(data) end) RegisterCallback('codem-billing:getSocietyBills', function(source, cb, society) local newData = {} for identifier, invoices in pairs(allBillingData) do for _, invoice in pairs(invoices) do if invoice.societyname == society then table.insert(newData, invoice) end end end if #newData > 0 then cb(newData) else cb(false) end end) RegisterCallback('codem-billing:getmyAllBillingData', function(source, cb) local src = source local xidentifier = GetIdentifier(tonumber(src)) local newData = {} for identifier, invoices in pairs(allBillingData) do for _, invoice in pairs(invoices) do if invoice.identifier == xidentifier then if invoice.societyname == 'identifier' then table.insert(newData, invoice) end end end end cb(newData) end) RegisterCallback('codem-billing:searchBillName', function(source, cb, name) if name then local src = source if cooldowns[source] and (os.time() - cooldowns[source] < 5) then Config.Notification(Config.NotificationText['beforewait'].text, Config.NotificationText['beforewait'].type, true, src) return end cooldowns[source] = os.time() local newData = {} for identifier, invoices in pairs(allBillingData) do for _, invoice in pairs(invoices) do if string.match(invoice.targetname, name) then table.insert(newData, invoice) end end end if next(newData) then cb(newData) else Config.Notification(Config.NotificationText['noypaybill'].text, Config.NotificationText['noypaybill'].type, true, src) cb(false) end end end) RegisterCallback('codem-billing:searchBill', function(source, cb, id) local src = source if cooldowns[source] and (os.time() - cooldowns[source] < 5) then Config.Notification(Config.NotificationText['beforewait'].text, Config.NotificationText['beforewait'].type, true, src) return end cooldowns[source] = os.time() local xPlayer = GetPlayer(tonumber(id)) if xPlayer then local xidentifier = GetIdentifier(tonumber(id)) local newData = {} for identifier, invoices in pairs(allBillingData) do for _, invoice in pairs(invoices) do if invoice.targetIdentifier == xidentifier then table.insert(newData, invoice) end end end if next(newData) then cb(newData) else Config.Notification(Config.NotificationText['noypaybill'].text, Config.NotificationText['noypaybill'].type, true, src) cb(false) end else Config.Notification(Config.NotificationText['notfindplayer'].text, Config.NotificationText['notfindplayer'].type, true, src) cb(false) end end) RegisterCallback('codem-billing:payAllBills', function(source, cb) if cooldowns[source] and (os.time() - cooldowns[source] < 5) then Config.Notification(Config.NotificationText['beforewait'].text, Config.NotificationText['beforewait'].type, true, src) return end cooldowns[source] = os.time() local src = source local xPlayer = GetPlayer(src) if not xPlayer then return end local playerMoney = getPlayerMoney(src) local playerIdentifier = GetIdentifier(src) local bills = allBillingData[playerIdentifier] local totalAmount = 0 for _, billData in pairs(bills) do totalAmount = totalAmount + tonumber(billData.amount) end local kdv = totalAmount * Config.Tax local totalAmountWithKdv = math.floor(totalAmount + tonumber(kdv)) if tonumber(playerMoney) < tonumber(totalAmountWithKdv) then cb(false) return Config.Notification(Config.NotificationText['notmoney'].text, Config.NotificationText['notmoney'].type, true, src) end if Config.Framework == 'esx' or Config.Framework == 'oldesx' then for k, v in pairs(bills) do if v.status == 'unpaid' then if v.societyname == 'identifier' then local xPlayer = GetPlayerFromIdentifier(v.identifier) local newkdv = v.amount * Config.Tax local newtotalAmountWithKdv = math.floor(v.amount + tonumber(newkdv)) local success = RemoveMoney(src, tonumber(newtotalAmountWithKdv)) if not success then Config.Notification(Config.NotificationText['undefinedjob'].text, Config.NotificationText['undefinedjob'].type, true, src) cb(false) return end if xPlayer then local xSource = GetSource(xPlayer) AddMoney(xSource, newtotalAmountWithKdv) v.status = 'paid' Citizen.Wait(100) sendToNotifyOwner(v.name, v.targetIdentifier, newtotalAmountWithKdv) sendToNotifyOwner(v.targetname, v.identifier, newtotalAmountWithKdv) ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE uniqueid = '" .. tonumber(v.uniqueid) .. "'") else local PlayerData = MySQL.Sync.prepare('SELECT * FROM users where identifier = ?', { v.identifier }) if PlayerData then PlayerData.accounts = json.decode(PlayerData.accounts) PlayerData.accounts.bank = PlayerData.accounts.bank + tonumber(newtotalAmountWithKdv) MySQL.Async.insert( 'INSERT INTO users (identifier, accounts) VALUES (:identifier, :accounts) ON DUPLICATE KEY UPDATE accounts = :accounts', { identifier = PlayerData.identifier, accounts = json.encode(PlayerData.accounts), }) v.status = 'paid' Citizen.Wait(100) sendToNotifyOwner(v.name, v.targetIdentifier, newtotalAmountWithKdv) sendToNotifyOwner(v.targetname, v.identifier, newtotalAmountWithKdv) ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE uniqueid = '" .. tonumber(v.uniqueid) .. "'") end end else TriggerEvent("esx_addonaccount:getSharedAccount", 'society_' .. v.societyname, function(account) local newkdv = v.amount * Config.Tax local newtotalAmountWithKdv = math.floor(v.amount + tonumber(newkdv)) local success = RemoveMoney(src, tonumber(newtotalAmountWithKdv)) if not success then Config.Notification(Config.NotificationText['undefinedjob'].text, Config.NotificationText['undefinedjob'].type, true, src) return end account.addMoney(newtotalAmountWithKdv) v.status = 'paid' sendToNotifyOwner(v.name, v.targetIdentifier, newtotalAmountWithKdv) ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE uniqueid = '" .. tonumber(v.uniqueid) .. "'") end) end end end Citizen.Wait(150) cb(allBillingData[playerIdentifier]) else for k, v in pairs(bills) do if v.status == 'unpaid' then if v.societyname == 'identifier' then local xPlayer = GetPlayerFromIdentifier(v.identifier) local newkdv = v.amount * Config.Tax local newtotalAmountWithKdv = math.floor(v.amount + tonumber(newkdv)) local success = RemoveMoney(src, tonumber(newtotalAmountWithKdv)) if not success then Config.Notification(Config.NotificationText['undefinedjob'].text, Config.NotificationText['undefinedjob'].type, true, src) cb(false) return end if xPlayer then local xSource = GetSource(xPlayer) AddMoney(xSource, newtotalAmountWithKdv) v.status = 'paid' Citizen.Wait(100) sendToNotifyOwner(v.name, v.targetIdentifier, newtotalAmountWithKdv) sendToNotifyOwner(v.targetname, v.identifier, newtotalAmountWithKdv) ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE uniqueid = '" .. tonumber(v.uniqueid) .. "'") else local PlayerData = Core.Player.GetOfflinePlayer(v.identifier) if PlayerData then PlayerData.PlayerData.money.bank = PlayerData.PlayerData.money.bank + tonumber(newtotalAmountWithKdv) Core.Player.SaveOffline(PlayerData.PlayerData) v.status = 'paid' Citizen.Wait(100) sendToNotifyOwner(v.name, v.targetIdentifier, newtotalAmountWithKdv) ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE uniqueid = '" .. tonumber(v.uniqueid) .. "'") end end else local newkdv = v.amount * Config.Tax local newtotalAmountWithKdv = math.floor(v.amount + tonumber(newkdv)) local success = RemoveMoney(src, tonumber(newtotalAmountWithKdv)) if not success then Config.Notification(Config.NotificationText['undefinedjob'].text, Config.NotificationText['undefinedjob'].type, true, src) cb(false) return end if Config.newManagementSystem then local account_money = exports["qb-banking"]:GetAccount(v.societyname) if account_money and account_money.account_balance then exports["qb-banking"]:AddMoney(v.societyname, tonumber(newtotalAmountWithKdv)) else if Config.CreateJobAccount then exports["qb-banking"]:CreateJobAccount(v.societyname, 0) Wait(350) exports["qb-banking"]:AddMoney(v.societyname, tonumber(newtotalAmountWithKdv)) end end else exports["qb-management"]:AddMoney(v.societyname, tonumber(newtotalAmountWithKdv)) end Wait(100) v.status = 'paid' ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE uniqueid = '" .. tonumber(v.uniqueid) .. "'") sendToNotifyOwner(v.name, v.targetIdentifier, newtotalAmountWithKdv) sendToNotifyOwner(v.targetname, v.identifier, newtotalAmountWithKdv) end end end Citizen.Wait(150) cb(allBillingData[playerIdentifier]) end end) RegisterCallback('codem-billing:payBill', function(source, cb, billid) local src = source if cooldowns[source] and (os.time() - cooldowns[source] < 5) then Config.Notification(Config.NotificationText['beforewait'].text, Config.NotificationText['beforewait'].type, true, src) return end cooldowns[source] = os.time() local xPlayer = GetPlayer(src) if not xPlayer then return end local playerMoney = getPlayerMoney(src) local playerIdentifier = GetIdentifier(src) for _, billData in pairs(allBillingData[playerIdentifier]) do if tonumber(billData.uniqueid) == tonumber(billid) then if tonumber(playerMoney) >= tonumber(billData.amount) then if Config.Framework == 'esx' or Config.Framework == 'oldesx' then if billData.societyname == 'identifier' then local xPlayer = GetPlayerFromIdentifier(billData.identifier) local kdv = billData.amount * Config.Tax local totalAmountWithKdv = math.floor(billData.amount + tonumber(kdv)) local success = RemoveMoney(src, tonumber(totalAmountWithKdv)) if not success then Config.Notification(Config.NotificationText['undefinedjob'].text, Config.NotificationText['undefinedjob'].type, true, src) cb(false) return end if xPlayer then local xSource = GetSource(xPlayer) AddMoney(xSource, totalAmountWithKdv) billData.status = 'paid' Citizen.Wait(100) sendToNotifyOwner(billData.name, billData.targetIdentifier, totalAmountWithKdv) sendToNotifyOwner(billData.targetname, billData.identifier, totalAmountWithKdv) discordLogBilling(xSource, billData, 'paybill', 'Paid Bill') cb(allBillingData[playerIdentifier]) ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE uniqueid = '" .. tonumber(billid) .. "'") else local PlayerData = ExecuteSql("SELECT * FROM users WHERE identifier = '" .. billData.identifier .. "' ") if PlayerData then money = json.decode(PlayerData[1].accounts) money.bank = money.bank + tonumber(totalAmountWithKdv) ExecuteSql("UPDATE `users` SET `accounts` = '" .. json.encode(money) .. "' WHERE identifier = '" .. billData.identifier .. "'") billData.status = 'paid' Citizen.Wait(100) sendToNotifyOwner(billData.name, billData.targetIdentifier, totalAmountWithKdv) cb(allBillingData[playerIdentifier]) ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE uniqueid = '" .. tonumber(billid) .. "'") discordLogBilling(src, billData, 'paybill', 'Offline billing player') else Config.Notification(Config.NotificationText['offlinenotplayer'].text, Config.NotificationText['offlinenotplayer'].type, true, src) end end else TriggerEvent("esx_addonaccount:getSharedAccount", 'society_' .. billData.societyname, function(account) local kdv = billData.amount * Config.Tax local totalAmountWithKdv = math.floor(billData.amount + tonumber(kdv)) local success = RemoveMoney(src, tonumber(totalAmountWithKdv)) if not success then Config.Notification(Config.NotificationText['undefinedjob'].text, Config.NotificationText['undefinedjob'].type, true, src) return end account.addMoney(totalAmountWithKdv) billData.status = 'paid' sendToNotifyOwner(billData.name, billData.targetIdentifier, totalAmountWithKdv) cb(allBillingData[playerIdentifier]) ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE uniqueid = '" .. tonumber(billid) .. "'") end) end else local kdv = billData.amount * Config.Tax local totalAmountWithKdv = math.floor(billData.amount + tonumber(kdv)) local success = RemoveMoney(src, tonumber(totalAmountWithKdv)) if not success then Config.Notification(Config.NotificationText['errormoney'].text, Config.NotificationText['errormoney'].type, true, src) cb(false) return end if billData.societyname ~= 'identifier' then if Config.newManagementSystem then local account_money = exports["qb-banking"]:GetAccount(billData.societyname) if account_money and account_money.account_balance then exports["qb-banking"]:AddMoney(billData.societyname, tonumber(totalAmountWithKdv)) else if Config.CreateJobAccount then exports["qb-banking"]:CreateJobAccount(billData.societyname, 0) Wait(350) exports["qb-banking"]:AddMoney(billData.societyname, tonumber(totalAmountWithKdv)) end end else exports["qb-management"]:AddMoney(billData.societyname, tonumber(totalAmountWithKdv)) end Wait(100) billData.status = 'paid' cb(allBillingData[playerIdentifier]) ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE uniqueid = '" .. tonumber(billid) .. "'") sendToNotifyOwner(billData.name, billData.targetIdentifier, totalAmountWithKdv) sendToNotifyOwner(billData.targetname, billData.identifier, totalAmountWithKdv) else local xPlayer = GetPlayerFromIdentifier(billData.identifier) if xPlayer then local xSource = GetSource(xPlayer) AddMoney(xSource, totalAmountWithKdv) billData.status = 'paid' Citizen.Wait(100) sendToNotifyOwner(billData.name, billData.targetIdentifier, totalAmountWithKdv) sendToNotifyOwner(billData.targetname, billData.identifier, totalAmountWithKdv) cb(allBillingData[playerIdentifier]) ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE uniqueid = '" .. tonumber(billid) .. "'") discordLogBilling(xSource, billData, 'paybill', 'Paid Bill') else local PlayerData = ExecuteSql("SELECT * FROM players WHERE citizenid = '" .. billData.identifier .. "' ") if PlayerData then local kdv = billData.amount * Config.Tax local totalAmountWithKdv = math.floor(billData.amount + tonumber(kdv)) money = json.decode(PlayerData[1].money) money.bank = money.bank + tonumber(totalAmountWithKdv) ExecuteSql("UPDATE `players` SET `money` = '" .. json.encode(money) .. "' WHERE citizenid = '" .. billData.identifier .. "'") billData.status = 'paid' Citizen.Wait(100) sendToNotifyOwner(billData.name, billData.targetIdentifier, totalAmountWithKdv) cb(allBillingData[playerIdentifier]) ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE uniqueid = '" .. tonumber(billid) .. "'") discordLogBilling(src, billData, 'paybill', 'Offline billing player') else Config.Notification(Config.NotificationText['offlinenotplayer'].text, Config.NotificationText['offlinenotplayer'].type, true, src) end end end end else Config.Notification(Config.NotificationText['notmoney'].text, Config.NotificationText['notmoney'].type, true, src) end end end end) RegisterCallback('codem-billing:payBillFind', function(source, cb, billdata) local src = source if cooldowns[source] and (os.time() - cooldowns[source] < 5) then Config.Notification(Config.NotificationText['beforewait'].text, Config.NotificationText['beforewait'].type, true, src) return end cooldowns[source] = os.time() local xPlayer = GetPlayer(src) if not xPlayer then return end local playerMoney = getPlayerMoney(src) local playerIdentifier = billdata.targetIdentifier for _, billData in pairs(allBillingData[playerIdentifier]) do if tonumber(billData.uniqueid) == tonumber(billdata.uniqueid) then if tonumber(playerMoney) >= tonumber(billData.amount) then if Config.Framework == 'esx' or Config.Framework == 'oldesx' then if billData.societyname == 'identifier' then local xPlayer = GetPlayerFromIdentifier(billData.identifier) local kdv = billData.amount * Config.Tax local totalAmountWithKdv = math.floor(billData.amount + tonumber(kdv)) local success = RemoveMoney(src, tonumber(totalAmountWithKdv)) if not success then Config.Notification(Config.NotificationText['undefinedjob'].text, Config.NotificationText['undefinedjob'].type, true, src) cb(false) return end if xPlayer then local xSource = GetSource(xPlayer) AddMoney(xSource, totalAmountWithKdv) billData.status = 'paid' Citizen.Wait(100) sendToNotifyOwner(billData.name, billData.targetIdentifier, totalAmountWithKdv) sendToNotifyOwner(billData.targetname, billData.identifier, totalAmountWithKdv) discordLogBilling(xSource, billData, 'paybill', 'Paid Bill') cb(allBillingData[playerIdentifier]) ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE uniqueid = '" .. tonumber(billdata.uniqueid) .. "'") else local PlayerData = ExecuteSql("SELECT * FROM users WHERE identifier = '" .. billData.identifier .. "' ") if PlayerData then money = json.decode(PlayerData[1].accounts) money.bank = money.bank + tonumber(totalAmountWithKdv) ExecuteSql("UPDATE `users` SET `accounts` = '" .. json.encode(money) .. "' WHERE identifier = '" .. billData.identifier .. "'") billData.status = 'paid' Citizen.Wait(100) sendToNotifyOwner(billData.name, billData.targetIdentifier, totalAmountWithKdv) cb(allBillingData[playerIdentifier]) ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE uniqueid = '" .. tonumber(billdata.uniqueid) .. "'") discordLogBilling(src, billData, 'paybill', 'Offline billing player') else Config.Notification(Config.NotificationText['offlinenotplayer'].text, Config.NotificationText['offlinenotplayer'].type, true, src) end end else TriggerEvent("esx_addonaccount:getSharedAccount", 'society_' .. billData.societyname, function(account) local kdv = billData.amount * Config.Tax local totalAmountWithKdv = math.floor(billData.amount + tonumber(kdv)) local success = RemoveMoney(src, tonumber(totalAmountWithKdv)) if not success then Config.Notification(Config.NotificationText['undefinedjob'].text, Config.NotificationText['undefinedjob'].type, true, src) return end account.addMoney(totalAmountWithKdv) billData.status = 'paid' sendToNotifyOwner(billData.name, billData.targetIdentifier, totalAmountWithKdv) cb(allBillingData[playerIdentifier]) ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE uniqueid = '" .. tonumber(billdata.uniqueid) .. "'") end) end else local kdv = billData.amount * Config.Tax local totalAmountWithKdv = math.floor(billData.amount + tonumber(kdv)) local success = RemoveMoney(src, tonumber(totalAmountWithKdv)) if not success then Config.Notification(Config.NotificationText['errormoney'].text, Config.NotificationText['errormoney'].type, true, src) cb(false) return end if billData.societyname ~= 'identifier' then if Config.newManagementSystem then local account_money = exports["qb-banking"]:GetAccount(billData.societyname) if account_money and account_money.account_balance then exports["qb-banking"]:AddMoney(billData.societyname, tonumber(totalAmountWithKdv)) else if Config.CreateJobAccount then exports["qb-banking"]:CreateJobAccount(billData.societyname, 0) Wait(350) exports["qb-banking"]:AddMoney(billData.societyname, tonumber(totalAmountWithKdv)) end end else exports["qb-management"]:AddMoney(billData.societyname, tonumber(totalAmountWithKdv)) end Wait(100) billData.status = 'paid' cb(allBillingData[playerIdentifier]) ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE uniqueid = '" .. tonumber(billdata.uniqueid) .. "'") sendToNotifyOwner(billData.name, billData.targetIdentifier, totalAmountWithKdv) sendToNotifyOwner(billData.targetname, billData.identifier, totalAmountWithKdv) else local xPlayer = GetPlayerFromIdentifier(billData.identifier) if xPlayer then local xSource = GetSource(xPlayer) AddMoney(xSource, totalAmountWithKdv) billData.status = 'paid' Citizen.Wait(100) sendToNotifyOwner(billData.name, billData.targetIdentifier, totalAmountWithKdv) sendToNotifyOwner(billData.targetname, billData.identifier, totalAmountWithKdv) cb(allBillingData[playerIdentifier]) ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE uniqueid = '" .. tonumber(billdata.uniqueid) .. "'") discordLogBilling(xSource, billData, 'paybill', 'Paid Bill') else local PlayerData = ExecuteSql("SELECT * FROM players WHERE citizenid = '" .. billData.identifier .. "' ") if PlayerData then local kdv = billData.amount * Config.Tax local totalAmountWithKdv = math.floor(billData.amount + tonumber(kdv)) money = json.decode(PlayerData[1].money) money.bank = money.bank + tonumber(totalAmountWithKdv) ExecuteSql("UPDATE `players` SET `money` = '" .. json.encode(money) .. "' WHERE citizenid = '" .. billData.identifier .. "'") billData.status = 'paid' Citizen.Wait(100) sendToNotifyOwner(billData.name, billData.targetIdentifier, totalAmountWithKdv) cb(allBillingData[playerIdentifier]) ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE uniqueid = '" .. tonumber(billdata.uniqueid) .. "'") discordLogBilling(src, billData, 'paybill', 'Offline billing player') else Config.Notification(Config.NotificationText['offlinenotplayer'].text, Config.NotificationText['offlinenotplayer'].type, true, src) end end end end else Config.Notification(Config.NotificationText['notmoney'].text, Config.NotificationText['notmoney'].type, true, src) end end end end) if Config.UsableItem ~= false or Config.UsableItem ~= "" then if Config.Framework == 'oldesx' or Config.Framework == 'esx' then Core.RegisterUsableItem(Config.UsableItem, function(source) TriggerClientEvent('codem-billing:openBillingMenu', source) end) else Core.Functions.CreateUseableItem(Config.UsableItem, function(source) TriggerClientEvent('codem-billing:openBillingMenu', source) end) end end end) RegisterServerEvent('codem-billing:payBill', function(billingId) local src = source if cooldowns[source] and (os.time() - cooldowns[source] < 5) then Config.Notification(Config.NotificationText['beforewait'].text, Config.NotificationText['beforewait'].type, true, src) return end cooldowns[source] = os.time() local xPlayer = GetPlayer(src) if not xPlayer then return end local playerMoney = getPlayerMoney(src) local playerIdentifier = GetIdentifier(src) for _, billData in pairs(allBillingData[playerIdentifier]) do if tonumber(billData.id) == tonumber(billingId) then if tonumber(playerMoney) >= tonumber(billData.amount) then if Config.Framework == 'esx' or Config.Framework == 'oldesx' then if billData.societyname == 'identifier' then local xPlayer = GetPlayerFromIdentifier(billData.identifier) local kdv = billData.amount * Config.Tax local totalAmountWithKdv = math.floor(billData.amount + tonumber(kdv)) local success = RemoveMoney(src, tonumber(totalAmountWithKdv)) if not success then Config.Notification(Config.NotificationText['undefinedjob'].text, Config.NotificationText['undefinedjob'].type, true, src) return end if xPlayer then local xSource = GetSource(xPlayer) AddMoney(xSource, totalAmountWithKdv) billData.status = 'paid' Citizen.Wait(100) sendToNotifyOwner(billData.name, billData.targetIdentifier, totalAmountWithKdv) sendToNotifyOwner(billData.targetname, billData.identifier, totalAmountWithKdv) discordLogBilling(xSource, billData, 'paybill', 'Paid Bill') ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE id = '" .. tonumber(billingId) .. "'") else local PlayerData = ExecuteSql("SELECT * FROM users WHERE identifier = '" .. billData.identifier .. "' ") if PlayerData then money = json.decode(PlayerData[1].accounts) money.bank = money.bank + tonumber(totalAmountWithKdv) ExecuteSql("UPDATE `users` SET `accounts` = '" .. json.encode(money) .. "' WHERE identifier = '" .. billData.identifier .. "'") billData.status = 'paid' Citizen.Wait(100) sendToNotifyOwner(billData.name, billData.targetIdentifier, totalAmountWithKdv) ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE id = '" .. tonumber(billingId) .. "'") discordLogBilling(src, billData, 'paybill', 'Offline billing player') else Config.Notification(Config.NotificationText['offlinenotplayer'].text, Config.NotificationText['offlinenotplayer'].type, true, src) end end else TriggerEvent("esx_addonaccount:getSharedAccount", 'society_' .. billData.societyname, function(account) local kdv = billData.amount * Config.Tax local totalAmountWithKdv = math.floor(billData.amount + tonumber(kdv)) local success = RemoveMoney(src, tonumber(totalAmountWithKdv)) if not success then Config.Notification(Config.NotificationText['undefinedjob'].text, Config.NotificationText['undefinedjob'].type, true, src) return end account.addMoney(totalAmountWithKdv) billData.status = 'paid' sendToNotifyOwner(billData.name, billData.targetIdentifier, totalAmountWithKdv) ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE id = '" .. tonumber(billingId) .. "'") end) end else local kdv = billData.amount * Config.Tax local totalAmountWithKdv = math.floor(billData.amount + tonumber(kdv)) local success = RemoveMoney(src, tonumber(totalAmountWithKdv)) if not success then Config.Notification(Config.NotificationText['errormoney'].text, Config.NotificationText['errormoney'].type, true, src) return end if billData.societyname ~= 'identifier' then if Config.newManagementSystem then local account_money = exports["qb-banking"]:GetAccount(billData.societyname) if account_money and account_money.account_balance then exports["qb-banking"]:AddMoney(billData.societyname, tonumber(totalAmountWithKdv)) else if Config.CreateJobAccount then exports["qb-banking"]:CreateJobAccount(billData.societyname, 0) Wait(350) exports["qb-banking"]:AddMoney(billData.societyname, tonumber(totalAmountWithKdv)) end end else exports["qb-management"]:AddMoney(billData.societyname, tonumber(totalAmountWithKdv)) end Wait(100) billData.status = 'paid' ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE id = '" .. tonumber(billingId) .. "'") sendToNotifyOwner(billData.name, billData.targetIdentifier, totalAmountWithKdv) sendToNotifyOwner(billData.targetname, billData.identifier, totalAmountWithKdv) else local xPlayer = GetPlayerFromIdentifier(billData.identifier) if xPlayer then local xSource = GetSource(xPlayer) AddMoney(xSource, totalAmountWithKdv) billData.status = 'paid' Citizen.Wait(100) sendToNotifyOwner(billData.name, billData.targetIdentifier, totalAmountWithKdv) sendToNotifyOwner(billData.targetname, billData.identifier, totalAmountWithKdv) ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE id = '" .. tonumber(billingId) .. "'") discordLogBilling(xSource, billData, 'paybill', 'Paid Bill') else local PlayerData = ExecuteSql("SELECT * FROM players WHERE citizenid = '" .. billData.identifier .. "' ") if PlayerData then local kdv = billData.amount * Config.Tax local totalAmountWithKdv = math.floor(billData.amount + tonumber(kdv)) money = json.decode(PlayerData[1].money) money.bank = money.bank + tonumber(totalAmountWithKdv) ExecuteSql("UPDATE `players` SET `money` = '" .. json.encode(money) .. "' WHERE citizenid = '" .. billData.identifier .. "'") billData.status = 'paid' Citizen.Wait(100) sendToNotifyOwner(billData.name, billData.targetIdentifier, totalAmountWithKdv) ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE id = '" .. tonumber(billingId) .. "'") discordLogBilling(src, billData, 'paybill', 'Offline billing player') else Config.Notification(Config.NotificationText['offlinenotplayer'].text, Config.NotificationText['offlinenotplayer'].type, true, src) end end end end else Config.Notification(Config.NotificationText['notmoney'].text, Config.NotificationText['notmoney'].type, true, src) end end end end) RegisterServerEvent('codem-billing:server:PayBillBank', function(source, billingId) local src = source local xPlayer = GetPlayer(src) if not xPlayer then return end local playerMoney = getPlayerMoney(src) local playerIdentifier = GetIdentifier(src) for _, billData in pairs(allBillingData[playerIdentifier]) do if tonumber(billData.uniqueid) == tonumber(billingId) then if tonumber(playerMoney) >= tonumber(billData.amount) then if Config.Framework == 'esx' or Config.Framework == 'oldesx' then if billData.societyname == 'identifier' then local xPlayer = GetPlayerFromIdentifier(billData.identifier) local kdv = billData.amount * Config.Tax local totalAmountWithKdv = math.floor(billData.amount + tonumber(kdv)) local success = RemoveMoney(src, tonumber(totalAmountWithKdv)) if not success then Config.Notification(Config.NotificationText['undefinedjob'].text, Config.NotificationText['undefinedjob'].type, true, src) return end if xPlayer then local xSource = GetSource(xPlayer) AddMoney(xSource, totalAmountWithKdv) billData.status = 'paid' Citizen.Wait(100) sendToNotifyOwner(billData.name, billData.targetIdentifier, totalAmountWithKdv) sendToNotifyOwner(billData.targetname, billData.identifier, totalAmountWithKdv) discordLogBilling(xSource, billData, 'paybill', 'Paid Bill') ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE uniqueid = '" .. tonumber(billingId) .. "'") else local PlayerData = ExecuteSql("SELECT * FROM users WHERE identifier = '" .. billData.identifier .. "' ") if PlayerData then money = json.decode(PlayerData[1].accounts) money.bank = money.bank + tonumber(totalAmountWithKdv) ExecuteSql("UPDATE `users` SET `accounts` = '" .. json.encode(money) .. "' WHERE identifier = '" .. billData.identifier .. "'") billData.status = 'paid' Citizen.Wait(100) sendToNotifyOwner(billData.name, billData.targetIdentifier, totalAmountWithKdv) ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE uniqueid = '" .. tonumber(billingId) .. "'") discordLogBilling(src, billData, 'paybill', 'Offline billing player') else Config.Notification(Config.NotificationText['offlinenotplayer'].text, Config.NotificationText['offlinenotplayer'].type, true, src) end end else TriggerEvent("esx_addonaccount:getSharedAccount", 'society_' .. billData.societyname, function(account) local kdv = billData.amount * Config.Tax local totalAmountWithKdv = math.floor(billData.amount + tonumber(kdv)) local success = RemoveMoney(src, tonumber(totalAmountWithKdv)) if not success then Config.Notification(Config.NotificationText['undefinedjob'].text, Config.NotificationText['undefinedjob'].type, true, src) return end account.addMoney(totalAmountWithKdv) billData.status = 'paid' sendToNotifyOwner(billData.name, billData.targetIdentifier, totalAmountWithKdv) ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE uniqueid = '" .. tonumber(billingId) .. "'") end) end else local kdv = billData.amount * Config.Tax local totalAmountWithKdv = math.floor(billData.amount + tonumber(kdv)) local success = RemoveMoney(src, tonumber(totalAmountWithKdv)) if not success then Config.Notification(Config.NotificationText['errormoney'].text, Config.NotificationText['errormoney'].type, true, src) return end if billData.societyname ~= 'identifier' then if Config.newManagementSystem then local account_money = exports["qb-banking"]:GetAccount(billData.societyname) if account_money and account_money.account_balance then exports["qb-banking"]:AddMoney(billData.societyname, tonumber(totalAmountWithKdv)) else if Config.CreateJobAccount then exports["qb-banking"]:CreateJobAccount(billData.societyname, 0) Wait(350) exports["qb-banking"]:AddMoney(billData.societyname, tonumber(totalAmountWithKdv)) end end else exports["qb-management"]:AddMoney(billData.societyname, tonumber(totalAmountWithKdv)) end Wait(100) billData.status = 'paid' ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE uniqueid = '" .. tonumber(billingId) .. "'") sendToNotifyOwner(billData.name, billData.targetIdentifier, totalAmountWithKdv) sendToNotifyOwner(billData.targetname, billData.identifier, totalAmountWithKdv) else local xPlayer = GetPlayerFromIdentifier(billData.identifier) if xPlayer then local xSource = GetSource(xPlayer) AddMoney(xSource, totalAmountWithKdv) billData.status = 'paid' Citizen.Wait(100) sendToNotifyOwner(billData.name, billData.targetIdentifier, totalAmountWithKdv) sendToNotifyOwner(billData.targetname, billData.identifier, totalAmountWithKdv) ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE uniqueid = '" .. tonumber(billingId) .. "'") discordLogBilling(xSource, billData, 'paybill', 'Paid Bill') else local PlayerData = ExecuteSql("SELECT * FROM players WHERE citizenid = '" .. billData.identifier .. "' ") if PlayerData then local kdv = billData.amount * Config.Tax local totalAmountWithKdv = math.floor(billData.amount + tonumber(kdv)) money = json.decode(PlayerData[1].money) money.bank = money.bank + tonumber(totalAmountWithKdv) ExecuteSql("UPDATE `players` SET `money` = '" .. json.encode(money) .. "' WHERE citizenid = '" .. billData.identifier .. "'") billData.status = 'paid' Citizen.Wait(100) sendToNotifyOwner(billData.name, billData.targetIdentifier, totalAmountWithKdv) ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE uniqueid = '" .. tonumber(billingId) .. "'") discordLogBilling(src, billData, 'paybill', 'Offline billing player') else Config.Notification(Config.NotificationText['offlinenotplayer'].text, Config.NotificationText['offlinenotplayer'].type, true, src) end end end end else Config.Notification(Config.NotificationText['notmoney'].text, Config.NotificationText['notmoney'].type, true, src) end end end end) RegisterServerEvent('codem-billing:server:PayBillBankV2', function(source, billingId) local src = source local xPlayer = GetPlayer(src) if not xPlayer then return end local result = ExecuteSql("SELECT * FROM `codem_billing` WHERE `id` = ?", { billingId }) if result then local billingId = result[1].uniqueid local playerMoney = getPlayerMoney(src) local playerIdentifier = GetIdentifier(src) for _, billData in pairs(allBillingData[playerIdentifier]) do if tonumber(billData.uniqueid) == tonumber(billingId) then if tonumber(playerMoney) >= tonumber(billData.amount) then if Config.Framework == 'esx' or Config.Framework == 'oldesx' then if billData.societyname == 'identifier' then local xPlayer = GetPlayerFromIdentifier(billData.identifier) local kdv = billData.amount * Config.Tax local totalAmountWithKdv = math.floor(billData.amount + tonumber(kdv)) local success = RemoveMoney(src, tonumber(totalAmountWithKdv)) if not success then Config.Notification(Config.NotificationText['undefinedjob'].text, Config.NotificationText['undefinedjob'].type, true, src) return end if xPlayer then local xSource = GetSource(xPlayer) AddMoney(xSource, totalAmountWithKdv) billData.status = 'paid' Citizen.Wait(100) sendToNotifyOwner(billData.name, billData.targetIdentifier, totalAmountWithKdv) sendToNotifyOwner(billData.targetname, billData.identifier, totalAmountWithKdv) discordLogBilling(xSource, billData, 'paybill', 'Paid Bill') ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE uniqueid = '" .. tonumber(billingId) .. "'") else local PlayerData = ExecuteSql("SELECT * FROM users WHERE identifier = '" .. billData.identifier .. "' ") if PlayerData then money = json.decode(PlayerData[1].accounts) money.bank = money.bank + tonumber(totalAmountWithKdv) ExecuteSql("UPDATE `users` SET `accounts` = '" .. json.encode(money) .. "' WHERE identifier = '" .. billData.identifier .. "'") billData.status = 'paid' Citizen.Wait(100) sendToNotifyOwner(billData.name, billData.targetIdentifier, totalAmountWithKdv) ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE uniqueid = '" .. tonumber(billingId) .. "'") discordLogBilling(src, billData, 'paybill', 'Offline billing player') else Config.Notification(Config.NotificationText['offlinenotplayer'].text, Config.NotificationText['offlinenotplayer'].type, true, src) end end else TriggerEvent("esx_addonaccount:getSharedAccount", 'society_' .. billData.societyname, function(account) local kdv = billData.amount * Config.Tax local totalAmountWithKdv = math.floor(billData.amount + tonumber(kdv)) local success = RemoveMoney(src, tonumber(totalAmountWithKdv)) if not success then Config.Notification(Config.NotificationText['undefinedjob'].text, Config.NotificationText['undefinedjob'].type, true, src) return end account.addMoney(totalAmountWithKdv) billData.status = 'paid' sendToNotifyOwner(billData.name, billData.targetIdentifier, totalAmountWithKdv) ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE uniqueid = '" .. tonumber(billingId) .. "'") end) end else local kdv = billData.amount * Config.Tax local totalAmountWithKdv = math.floor(billData.amount + tonumber(kdv)) local success = RemoveMoney(src, tonumber(totalAmountWithKdv)) if not success then Config.Notification(Config.NotificationText['errormoney'].text, Config.NotificationText['errormoney'].type, true, src) return end if billData.societyname ~= 'identifier' then if Config.newManagementSystem then local account_money = exports["qb-banking"]:GetAccount(billData.societyname) if account_money and account_money.account_balance then exports["qb-banking"]:AddMoney(billData.societyname, tonumber(totalAmountWithKdv)) else if Config.CreateJobAccount then exports["qb-banking"]:CreateJobAccount(billData.societyname, 0) Wait(350) exports["qb-banking"]:AddMoney(billData.societyname, tonumber(totalAmountWithKdv)) end end else exports["qb-management"]:AddMoney(billData.societyname, tonumber(totalAmountWithKdv)) end Wait(100) billData.status = 'paid' ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE uniqueid = '" .. tonumber(billingId) .. "'") sendToNotifyOwner(billData.name, billData.targetIdentifier, totalAmountWithKdv) sendToNotifyOwner(billData.targetname, billData.identifier, totalAmountWithKdv) else local xPlayer = GetPlayerFromIdentifier(billData.identifier) if xPlayer then local xSource = GetSource(xPlayer) AddMoney(xSource, totalAmountWithKdv) billData.status = 'paid' Citizen.Wait(100) sendToNotifyOwner(billData.name, billData.targetIdentifier, totalAmountWithKdv) sendToNotifyOwner(billData.targetname, billData.identifier, totalAmountWithKdv) ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE uniqueid = '" .. tonumber(billingId) .. "'") discordLogBilling(xSource, billData, 'paybill', 'Paid Bill') else local PlayerData = ExecuteSql("SELECT * FROM players WHERE citizenid = '" .. billData.identifier .. "' ") if PlayerData then local kdv = billData.amount * Config.Tax local totalAmountWithKdv = math.floor(billData.amount + tonumber(kdv)) money = json.decode(PlayerData[1].money) money.bank = money.bank + tonumber(totalAmountWithKdv) ExecuteSql("UPDATE `players` SET `money` = '" .. json.encode(money) .. "' WHERE citizenid = '" .. billData.identifier .. "'") billData.status = 'paid' Citizen.Wait(100) sendToNotifyOwner(billData.name, billData.targetIdentifier, totalAmountWithKdv) ExecuteSql("UPDATE `codem_billing` SET `status` = 'paid' WHERE uniqueid = '" .. tonumber(billingId) .. "'") discordLogBilling(src, billData, 'paybill', 'Offline billing player') else Config.Notification(Config.NotificationText['offlinenotplayer'].text, Config.NotificationText['offlinenotplayer'].type, true, src) end end end end else Config.Notification(Config.NotificationText['notmoney'].text, Config.NotificationText['notmoney'].type, true, src) end end end end end) function createBilling(src, targetId, amount, reason, society) local src = src if targetId == '' then Config.Notification(Config.NotificationText['writeid'].text, Config.NotificationText['writeid'].type, true, src) return end if amount == '' then Config.Notification(Config.NotificationText['amountinvoice'].text, Config.NotificationText['amountinvoice'].type, true, src) return end if reason == '' then Config.Notification(Config.NotificationText['reasonsection'].text, Config.NotificationText['reasonsection'].type, true, src) return end reason = escapeSQL(reason) local identifier = GetIdentifier(src) local name = GetName(src) local targetIdentifier = GetIdentifier(tonumber(targetId)) local targetName = GetName(tonumber(targetId)) local invoiceLabel = reason local status = 'unpaid' local jobname if Config.AllowBillingJobs[society] == nil then if Config.SendInvoiceAsStaffAccount then jobname = 'identifier' else Config.Notification(Config.NotificationText['notallowpersonelaccount'].text, Config.NotificationText['notallowpersonelaccount'].type, true, src) return end else jobname = society end local uniqueId = false local UniqueFound = false local date = os.date("%Y-%m-%d %H:%M") while not UniqueFound do uniqueId = math.random(100000, 999999) local result = ExecuteSql("SELECT COUNT(*) as count FROM codem_billing WHERE uniqueid = '" .. tonumber(uniqueId) .. "'") if result[1].count == 0 then UniqueFound = true else uniqueId = math.random(100000, 999999) UniqueFound = true end end ExecuteSql( "INSERT INTO `codem_billing` (`identifier`, `name`, `targetidentifier`, `targetname`, `amount`, `invoicelabel`, `status`, `societyname`,`uniqueid`,`date`) VALUES ('" .. identifier .. "', '" .. name .. "', '" .. targetIdentifier .. "' , '" .. targetName .. "', '" .. amount .. "','" .. invoiceLabel .. "','" .. status .. "','" .. jobname .. "','" .. uniqueId .. "','" .. date .. "')" ) local data = { identifier = identifier, name = name, targetIdentifier = targetIdentifier, targetname = targetName, amount = amount, invoicelabel = invoiceLabel, status = status, societyname = jobname, uniqueid = uniqueId, date = date, dateupdate = 'false', seconddate = addDaysToDate(date, Config.HowManyDays), jobLabel = Config.AllowBillingJobs[society] or 'Personel Account' } if not allBillingData[targetIdentifier] then allBillingData[targetIdentifier] = {} end table.insert(allBillingData[targetIdentifier], data) TriggerClientEvent('codem-billing:updateBillData', tonumber(targetId), allBillingData[targetIdentifier]) discordLogBilling(src, data, 'bill', 'Billing Player') Config.Notification(string.format(Config.NotificationText['createbill'].text, name, amount), Config.NotificationText['paybill'].type, true, tonumber(targetId)) Config.Notification(string.format(Config.NotificationText['createdbill'].text, targetName, amount), Config.NotificationText['paybill'].type, true, tonumber(src)) TriggerClientEvent('codem-notification:showNotify', tonumber(targetId)) TriggerClientEvent('codem-billing:refreshPage', tonumber(src)) end Citizen.CreateThread(function() Core, Config.Framework = GetCore() end) function AddMoney(source, amount) local Player = GetPlayer(source) if Player then if Config.Framework == 'esx' or Config.Framework == 'oldesx' then Player.addAccountMoney('bank', tonumber(amount)) else Player.Functions.AddMoney("bank", tonumber(amount)) end end end function getPlayerMoney(source) local Player = GetPlayer(source) if Player then if Config.Framework == 'esx' or Config.Framework == 'oldesx' then local money = Player.getAccount('bank').money return money else local money = Player.PlayerData.money["bank"] return money end end end function RemoveMoney(source, amount) local success = false local Player = GetPlayer(source) if Player then if Config.Framework == 'esx' or Config.Framework == 'oldesx' then if Player.getAccount('bank').money >= amount then Player.removeAccountMoney('bank', amount) success = true end else if Player.Functions.RemoveMoney("bank", amount) then success = true end end end return success end function GetPlayer(source) local Player = false while Core == nil do Citizen.Wait(0) end if Config.Framework == 'esx' or Config.Framework == 'oldesx' then Player = Core.GetPlayerFromId(source) else Player = Core.Functions.GetPlayer(source) end return Player end function GetPlayerFromIdentifier(identifier) local Player = false while Core == nil do Citizen.Wait(0) end if Config.Framework == 'esx' or Config.Framework == 'oldesx' then Player = Core.GetPlayerFromIdentifier(identifier) else Player = Core.Functions.GetPlayerByCitizenId(identifier) end return Player end function GetIdentifier(source) local Player = GetPlayer(source) if Player then if Config.Framework == 'esx' or Config.Framework == 'oldesx' then return Player.getIdentifier() else return Player.PlayerData.citizenid end end end function GetJob(source) local Player = GetPlayer(source) if Player then if Config.Framework == 'esx' or Config.Framework == 'oldesx' then return Player.getJob().name, Player.getJob().grade else return Player.PlayerData.job.name, Player.PlayerData.job.grade.level end end return false end function GetName(source) if Config.Framework == "oldesx" or Config.Framework == "esx" then local xPlayer = Core.GetPlayerFromId(tonumber(source)) if xPlayer then return xPlayer.getName() else return "0" end elseif Config.Framework == 'qb' or Config.Framework == 'oldqb' then local Player = Core.Functions.GetPlayer(tonumber(source)) if Player then return Player.PlayerData.charinfo.firstname .. ' ' .. Player.PlayerData.charinfo.lastname else return "0" end elseif Config.Framework == 'standalone' then return GetPlayerName(source) end end function GetSource(xPlayer) if Config.Framework == 'esx' or Config.Framework == 'oldesx' then return xPlayer.source else if xPlayer and xPlayer.PlayerData then return xPlayer.PlayerData.source end end end function sendToNotifyOwner(name, identifier, amount) local xPlayer = GetPlayerFromIdentifier(identifier) if xPlayer then Config.Notification(string.format(Config.NotificationText['paybill'].text, name, amount), Config.NotificationText['paybill'].type, true, GetSource(xPlayer)) end end function escapeSQL(value) return value:gsub("'", "''") end Citizen.CreateThread(function() local resource_name = 'codem-billing' local current_version = GetResourceMetadata(GetCurrentResourceName(), 'version', 0) PerformHttpRequest('https://raw.githubusercontent.com/Aiakos232/versionchecker/main/version.json', function(error, result, headers) if not result then print('^1Version check disabled because github is down.^0') return end local result = json.decode(result) if tonumber(result[resource_name]) ~= nil then if tonumber(result[resource_name]) > tonumber(current_version) then print('\n') print('^1======================================================================^0') print('^1' .. resource_name .. ' is outdated, new version is available: ' .. result[resource_name] .. '^0') print('^1======================================================================^0') print('\n') elseif tonumber(result[resource_name]) == tonumber(current_version) then print('^2' .. resource_name .. ' is up to date! - ^4 Thanks for choose CodeM ^4 ^0') elseif tonumber(result[resource_name]) < tonumber(current_version) then print('^3' .. resource_name .. ' is a higher version than the official version!^0') end else print('^1' .. resource_name .. ' is not in the version database^0') end end, 'GET') end) -- BEST SCRIPTS/ MLOS/ CARS IN DISCORD.GG/DEMONDEV!!! -- BEST SCRIPTS/ MLOS/ CARS IN DISCORD.GG/DEMONDEV!!! -- BEST SCRIPTS/ MLOS/ CARS IN DISCORD.GG/DEMONDEV!!!