This commit is contained in:
Nordi98 2025-08-05 10:50:58 +02:00
parent 9e0a584816
commit 02dd8bf93c
26 changed files with 0 additions and 6730 deletions

Binary file not shown.

View file

@ -1,7 +0,0 @@
Hi, thank you for buying okokBanking! :)

If you need help contact me on discord: okok#3488
Discord server: https://discord.gg/okok
Docs: https://docs.okokscripts.io/

-> Installation Guide: https://docs.okokscripts.io/scripts/okokbanking

View file

@ -1,977 +0,0 @@
local QBCore = exports["qb-core"]:GetCoreObject()
local PlayerData = {}
local trans = {}
local societyTrans = {}
local societyIdent, societyDays
local didAction = false
local isBankOpened = false
local canAccessSociety = false
local society = ''
local societyInfo
local closestATM, atmPos
local playerName, playerBankMoney, playerIBAN, trsIdentifier, allDaysValues, walletMoney
local targetOptionsNames = { atm = 'okokBanking:ATM', bank = 'okokBanking:Bank'}
local BankZonesId, AtmModels = {}, {}

function GenerateIBAN()
math.randomseed(GetGameTimer())
local stringFormat = "%0"..Config.IBANNumbers.."d"
local number = math.random(0, 10^Config.IBANNumbers-1)
number = string.format(stringFormat, number)
local iban = Config.IBANPrefix..number:upper()
local isIBanUsed = true
local hasChecked = false

while true do
Wait(10)
if isIBanUsed and not hasChecked then
isIBanUsed = false
QBCore.Functions.TriggerCallback("okokBanking:IsIBanUsed", function(isUsed)
if isUsed ~= nil then
isIBanUsed = true
number = math.random(0, 10^Config.IBANNumbers-1)
number = string.format("%03d", number)
iban = Config.IBANPrefix..number:upper()
elseif isUsed == nil then
hasChecked = true
isIBanUsed = false
end
canLoop = true
end, iban)
elseif not isIBanUsed and hasChecked then
break
end
end
TriggerServerEvent('okokBanking:SetIBAN', iban)
end

function string.starts(string, start)
return string.sub(string, 1, string.len(start)) == start
end

function openBank()
local isCreatingSociety = false
local hasJob = false
local playeJob = QBCore.Functions.GetPlayerData().job
local playerGang = QBCore.Functions.GetPlayerData().gang
local playerJobName = ''
local playerGangName = ''
local jobLabel = ''
isBankOpened = true
TriggerServerEvent('okokBanking:setMenuOpened', isBankOpened)

canAccessSociety = false

if playeJob ~= nil or playerGang ~= nil then
hasJob = true
playerJobName = playeJob.name
jobLabel = playeJob.name
society = playerJobName
playerGangName = playerGang.name
end

QBCore.Functions.TriggerCallback("okokBanking:GetPlayerInfo", function(data)
QBCore.Functions.TriggerCallback("okokBanking:GetOverviewTransactions", function(cb, identifier, allDays)
for k,v in pairs(Config.Societies) do
if playerJobName == v then
-- Check if job has configuration in JobBossRanks
if Config.JobBossRanks and Config.JobBossRanks[playerJobName] then
-- Check for specific ranks first
if Config.JobBossRanks[playerJobName].specificRanks and #Config.JobBossRanks[playerJobName].specificRanks > 0 then
for _, rank in ipairs(Config.JobBossRanks[playerJobName].specificRanks) do
if playeJob.grade.level == rank then
canAccessSociety = true
print("Boss access granted for " .. playerJobName .. " with specific rank " .. rank)
break
end
end
end
-- If not already granted access and maxRank is enabled, check for highest rank
if not canAccessSociety and Config.JobBossRanks[playerJobName].maxRank then
-- Get all job grades for this job
if QBCore.Shared.Jobs[playerJobName] and QBCore.Shared.Jobs[playerJobName].grades then
local jobGrades = QBCore.Shared.Jobs[playerJobName].grades
local highestRank = -1
-- Find the highest rank number
for grade, _ in pairs(jobGrades) do
local gradeNum = tonumber(grade)
if gradeNum and gradeNum > highestRank then
highestRank = gradeNum
end
end
-- Check if player has the highest rank
if playeJob.grade.level == highestRank then
canAccessSociety = true
print("Boss access granted for " .. playerJobName .. " with highest rank " .. highestRank)
else
print("Not highest rank for " .. playerJobName .. ", current rank: " .. playeJob.grade.level .. ", highest: " .. highestRank)
end
end
end
else
-- Fallback to original highest rank check if no configuration exists
if QBCore.Shared.Jobs[playerJobName] and QBCore.Shared.Jobs[playerJobName].grades then
local jobGrades = QBCore.Shared.Jobs[playerJobName].grades
local highestRank = -1
-- Find the highest rank number
for grade, _ in pairs(jobGrades) do
local gradeNum = tonumber(grade)
if gradeNum and gradeNum > highestRank then
highestRank = gradeNum
end
end
-- Check if player has the highest rank
if playeJob.grade.level == highestRank then
canAccessSociety = true
print("Boss access granted for " .. playerJobName .. " with highest rank " .. highestRank)
else
print("Not highest rank for " .. playerJobName .. ", current rank: " .. playeJob.grade.level .. ", highest: " .. highestRank)
end
end
end
elseif playerGangName == v then
if data.isBossGang == true then
jobLabel = playerGangName
society = playerGangName
canAccessSociety = true
end
end
end

if canAccessSociety then
isCreatingSociety = true
local societyIban = Config.IBANPrefix..jobLabel
QBCore.Functions.TriggerCallback("okokBanking:SocietyInfo", function(cb)
if cb ~= nil then
societyInfo = cb
isCreatingSociety = false
else
TriggerServerEvent("okokBanking:CreateSocietyAccount", society, jobLabel, 0, societyIban)
Wait(200)
while isCreatingSociety do
QBCore.Functions.TriggerCallback("okokBanking:SocietyInfo", function(cb)
if cb ~= nil then
societyInfo = cb
isCreatingSociety = false
end
end, society)
Wait(200)
end
end
end, society, societyIban)
end

while isCreatingSociety do
Wait(100)
end

isBankOpened = true
TriggerServerEvent('okokBanking:setMenuOpened', isBankOpened)
trans = cb
playerName, playerBankMoney, playerIBAN, trsIdentifier, allDaysValues, walletMoney = data.playerName, data.playerBankMoney, data.playerIBAN, identifier, allDays, data.walletMoney
QBCore.Functions.TriggerCallback("okokBanking:GetSocietyTransactions", function(societyTranscb, societyID, societyAllDays)
societyIdent = societyID
societyDays = societyAllDays
societyTrans = societyTranscb
if data.playerIBAN ~= nil then
if string.starts(data.playerIBAN, Config.IBANPrefix) then
if isBankOpened then
SetNuiFocus(true, true)
end
SendNUIMessage({
action = 'bankmenu',
playerName = data.playerName,
playerSex = data.sex,
playerBankMoney = data.playerBankMoney,
walletMoney = walletMoney,
playerIBAN = data.playerIBAN,
db = trans,
identifier = trsIdentifier,
graphDays = allDaysValues,
isInSociety = canAccessSociety,
RequireCC = Config.RequireCreditCardForATM,
UseSound = Config.UseOkOkBankingSounds,
})
else
GenerateIBAN()
Wait(1000)
QBCore.Functions.TriggerCallback("okokBanking:GetPlayerInfo", function(data)
if isBankOpened then
SetNuiFocus(true, true)
end
SendNUIMessage({
action = 'bankmenu',
playerName = data.playerName,
playerSex = data.sex,
playerBankMoney = data.playerBankMoney,
walletMoney = walletMoney,
playerIBAN = data.playerIBAN,
db = trans,
identifier = trsIdentifier,
graphDays = allDaysValues,
isInSociety = canAccessSociety,
RequireCC = Config.RequireCreditCardForATM,
})
end)
end
end
end, society)
end)
end)
end

CreateThread(function()
while QBCore.Functions.GetPlayerData().job == nil do
Wait(10)
end
PlayerData = QBCore.Functions.GetPlayerData()
end)

CreateThread(function()
if Config.ShowBankBlips then
Wait(2000)
for k,v in ipairs(Config.BankLocations)do
local blip = AddBlipForCoord(v.x, v.y, v.z)
SetBlipSprite(blip, v.blip)
SetBlipDisplay(blip, 4)
SetBlipScale(blip, v.blipScale)
SetBlipColour(blip, v.blipColor)
SetBlipAsShortRange(blip, true)
BeginTextCommandSetBlipName("STRING")
AddTextComponentString(v.blipText)
EndTextCommandSetBlipName(blip)
end
end
end)

if Config.UseTargetOnBank then
RegisterNetEvent("okokBanking:OpenBank")
AddEventHandler("okokBanking:OpenBank", function()
if isBankOpened then
SetNuiFocus(true, true)
end
SendNUIMessage({
action = 'loading_data'
})
Wait(500)
openBank()
end)

for k, v in ipairs(Config.BankLocations) do
local boxName = targetOptionsNames.bank .. k
if v.boxZone then
if Config.TargetSystem == 'qb-target' then
local zoneId = exports['qb-target']:AddBoxZone(boxName, v.boxZone.pos, v.boxZone.size.x, v.boxZone.size.y, {
name = boxName,
heading = v.boxZone.rotation,
debugPoly = Config.DebugTargetZones,
minZ = v.boxZone.pos.z ,
maxZ = v.boxZone.maxZ,
useZ = false,
}, {
options = {{
icon = 'fas fa-piggy-bank',
label = _L('open_banking_target').text,
canInteract = function(entity) return not isDead and not IsPedInAnyVehicle(PlayerPedId()) end,
action = function(entity) TriggerEvent('okokBanking:OpenBank') end
}},
distance = Config.TargetBankDistance,
})
elseif Config.TargetSystem == 'ox-target' then
local zoneId = exports.ox_target:addBoxZone({
coords = v.boxZone.pos,
size = vec3(v.boxZone.size.x, v.boxZone.size.y, v.boxZone.maxZ - v.boxZone.pos.z),
rotation = v.boxZone.rotation,
debug = Config.DebugTargetZones,
options = {
{
icon = 'fas fa-piggy-bank',
label = _L('open_banking_target').text,
canInteract = function(entity, distance, coords, name) return not isDead and not IsPedInAnyVehicle(PlayerPedId()) end,
onSelect = function(data) TriggerEvent('okokBanking:OpenBank') end
}
},
distance = Config.TargetBankDistance
})
end
table.insert(BankZonesId, zoneId)
end
end
else

local function NearBank()
local pos = GetEntityCoords(PlayerPedId())
for k, v in pairs(Config.BankLocations) do
local dist = #(vector3(v.x, v.y, v.z) - pos)
if dist <= v.BankDistance then
return true
elseif dist <= v.BankDistance + 5 then
return "update"
end
end
end

CreateThread(function()
local inRange = false
local shown = false
local notified = false

while true do
local playerped = PlayerPedId()
inRange = false
Wait(0)
if NearBank() and not isBankOpened and NearBank() ~= "update" then

inRange = true

if IsControlJustReleased(0, 38) then

if not isDead and not IsPedInAnyVehicle(playerped) then
if isBankOpened then
SetNuiFocus(true, true)
end
SendNUIMessage({
action = 'loading_data'
})
Wait(500)
openBank()
else
if not notified then
if Config.okokNotify then
exports['okokNotify']:Alert(_L('not_use_bank').title, _L('not_use_bank').text, _L('not_use_bank').time, _L('not_use_bank').type)
else
QBCore.Functions.Notify(_L('not_use_bank').text, _L('not_use_bank').type, _L('not_use_bank').time)
end
notified = true
end
end
end
elseif NearBank() == "update" then
Wait(300)
else
Wait(1000)
end

if inRange and not shown then
shown = true
if Config.okokTextUI then
exports['okokTextUI']:Open(_L('open_banking').text, _L('open_banking').color, _L('open_banking').side)
else
exports['qb-core']:DrawText(_L('open_banking').text, _L('open_banking').side)
end
elseif not inRange and shown then
shown = false
if Config.okokTextUI then
exports['okokTextUI']:Close()
else
exports['qb-core']:HideText()
end
end
notified = false
end
end)
end

if Config.UseTargetOnAtm then

for k, v in ipairs(Config.ATM) do AtmModels[#AtmModels + 1] = v.model end

RegisterNetEvent('okokBanking:TargetATM')
AddEventHandler('okokBanking:TargetATM', function()
local ped = PlayerPedId()
local dict = 'anim@amb@prop_human_atm@interior@male@enter'
local anim = 'enter'

if Config.RequireCreditCardForATM then
QBCore.Functions.TriggerCallback("okokBanking:HasCreditCard", function(hasItem)
if not hasItem then
if Config.okokNotify then
exports['okokNotify']:Alert(_L('no_creditcard').title, _L('no_creditcard').text, _L('no_creditcard').time, _L('no_creditcard').type)
else
QBCore.Functions.Notify(_L('no_creditcard').text, _L('no_creditcard').type, _L('no_creditcard').time)
end
return
else
QBCore.Functions.TriggerCallback("okokBanking:GetPIN", function(pin)
if pin then
if not isBankOpened then
isBankOpened = true
TriggerServerEvent('okokBanking:setMenuOpened', isBankOpened)
RequestAnimDict(dict)

while not HasAnimDictLoaded(dict) do
Wait(7)
end

TaskPlayAnim(ped, dict, anim, 8.0, 8.0, -1, 0, 0, 0, 0, 0)
Wait(Config.AnimTime * 1000)
ClearPedTasks(ped)

TriggerEvent("okokBanking:OpenATM", pin)
Wait(3000)
RemoveAnimDict(dict)
end
else
if Config.okokNotify then
exports['okokNotify']:Alert(_L('no_pin').title, _L('no_pin').text, _L('no_pin').time, _L('no_pin').type)
else
QBCore.Functions.Notify(_L('no_pin').text, _L('no_pin').type, _L('no_pin').time)
end
end
end)
end
end)
else
QBCore.Functions.TriggerCallback("okokBanking:GetPIN", function(pin)
if pin then
if not isBankOpened then
isBankOpened = true
TriggerServerEvent('okokBanking:setMenuOpened', isBankOpened)
RequestAnimDict(dict)

while not HasAnimDictLoaded(dict) do
Wait(7)
end

TaskPlayAnim(ped, dict, anim, 8.0, 8.0, -1, 0, 0, 0, 0, 0)
Wait(Config.AnimTime * 1000)
ClearPedTasks(ped)

TriggerEvent("okokBanking:OpenATM", pin)
Wait(3000)
RemoveAnimDict(dict)
end
else
if Config.okokNotify then
exports['okokNotify']:Alert(_L('no_pin').title, _L('no_pin').text, _L('no_pin').time, _L('no_pin').type)
else
QBCore.Functions.Notify(_L('no_pin').text, _L('no_pin').type, _L('no_pin').time)
end
end
end)
end
end)

local options= {{
name = targetOptionsNames.atm,
event = 'okokBanking:TargetATM',
icon = 'fas fa-piggy-bank',
label = _L('open_atm_target').text,
canInteract = function(entity)
return not isDead and not IsPedInAnyVehicle(PlayerPedId())
end
}}

if Config.TargetSystem == 'qb-target' then
exports['qb-target']:AddTargetModel(AtmModels, {
options = options,
distance = Config.ATMDistance
})
elseif Config.TargetSystem == 'ox-target' then
exports.ox_target:addModel(AtmModels, {
name = targetOptionsNames.atm,
event = 'okokBanking:TargetATM',
icon = 'fas fa-piggy-bank',
label = _L('open_atm_target').text,
distance = Config.ATMDistance,
canInteract = function(entity) return not isDead and not IsPedInAnyVehicle(PlayerPedId()) end
})
end
else

function NearATM()
local ped = PlayerPedId()
local pos = GetEntityCoords(ped)

for i = 1, #Config.ATM do
local atm = GetClosestObjectOfType(pos.x, pos.y, pos.z, Config.ATMDistance + 5, Config.ATM[i].model, false, false, false)
if DoesEntityExist(atm) then
if atm ~= closestATM then
closestATM = atm
atmPos = GetEntityCoords(atm)
end
local dist = #(pos - atmPos)

if dist <= Config.ATMDistance then
return true
elseif dist <= Config.ATMDistance + 5 then
return "update"
end
end
end
end

CreateThread(function()
local inRange = false
local shown = false
local notified = false

local dict = 'anim@amb@prop_human_atm@interior@male@enter'
local anim = 'enter'

while true do
local ped = PlayerPedId()
inRange = false
Wait(0)
if NearATM() and not isBankOpened and NearATM() ~= "update" then

inRange = true

if IsControlJustReleased(0, 38) then
if not isDead and not IsPedInAnyVehicle(ped) then
if Config.RequireCreditCardForATM then
QBCore.Functions.TriggerCallback("okokBanking:HasCreditCard", function(hasItem)
if not hasItem then
if Config.okokNotify then
exports['okokNotify']:Alert(_L('no_creditcard').title, _L('no_creditcard').text, _L('no_creditcard').time, _L('no_creditcard').type)
else
QBCore.Functions.Notify(_L('no_creditcard').text, _L('no_creditcard').type, _L('no_creditcard').time)
end
return
else
QBCore.Functions.TriggerCallback("okokBanking:GetPIN", function(pin)
if pin then
if not isBankOpened then
isBankOpened = true
TriggerServerEvent('okokBanking:setMenuOpened', isBankOpened)
RequestAnimDict(dict)

while not HasAnimDictLoaded(dict) do
Wait(7)
end

TaskPlayAnim(ped, dict, anim, 8.0, 8.0, -1, 0, 0, 0, 0, 0)
Wait(Config.AnimTime * 1000)
ClearPedTasks(ped)

TriggerEvent("okokBanking:OpenATM", pin)
Wait(3000)
RemoveAnimDict(dict)
end
else
if Config.okokNotify then
exports['okokNotify']:Alert(_L('no_pin').title, _L('no_pin').text, _L('no_pin').time, _L('no_pin').type)
else
QBCore.Functions.Notify(_L('no_pin').text, _L('no_pin').type, _L('no_pin').time)
end
end
end)
end
end)
else
QBCore.Functions.TriggerCallback("okokBanking:GetPIN", function(pin)
if pin then
if not isBankOpened then
isBankOpened = true
TriggerServerEvent('okokBanking:setMenuOpened', isBankOpened)
RequestAnimDict(dict)

while not HasAnimDictLoaded(dict) do
Wait(7)
end

TaskPlayAnim(ped, dict, anim, 8.0, 8.0, -1, 0, 0, 0, 0, 0)
Wait(Config.AnimTime * 1000)
ClearPedTasks(ped)

TriggerEvent("okokBanking:OpenATM", pin)
Wait(3000)
RemoveAnimDict(dict)
end
else
if Config.okokNotify then
exports['okokNotify']:Alert(_L('no_pin').title, _L('no_pin').text, _L('no_pin').time, _L('no_pin').type)
else
QBCore.Functions.Notify(_L('no_pin').text, _L('no_pin').type, _L('no_pin').time)
end
end
end)
end
else
if not notified then
if Config.okokNotify then
exports['okokNotify']:Alert(_L('not_use_bank').title, _L('not_use_bank').text, _L('not_use_bank').time, _L('not_use_bank').type)
else
QBCore.Functions.Notify(_L('not_use_bank').text, _L('not_use_bank').type, _L('not_use_bank').time)
end
notified = true
end
end
end
elseif NearATM() == "update" then
Wait(100)
else
Wait(1000)
end

if inRange and not shown then
shown = true
if Config.okokTextUI then
exports['okokTextUI']:Open(_L('open_atm').text, _L('open_atm').color, _L('open_atm').side)
else
exports['qb-core']:DrawText(_L('open_atm').text, _L('open_atm').side)
end
elseif not inRange and shown then
shown = false
if Config.okokTextUI then
exports['okokTextUI']:Close()
else
exports['qb-core']:HideText()
end
end
notified = false
end
end)
end

RegisterNetEvent("okokBanking:OpenATM")
AddEventHandler("okokBanking:OpenATM", function(pin)
if isBankOpened then
SetNuiFocus(true, true)
end
SendNUIMessage({
action = 'atm',
pin = pin,
UseSound = Config.UseOkOkBankingSounds,
})
end)

RegisterNUICallback("action", function(data, cb)
if data.action == "close" then
isBankOpened = false
TriggerServerEvent('okokBanking:setMenuOpened', isBankOpened)
SetNuiFocus(false, false)
elseif data.action == "deposit" then
if tonumber(data.value) ~= nil then
if tonumber(data.value) > 0 then
if data.window == 'bankmenu' then
TriggerServerEvent('okokBanking:DepositMoney', tonumber(data.value))
elseif data.window == 'societies' then
TriggerServerEvent('okokBanking:DepositMoneyToSociety', tonumber(data.value), societyInfo.society, societyInfo.society_name)
end
else
if Config.okokNotify then
exports['okokNotify']:Alert(_L('invalid_amount').title, _L('invalid_amount').text, _L('invalid_amount').time, _L('invalid_amount').type)
else
QBCore.Functions.Notify(_L('invalid_amount').text, _L('invalid_amount').type, _L('invalid_amount').time)
end
end
else
if Config.okokNotify then
exports['okokNotify']:Alert(_L('invalid_amount').title, _L('invalid_amount').text, _L('invalid_amount').time, _L('invalid_amount').type)
else
QBCore.Functions.Notify(_L('invalid_amount').text, _L('invalid_amount').type, _L('invalid_amount').time)
end
end
elseif data.action == "withdraw" then
if tonumber(data.value) ~= nil then
if tonumber(data.value) > 0 then
if data.window == 'bankmenu' then
TriggerServerEvent('okokBanking:WithdrawMoney', tonumber(data.value))
elseif data.window == 'societies' then
TriggerServerEvent('okokBanking:WithdrawMoneyToSociety', tonumber(data.value), societyInfo.society, societyInfo.society_name, societyInfo.value)
end
else
if Config.okokNotify then
exports['okokNotify']:Alert(_L('invalid_amount').title, _L('invalid_amount').text, _L('invalid_amount').time, _L('invalid_amount').type)
else
QBCore.Functions.Notify(_L('invalid_amount').text, _L('invalid_amount').type, _L('invalid_amount').time)
end
end
else
if Config.okokNotify then
exports['okokNotify']:Alert(_L('invalid_input').title, _L('invalid_input').text, _L('invalid_input').time, _L('invalid_input').type)
else
QBCore.Functions.Notify(_L('invalid_input').text, _L('invalid_input').type, _L('invalid_input').time)
end
end
elseif data.action == "transfer" then
if tonumber(data.value) ~= nil then
if tonumber(data.value) > 0 then
QBCore.Functions.TriggerCallback("okokBanking:IsIBanUsed", function(isUsed, isPlayer)
if isUsed ~= nil then
if isUsed.charinfo ~= nil then
if type(isUsed.charinfo) ~= "table" then
isUsed.charinfo = json.decode(isUsed.charinfo)
end
end
if data.window == 'bankmenu' then
if isPlayer then
TriggerServerEvent('okokBanking:TransferMoney', tonumber(data.value), data.iban:upper(), isUsed.citizenid, isUsed.money, isUsed.charinfo.firstname..' '..isUsed.charinfo.lastname)
elseif not isPlayer then
TriggerServerEvent('okokBanking:TransferMoneyToSociety', tonumber(data.value), isUsed.iban:upper(), isUsed.society_name, isUsed.society)
end
elseif data.window == 'societies' then
local toMyself = false
if data.iban:upper() == playerIBAN then
toMyself = true
end

if isPlayer then
TriggerServerEvent('okokBanking:TransferMoneyToPlayerFromSociety', tonumber(data.value), data.iban:upper(), isUsed.citizenid, isUsed.money, isUsed.charinfo.firstname..' '..isUsed.charinfo.lastname, societyInfo.society, societyInfo.society_name, societyInfo.value, toMyself)
elseif not isPlayer then
TriggerServerEvent('okokBanking:TransferMoneyToSocietyFromSociety', tonumber(data.value), isUsed.iban:upper(), isUsed.society_name, isUsed.society, societyInfo.society, societyInfo.society_name, societyInfo.value)
end
end
elseif isUsed == nil then
if Config.okokNotify then
exports['okokNotify']:Alert(_L('iban_not_exist').title, _L('iban_not_exist').text, _L('iban_not_exist').time, _L('iban_not_exist').type)
else
QBCore.Functions.Notify(_L('iban_not_exist').text, _L('iban_not_exist').type, _L('iban_not_exist').time)
end
end
end, data.iban:upper())
else
if Config.okokNotify then
exports['okokNotify']:Alert(_L('invalid_amount').title, _L('invalid_amount').text, _L('invalid_amount').time, _L('invalid_amount').type)
else
QBCore.Functions.Notify(_L('invalid_amount').text, _L('invalid_amount').type, _L('invalid_amount').time)
end
end
else
if Config.okokNotify then
exports['okokNotify']:Alert(_L('invalid_input').title, _L('invalid_input').text, _L('invalid_input').time, _L('invalid_input').type)
else
QBCore.Functions.Notify(_L('invalid_input').text, _L('invalid_input').type, _L('invalid_input').time)
end
end
elseif data.action == "overview_page" then
if isBankOpened then
SetNuiFocus(true, true)
end
SendNUIMessage({
action = 'overview_page',
playerBankMoney = playerBankMoney,
walletMoney = walletMoney,
playerIBAN = playerIBAN,
db = trans,
identifier = trsIdentifier,
graphDays = allDaysValues,
isInSociety = canAccessSociety,
RequireCC = Config.RequireCreditCardForATM,
})
elseif data.action == "transactions_page" then
if isBankOpened then
SetNuiFocus(true, true)
end
SendNUIMessage({
action = 'transactions_page',
db = trans,
identifier = trsIdentifier,
graph_values = allDaysValues,
isInSociety = canAccessSociety,
})
elseif data.action == "society_transactions" then
if isBankOpened then
SetNuiFocus(true, true)
end
SendNUIMessage({
action = 'society_transactions',
db = societyTrans,
identifier = societyIdent,
graph_values = societyDays,
isInSociety = canAccessSociety,
societyInfo = societyInfo,
})
elseif data.action == "society_page" then
if isBankOpened then
SetNuiFocus(true, true)
end
SendNUIMessage({
action = 'society_page',
playerBankMoney = playerBankMoney,
walletMoney = walletMoney,
playerIBAN = playerIBAN,
db = societyTrans,
identifier = societyIdent,
graphDays = societyDays,
isInSociety = canAccessSociety,
societyInfo = societyInfo,
})
elseif data.action == "settings_page" then
if isBankOpened then
SetNuiFocus(true, true)
end
SendNUIMessage({
action = 'settings_page',
isInSociety = canAccessSociety,
ibanCost = Config.IBANChangeCost,
ibanPrefix = Config.IBANPrefix,
ibanCharNum = Config.CustomIBANMaxChars,
pinCost = Config.PINChangeCost,
pinCharNum = 4,
})
elseif data.action == "atm" then
if isBankOpened then
SetNuiFocus(true, true)
end
SendNUIMessage({
action = 'loading_data',
})
Wait(500)
openBank()
elseif data.action == "change_iban" then
if Config.CustomIBANAllowLetters then
local iban = Config.IBANPrefix..data.iban:upper()
QBCore.Functions.TriggerCallback("okokBanking:IsIBanUsed", function(isUsed, isPlayer)

if isUsed == nil then
TriggerServerEvent('okokBanking:UpdateIbanDB', iban, Config.IBANChangeCost)
elseif isUsed ~= nil then
if Config.okokNotify then
exports['okokNotify']:Alert(_L('iban_in_use').title, _L('iban_in_use').text, _L('iban_in_use').time, _L('iban_in_use').type)
else
QBCore.Functions.Notify(_L('iban_in_use').text, _L('iban_in_use').type, _L('iban_in_use').time)
end
end
end, iban)
elseif not Config.CustomIBANAllowLetters then
if tonumber(data.iban) ~= nil then
local iban = Config.IBANPrefix..data.iban:upper()
QBCore.Functions.TriggerCallback("okokBanking:IsIBanUsed", function(isUsed, isPlayer)

if isUsed == nil then
TriggerServerEvent('okokBanking:UpdateIbanDB', iban, Config.IBANChangeCost)
elseif isUsed ~= nil then
if Config.okokNotify then
exports['okokNotify']:Alert(_L('iban_in_use').title, _L('iban_in_use').text, _L('iban_in_use').time, _L('iban_in_use').type)
else
QBCore.Functions.Notify(_L('iban_in_use').text, _L('iban_in_use').type, _L('iban_in_use').time)
end
end
end, iban)
else
if Config.okokNotify then
exports['okokNotify']:Alert(_L('iban_only_numbers').title, _L('iban_only_numbers').text, _L('iban_only_numbers').time, _L('iban_only_numbers').type)
else
QBCore.Functions.Notify(_L('iban_only_numbers').text, _L('iban_only_numbers').type, _L('iban_only_numbers').time)
end
end
end
elseif data.action == "change_pin" then
if tonumber(data.pin) ~= nil then
if string.len(data.pin) == 4 then
QBCore.Functions.TriggerCallback("okokBanking:GetPIN", function(pin)
if pin then
TriggerServerEvent('okokBanking:UpdatePINDB', data.pin, Config.PINChangeCost)
else
TriggerServerEvent('okokBanking:UpdatePINDB', data.pin, 0)
end
end)
else
if Config.okokNotify then
exports['okokNotify']:Alert(_L('pin_digits').title, _L('pin_digits').text, _L('pin_digits').time, _L('pin_digits').type)
else
QBCore.Functions.Notify(_L('pin_digits').text, _L('pin_digits').type, _L('pin_digits').time)
end
end
else
if Config.okokNotify then
exports['okokNotify']:Alert(_L('pin_only_numbers').title, _L('pin_only_numbers').text, _L('pin_only_numbers').time, _L('pin_only_numbers').type)
else
QBCore.Functions.Notify(_L('pin_only_numbers').text, _L('pin_only_numbers').type, _L('pin_only_numbers').time)
end
end
elseif data.action == "buy_new_cc" then
TriggerServerEvent('okokBanking:GiveCC')
end
cb('ok')
end)


RegisterNetEvent("okokBanking:updateTransactions")
AddEventHandler("okokBanking:updateTransactions", function(money, wallet)
Wait(100)
if isBankOpened then
QBCore.Functions.TriggerCallback("okokBanking:GetOverviewTransactions", function(cb, id, allDays)
trans = cb
allDaysValues = allDays
if isBankOpened then
SetNuiFocus(true, true)
end
SendNUIMessage({
action = 'overview_page',
playerBankMoney = playerBankMoney,
walletMoney = walletMoney,
playerIBAN = playerIBAN,
db = trans,
identifier = trsIdentifier,
graphDays = allDaysValues,
isInSociety = canAccessSociety,
isUpdate = true,
RequireCC = Config.RequireCreditCardForATM,
})
TriggerEvent('okokBanking:updateMoney', money, wallet)
end)
end
end)

RegisterNetEvent("okokBanking:updateMoney")
AddEventHandler("okokBanking:updateMoney", function(money, wallet)
if isBankOpened then
playerBankMoney = money
walletMoney = wallet
SendNUIMessage({
action = 'updatevalue',
playerBankMoney = money,
walletMoney = wallet,
})
end
end)

RegisterNetEvent("okokBanking:updateIban")
AddEventHandler("okokBanking:updateIban", function(iban)
playerIBAN = iban
SendNUIMessage({
action = 'updateiban',
iban = playerIBAN,
})
end)

RegisterNetEvent("okokBanking:updateIbanPinChange")
AddEventHandler("okokBanking:updateIbanPinChange", function()
Wait(100)
QBCore.Functions.TriggerCallback("okokBanking:GetOverviewTransactions", function(cbs, ids, allDays)
trans = cbs
end)
end)

RegisterNetEvent("okokBanking:updateTransactionsSociety")
AddEventHandler("okokBanking:updateTransactionsSociety", function(wallet)
Wait(100)
QBCore.Functions.TriggerCallback("okokBanking:SocietyInfo", function(cb)
QBCore.Functions.TriggerCallback("okokBanking:GetSocietyTransactions", function(societyTranscb, societyID, societyAllDays)
QBCore.Functions.TriggerCallback("okokBanking:GetOverviewTransactions", function(cbs, ids, allDays)
trans = cbs
walletMoney = wallet
societyDays = societyAllDays
societyIdent = societyID
societyTrans = societyTranscb
societyInfo = cb
if cb ~= nil then
if isBankOpened then
SetNuiFocus(true, true)
end
SendNUIMessage({
action = 'society_page',
walletMoney = wallet,
db = societyTrans,
graphDays = societyDays,
isInSociety = canAccessSociety,
societyInfo = societyInfo,
identifier = societyIdent,
isUpdate = true
})
end
end)
end, society)
end, society)
end)

View file

@ -1,163 +0,0 @@
Config, Locales = {}, {}

Config.Locale = 'de' -- en / pt / gr / fr / de

Config.okokNotify = true -- true = okokNotify | false = QBCore Notify

Config.okokTextUI = true -- true = okokTextUI | false = QBCore DrawText

Config.UseOkOkBankingSounds = false -- true = Uses Sounds | false = No sounds

Config.UseTargetOnAtm = false -- Using qb-target and not TextUI to access to the atms

Config.UseTargetOnBank = false -- Using qb-target and not TextUI to access to the bank

Config.TargetSystem = 'qb-target' -- qb-target | ox-target

Config.TargetBankDistance = 1.5 -- Distance to target a bank from qb-target ( To change the distance to ATM check line 61)

Config.DebugTargetZones = false -- Set to true only if you need to check the position of a zone

Config.UseCashAsItem = false -- Set to true if you have cash as item on qb-core

Config.IBANPrefix = "OK" -- IBAN prefix

Config.IBANNumbers = 6 -- How many characters the IBAN has by default

Config.CustomIBANMaxChars = 10 -- How many characters the IBAN can have when changing it to a custom one (on Settings tab)

Config.CustomIBANAllowLetters = true -- If the custom IBAN can have letters or only numbers (on Settings tab)

Config.IBANChangeCost = 5000 -- How much it costs to change the IBAN to a custom one (on Settings tab)

Config.PINChangeCost = 1000 -- How much it costs to change the PIN (on Settings tab)

Config.AnimTime = 2 -- Seconds (ATM animation)

Config.UseQBManagement = false -- If true it will use the management_funds table | If false the okokbanking_societies table

Config.UseQBBanking = true -- Useful for latest QBCore versions

Config.RequireCreditCardForATM = true -- Set to true if you would like players to access the ATM with a card item | If false there is no item requirement

Config.CreditCardItem = "creditcard" -- Required item to access the ATM

Config.CreditCardPrice = 100 -- How much it costs to purchase a credit card

Config.CharInfoUpdate = true -- If you have an error on server console saying 'bad argument #1 to decode ( string expected, got nil )' set this to true

Config.Societies = { -- Which societies have bank accounts
"police",
"ambulance",
"cinema",
"fussion",
"kayas",
"sud",
"taxi",
"ammu",
"marshal";
"cute"





}

-- Add this new section below the Societies section
Config.JobBossRanks = {
["police"] = {
maxRank = true, -- Automatically use the highest rank
specificRanks = {7, 8, 9} -- Or specify exact ranks that have boss access
},
["ambulance"] = {
maxRank = true,
specificRanks = {}
},
["cinema"] = {
maxRank = false, -- Will automatically detect the highest rank
specificRanks = {1} -- Or you can specify ranks like {3, 4} if needed
},
["kayas"] = {
maxRank = false,
specificRanks = {0}
},
["fussion"] = {
maxRank = false, -- Will automatically detect the highest rank
specificRanks = {4} -- Or you can specify ranks like {3, 4} if needed
},
["sud"] = {
maxRank = false, -- Will automatically detect the highest rank
specificRanks = {0} -- Or you can specify ranks like {3, 4} if needed
},
["taxi"] = {
maxRank = true, -- Will automatically detect the highest rank
specificRanks = {} -- Or you can specify ranks like {3, 4} if needed
},
["ammu"] = {
maxRank = false, -- Will automatically detect the highest rank
specificRanks = {0} -- Or you can specify ranks like {3, 4} if needed
},
["marshal"] = {
maxRank = true, -- Will automatically detect the highest rank
specificRanks = {0} -- Or you can specify ranks like {3, 4} if needed
},
["cute"] = {
maxRank = true, -- Will automatically detect the highest rank
specificRanks = {0} -- Or you can specify ranks like {3, 4} if needed
},
-- Add other jobs as needed
}


Config.ShowBankBlips = true -- True = show bank blips on the map | false = don't show blips

Config.BankLocations = { -- To get blips and colors check this: https://wiki.gtanet.work/index.php?title=Blips
{blip = 108, blipColor = 2, blipScale = 0.9, x = 150.266, y = -1040.203, z = 29.374, blipText = "Bank", BankDistance = 3, boxZone = {pos = vec3(149.07, -1041.02, 29.55), size = vec3(2.85, 0.30, 1.30), rotation = 70, maxZ = 30.9}},
{blip = 108, blipColor = 2, blipScale = 0.9, x = -1212.980, y = -330.841, z = 37.787, blipText = "Bank", BankDistance = 3, boxZone = {pos = vec3(-1212.98, -331.53, 38.0), size = vec3(2.85, 0.40, 1.30), rotation = 117, maxZ = 39.25}},
{blip = 108, blipColor = 2, blipScale = 0.9, x = -2962.582, y = 482.627, z = 15.703, blipText = "Bank", BankDistance = 3, boxZone = {pos = vec3(-2962.00, 482.20, 15.92), size = vec3(2.85, 0.40, 1.30), rotation = 178, maxZ = 17.1}},
{blip = 108, blipColor = 2, blipScale = 0.9, x = -112.202, y = 6469.295, z = 31.626, blipText = "Bank", BankDistance = 3, boxZone = {pos = vec3(-111.69, 6469.5, 31.83), size = vec3(4.2, 0.40, 1.25), rotation = 45, maxZ = 33.15}},
{blip = 108, blipColor = 2, blipScale = 0.9, x = 314.187, y = -278.621, z = 54.170, blipText = "Bank", BankDistance = 3, boxZone = {pos = vec3(313.26, -279.38, 54.35), size = vec3(2.85, 0.40, 1.30), rotation = 250, maxZ = 55.7}},
{blip = 108, blipColor = 2, blipScale = 0.9, x = -351.534, y = -49.529, z = 49.042, blipText = "Bank", BankDistance = 3, boxZone = {pos = vec3(-351.81, -50.2, 49.24), size = vec3(2.85, 0.30, 1.30), rotation = 250, maxZ = 50.5}},
{blip = 108, blipColor = 3, blipScale = 1.2, x = 253.38, y = 220.79, z = 106.29, blipText = "Bank", BankDistance = 3, boxZone = {pos = vec3(252.8, 221.9, 106.20), size = vec3(3.6, 0.20, 1.70), rotation = 250, maxZ = 107.6}},
{blip = 108, blipColor = 2, blipScale = 0.9, x = 1175.064, y = 2706.643, z = 38.094, blipText = "Bank", BankDistance = 3, boxZone = {pos = vec3(1175.72, 2707.36, 38.30), size = vec3(2.85, 0.40, 1.30), rotation = 270, maxZ = 39.5}},
}

Config.ATMDistance = 1.5 -- How close you need to be in order to access the ATM

Config.ATM = { -- ATM models, do not remove any
{model = -870868698},
{model = -1126237515},
{model = -1364697528},
{model = 506770882}
}

-------------------------- DISCORD LOGS

-- To set your Discord Webhook URL go to server.lua, line 2

Config.BotName = 'ServerName' -- Write the desired bot name

Config.ServerName = 'ServerName' -- Write your server's name

Config.IconURL = '' -- Insert your desired image link

Config.DateFormat = '%d/%m/%Y [%X]' -- To change the date format check this website - https://www.lua.org/pil/22.1.html

-- To change a webhook color you need to set the decimal value of a color, you can use this website to do that - https://www.mathsisfun.com/hexadecimal-decimal-colors.html

Config.TransferWebhookColor = '16127'

Config.WithdrawWebhookColor = '16127'

Config.DepositWebhookColor = '16127'

-------------------------- LOCALES (DON'T TOUCH)

function _L(id)
if Locales[Config.Locale][id] then
return Locales[Config.Locale][id]
else
print("Locale '"..id.."' doesn't exist")
end
end

View file

@ -1,44 +0,0 @@
fx_version 'cerulean'

game 'gta5'

author 'okok#3488'
description 'okokBanking'
version '1.1.2'

ui_page 'web/ui.html'

files {
'web/*.*',
'web/img/*.*'
}

shared_scripts {
'config.lua',
'locales/*.lua'
}

client_scripts {
'client.lua'
}

server_scripts {
'@oxmysql/lib/MySQL.lua',
'server.lua'
}

lua54 'yes'

escrow_ignore {
'config.lua',
'server.lua',
'client.lua',
'locales/*.lua'
}

server_exports {
'AddMoney',
'RemoveMoney',
'GetAccount',
}
dependency '/assetpacks'

View file

@ -1,221 +0,0 @@
Locales['de'] = {

-- PIN BEZOGEN LOCALES

['no_pin'] = {
title = 'BANKING',
text = 'Gehen Sie zuerst zu einer Bank, um einen PIN-Code festzulegen',
time = 5000,
type = 'error'
},

['pin_changed'] = {
title = 'BANKING',
text = 'PIN erfolgreich geändert in ${s1}',
time = 5000,
type = 'success'
},

['pin_no_money'] = {
title = 'BANKING',
text = 'Sie benötigen ${s1}$, um Ihre PIN zu ändern',
time = 5000,
type = 'error'
},

['pin_digits'] = {
title = 'BANKING',
text = 'Ihre PIN muss 4 Ziffern lang sein',
time = 5000,
type = 'error'
},

['pin_only_numbers'] = {
title = 'BANKING',
text = 'Sie können nur Zahlen verwenden',
time = 5000,
type = 'error'
},


-- IBAN BEZOGEN LOCALES

['iban_not_exist'] = {
title = 'BANKING',
text = 'Diese IBAN existiert nicht',
time = 5000,
type = 'error'
},

['iban_in_use'] = {
title = 'BANKING',
text = 'Diese IBAN wird bereits verwendet',
time = 5000,
type = 'error'
},

['iban_only_numbers'] = {
title = 'BANKING',
text = 'Sie können in Ihrer IBAN nur Zahlen verwenden',
time = 5000,
type = 'error'
},

['iban_changed'] = {
title = 'BANKING',
text = 'IBAN erfolgreich in ${s1} geändert',
time = 5000,
type = 'success'
},

['iban_no_money'] = {
title = 'BANKING',
text = 'Sie benötigen ${s1}$, um Ihre IBAN zu ändern',
time = 5000,
type = 'error'
},


-- ZURÜCKGEZOGEN / EINGEZAHLT / ÜBERTRAGEN / ERHALTEN

['deposited'] = {
title = 'BANKING',
text = 'Sie haben eingezahlt ${s1}$',
time = 5000,
type = 'success'
},

['withdrawn'] = {
title = 'BANKING',
text = 'Sie haben sich zurückgezogen ${s1}$',
time = 5000,
type = 'success'
},

['received_from'] = {
title = 'BANKING',
text = 'Sie erhielten ${s1}$ aus ${s2}',
time = 5000,
type = 'success'
},

['transferred_to'] = {
title = 'BANKING',
text = 'Sie haben überwiesen ${s1}$ an ${s2}',
time = 5000,
type = 'success'
},

['deposited_to'] = {
title = 'BANKING',
text = 'Sie haben eingezahlt ${s1}$ an ${s2}',
time = 5000,
type = 'success'
},

['someone_withdrawing'] = {
title = 'BANKING',
text = 'Jemand zieht sich bereits zurück',
time = 5000,
type = 'error'
},

['you_have_withdrawn'] = {
title = 'BANKING',
text = 'Sie haben sich zurückgezogen ${s1}$ aus ${s2}',
time = 5000,
type = 'success'
},


-- ALLGEMEINES LOCALES

['no_creditcard'] = {
title = 'BANKING',
text = 'Ohne Kreditkarte ist der Zugang zum Geldautomaten nicht möglich',
time = 5000,
type = 'error'
},

['invalid_amount'] = {
title = 'BANKING',
text = 'Ungültige Menge',
time = 5000,
type = 'error'
},

['invalid_input'] = {
title = 'BANKING',
text = 'Ungültige Eingang',
time = 5000,
type = 'error'
},

['no_money_pocket'] = {
title = 'BANKING',
text = 'Du hast nicht so viel Geld bei dir',
time = 5000,
type = 'error'
},

['no_money_bank'] = {
title = 'BANKING',
text = 'Du hast nicht so viel Geld auf der Bank',
time = 5000,
type = 'error'
},

['not_send_yourself'] = {
title = 'BANKING',
text = 'Sie können kein Geld an sich selbst senden',
time = 5000,
type = 'error'
},

['society_no_money'] = {
title = 'BANKING',
text = 'Ihre Gesellschaft hat nicht so viel Geld auf der Bank',
time = 5000,
type = 'error'
},

['not_use_bank'] = {
title = 'BANKING',
text = 'Sie können die Bank derzeit nicht verwenden',
time = 5000,
type = 'error'
},

['bought_cc'] = {
title = 'BANKING',
text = 'Sie haben eine Kreditkarte für ${s1}$ gekauft',
time = 5000,
type = 'success'
},


-- TEXTUI LOCALES

['open_banking'] = {
text = '[E] Bank betreten',
color = 'darkblue',
side = 'left'
},

['open_atm'] = {
text = '[E] Geldautomaten nutzen',
color = 'darkblue',
side = 'left'
},

-- QB-TARGET LOCALES

['open_banking_target'] = {
text = 'Bank betreten',
},

['open_atm_target'] = {
text = 'Geldautomaten nutzen',
},

}

View file

@ -1,221 +0,0 @@
Locales['en'] = {

-- PIN RELATED LOCALES

['no_pin'] = {
title = 'BANKING',
text = 'Head up to a bank first to set a PIN code',
time = 5000,
type = 'error'
},

['pin_changed'] = {
title = 'BANKING',
text = 'PIN successfully changed to ${s1}',
time = 5000,
type = 'success'
},

['pin_no_money'] = {
title = 'BANKING',
text = 'You need to have ${s1}€ in order to change your PIN',
time = 5000,
type = 'error'
},

['pin_digits'] = {
title = 'BANKING',
text = 'Your PIN needs to be 4 digits long',
time = 5000,
type = 'error'
},

['pin_only_numbers'] = {
title = 'BANKING',
text = 'You can only use numbers',
time = 5000,
type = 'error'
},


-- IBAN RELATED LOCALES

['iban_not_exist'] = {
title = 'BANKING',
text = 'This IBAN does not exist',
time = 5000,
type = 'error'
},

['iban_in_use'] = {
title = 'BANKING',
text = 'This IBAN is already in use',
time = 5000,
type = 'error'
},

['iban_only_numbers'] = {
title = 'BANKING',
text = 'You can only use numbers in your IBAN',
time = 5000,
type = 'error'
},

['iban_changed'] = {
title = 'BANKING',
text = 'IBAN successfully changed to ${s1}',
time = 5000,
type = 'success'
},

['iban_no_money'] = {
title = 'BANKING',
text = 'You need to have ${s1}€ in order to change your IBAN',
time = 5000,
type = 'error'
},


-- WITHDRAWN / DEPOSITED / TRANSFERRED / RECEIVED

['deposited'] = {
title = 'BANKING',
text = 'You have deposited ${s1}€',
time = 5000,
type = 'success'
},

['withdrawn'] = {
title = 'BANKING',
text = 'You have withdrawn ${s1}€',
time = 5000,
type = 'success'
},

['received_from'] = {
title = 'BANKING',
text = 'You have received ${s1}€ from ${s2}',
time = 5000,
type = 'success'
},

['transferred_to'] = {
title = 'BANKING',
text = 'You have transferred ${s1}€ to ${s2}',
time = 5000,
type = 'success'
},

['deposited_to'] = {
title = 'BANKING',
text = 'You have deposited ${s1}€ to ${s2}',
time = 5000,
type = 'success'
},

['someone_withdrawing'] = {
title = 'BANKING',
text = 'Someone is already withdrawing',
time = 5000,
type = 'error'
},

['you_have_withdrawn'] = {
title = 'BANKING',
text = 'You have withdrawn ${s1}€ from ${s2}',
time = 5000,
type = 'success'
},


-- GENERAL LOCALES

['no_creditcard'] = {
title = 'BANKING',
text = 'You can not access the ATM without a credit card',
time = 5000,
type = 'error'
},

['invalid_amount'] = {
title = 'BANKING',
text = 'Invalid amount',
time = 5000,
type = 'error'
},

['invalid_input'] = {
title = 'BANKING',
text = 'Invalid input',
time = 5000,
type = 'error'
},

['no_money_pocket'] = {
title = 'BANKING',
text = 'You don\'t have that much money on you',
time = 5000,
type = 'error'
},

['no_money_bank'] = {
title = 'BANKING',
text = 'You don\'t have that much money in the bank',
time = 5000,
type = 'error'
},

['not_send_yourself'] = {
title = 'BANKING',
text = 'You can\'t send money to yourself',
time = 5000,
type = 'error'
},

['society_no_money'] = {
title = 'BANKING',
text = 'Your society doesn\'t have that much money in the bank',
time = 5000,
type = 'error'
},

['not_use_bank'] = {
title = 'BANKING',
text = 'You can\'t use the bank at this moment',
time = 5000,
type = 'error'
},

['bought_cc'] = {
title = 'BANKING',
text = 'You bought a credit card for ${s1}€',
time = 5000,
type = 'success'
},


-- TEXTUI LOCALES

['open_banking'] = {
text = '[E] Access Bank',
color = 'darkblue',
side = 'left'
},

['open_atm'] = {
text = '[E] Access ATM',
color = 'darkblue',
side = 'left'
},


-- QB-TARGET LOCALES

['open_banking_target'] = {
text = 'Access Bank',
},

['open_atm_target'] = {
text = 'Access ATM',
},
}

View file

@ -1,221 +0,0 @@
Locales['es'] = {

-- PIN RELATED LOCALES

['no_pin'] = {
title = 'BANKING',
text = 'Diríjase primero a un banco para establecer un código PIN',
time = 5000,
type = 'error'
},

['pin_changed'] = {
title = 'BANKING',
text = 'El PIN se ha cambiado con éxito a ${s1}',
time = 5000,
type = 'success'
},

['pin_no_money'] = {
title = 'BANKING',
text = 'Es necesario tener ${s1}€ para cambiar su PIN',
time = 5000,
type = 'error'
},

['pin_digits'] = {
title = 'BANKING',
text = 'Su PIN debe tener 4 dígitos',
time = 5000,
type = 'error'
},

['pin_only_numbers'] = {
title = 'BANKING',
text = 'Sólo se pueden utilizar números',
time = 5000,
type = 'error'
},


-- IBAN RELATED LOCALES

['iban_not_exist'] = {
title = 'BANKING',
text = 'Este IBAN no existe',
time = 5000,
type = 'error'
},

['iban_in_use'] = {
title = 'BANKING',
text = 'Este IBAN ya está en uso',
time = 5000,
type = 'error'
},

['iban_only_numbers'] = {
title = 'BANKING',
text = 'Sólo puede utilizar números en su IBAN',
time = 5000,
type = 'error'
},

['iban_changed'] = {
title = 'BANKING',
text = 'El IBAN ha sido cambiado con éxito a ${s1}',
time = 5000,
type = 'success'
},

['iban_no_money'] = {
title = 'BANKING',
text = 'Es necesario tener ${s1}€ para cambiar su IBAN',
time = 5000,
type = 'error'
},


-- WITHDRAWN / DEPOSITED / TRANSFERRED / RECEIVED

['deposited'] = {
title = 'BANKING',
text = 'Has depositado ${s1}€',
time = 5000,
type = 'success'
},

['withdrawn'] = {
title = 'BANKING',
text = 'Has retirado ${s1}€',
time = 5000,
type = 'success'
},

['received_from'] = {
title = 'BANKING',
text = 'Has recibido ${s1}€ de ${s2}',
time = 5000,
type = 'success'
},

['transferred_to'] = {
title = 'BANKING',
text = 'Has transferido ${s1}€ a ${s2}',
time = 5000,
type = 'success'
},

['deposited_to'] = {
title = 'BANKING',
text = 'Has depositado ${s1}€ a ${s2}',
time = 5000,
type = 'success'
},

['someone_withdrawing'] = {
title = 'BANKING',
text = 'Alguien ya se está retirando dinero',
time = 5000,
type = 'error'
},

['you_have_withdrawn'] = {
title = 'BANKING',
text = 'Has retirado ${s1}€ de ${s2}',
time = 5000,
type = 'success'
},


-- GENERAL LOCALES

['no_creditcard'] = {
title = 'BANKING',
text = 'No puedes acceder al cajero automático sin una tarjeta de crédito',
time = 5000,
type = 'error'
},

['invalid_amount'] = {
title = 'BANKING',
text = 'Cantidad no válida',
time = 5000,
type = 'error'
},

['invalid_input'] = {
title = 'BANKING',
text = 'Entrada no válida',
time = 5000,
type = 'error'
},

['no_money_pocket'] = {
title = 'BANKING',
text = 'No tienes tanto dinero encima',
time = 5000,
type = 'error'
},

['no_money_bank'] = {
title = 'BANKING',
text = 'No tienes tanto dinero en el banco',
time = 5000,
type = 'error'
},

['not_send_yourself'] = {
title = 'BANKING',
text = 'No puedes enviarte dinero a ti mismo',
time = 5000,
type = 'error'
},

['society_no_money'] = {
title = 'BANKING',
text = 'Su sociedad no tiene tanto dinero en el banco',
time = 5000,
type = 'error'
},

['not_use_bank'] = {
title = 'BANKING',
text = 'No puedes acceder al banco en este momento',
time = 5000,
type = 'error'
},

['bought_cc'] = {
title = 'BANKING',
text = 'Has comprado una tarjeta de crédito por ${s1}€',
time = 5000,
type = 'success'
},


-- TEXTUI LOCALES

['open_banking'] = {
text = '[E] Acceder al banco',
color = 'darkblue',
side = 'left'
},

['open_atm'] = {
text = '[E] Acceder al ATM',
color = 'darkblue',
side = 'left'
},

-- QB-TARGET LOCALES

['open_banking_target'] = {
text = 'Acceder al banco',
},

['open_atm_target'] = {
text = 'Acceder al ATM',
},

}

View file

@ -1,221 +0,0 @@
Locales['fr'] = {

-- LOCALES LIÉS AU PIN

['no_pin'] = {
title = 'BANKING',
text = 'Rendez-vous d\'abord dans une banque pour définir un code PIN',
time = 5000,
type = 'error'
},

['pin_changed'] = {
title = 'BANKING',
text = 'Le code PIN a été remplacé par ${s1}',
time = 5000,
type = 'success'
},

['pin_no_money'] = {
title = 'BANKING',
text = 'Vous devez disposer de ${s1}€ pour modifier votre code PIN',
time = 5000,
type = 'error'
},

['pin_digits'] = {
title = 'BANKING',
text = 'Votre code PIN doit comporter 4 chiffres',
time = 5000,
type = 'error'
},

['pin_only_numbers'] = {
title = 'BANKING',
text = 'Vous ne pouvez utiliser que des chiffres',
time = 5000,
type = 'error'
},


-- LOCALES LIÉES À L'IBAN

['iban_not_exist'] = {
title = 'BANKING',
text = 'Cet IBAN n\'existe pas',
time = 5000,
type = 'error'
},

['iban_in_use'] = {
title = 'BANKING',
text = 'Cet IBAN est déjà utilisé',
time = 5000,
type = 'error'
},

['iban_only_numbers'] = {
title = 'BANKING',
text = 'Vous ne pouvez utiliser que des chiffres dans votre IBAN',
time = 5000,
type = 'error'
},

['iban_changed'] = {
title = 'BANKING',
text = 'IBAN changé avec succès en ${s1}',
time = 5000,
type = 'success'
},

['iban_no_money'] = {
title = 'BANKING',
text = 'Vous devez avoir ${s1}€ pour changer votre IBAN',
time = 5000,
type = 'error'
},


-- RETIRÉ / DÉPOSÉ / TRANSFÉRÉ / REÇU

['deposited'] = {
title = 'BANKING',
text = 'Vous avez déposé ${s1}€',
time = 5000,
type = 'success'
},

['withdrawn'] = {
title = 'BANKING',
text = 'Vous avez retiré ${s1}€',
time = 5000,
type = 'success'
},

['received_from'] = {
title = 'BANKING',
text = 'Vous avez reçu ${s1}€ de ${s2}',
time = 5000,
type = 'success'
},

['transferred_to'] = {
title = 'BANKING',
text = 'Vous avez transféré ${s1}€ de ${s2}',
time = 5000,
type = 'success'
},

['deposited_to'] = {
title = 'BANKING',
text = 'Vous avez déposé ${s1}€ de ${s2}',
time = 5000,
type = 'success'
},

['someone_withdrawing'] = {
title = 'BANKING',
text = 'Quelqu\'un se retire déjà',
time = 5000,
type = 'error'
},

['you_have_withdrawn'] = {
title = 'BANKING',
text = 'Vous avez retiré ${s1}€ depuis ${s2}',
time = 5000,
type = 'success'
},


-- LOCALES GÉNÉRAUX

['no_creditcard'] = {
title = 'BANKING',
text = 'Vous ne pouvez pas accéder au guichet automatique sans carte de crédit',
time = 5000,
type = 'error'
},

['invalid_amount'] = {
title = 'BANKING',
text = 'Montant invalide',
time = 5000,
type = 'error'
},

['invalid_input'] = {
title = 'BANKING',
text = 'Entrée invalide',
time = 5000,
type = 'error'
},

['no_money_pocket'] = {
title = 'BANKING',
text = 'Vous n\'avez pas beaucoup d\'argent sur vous',
time = 5000,
type = 'error'
},

['no_money_bank'] = {
title = 'BANKING',
text = 'Vous n\'avez pas beaucoup d\'argent à la banque',
time = 5000,
type = 'error'
},

['not_send_yourself'] = {
title = 'BANKING',
text = 'Vous ne pouvez pas vous envoyer d\'argent',
time = 5000,
type = 'error'
},

['society_no_money'] = {
title = 'BANKING',
text = 'Votre société n\'a pas autant d\'argent à la banque',
time = 5000,
type = 'error'
},

['not_use_bank'] = {
title = 'BANKING',
text = 'Vous ne pouvez pas utiliser la banque pour le moment',
time = 5000,
type = 'error'
},

['bought_cc'] = {
title = 'BANKING',
text = 'Vous avez acheté une carte de crédit pour ${s1}€',
time = 5000,
type = 'success'
},


-- TEXTUI LOCALES

['open_banking'] = {
text = '[E] Accéder à la banque',
color = 'darkblue',
side = 'left'
},

['open_atm'] = {
text = '[E] Accéder au ATM',
color = 'darkblue',
side = 'left'
},

-- QB-TARGET LOCALES

['open_banking_target'] = {
text = 'Accéder à la banque',
},

['open_atm_target'] = {
text = 'Accéder au ATM',
},

}

View file

@ -1,221 +0,0 @@
Locales['gr'] = {

-- ΣΧΕΤΙΚΟ ΤΟ PIN ΜΕΤΑΦΡΑΣΕΙΣ

['no_pin'] = {
title = 'BANKING',
text = 'Απευθυνθείτε πρώτα σε μια τράπεζα για να ορίσετε έναν κωδικό PIN',
time = 5000,
type = 'error'
},

['pin_changed'] = {
title = 'BANKING',
text = 'Το PIN άλλαξε με επιτυχία σε ${s1}',
time = 5000,
type = 'success'
},

['pin_no_money'] = {
title = 'BANKING',
text = 'Πρέπει να έχετε ${s1}€ για να αλλάξετε το PIN σας',
time = 5000,
type = 'error'
},

['pin_digits'] = {
title = 'BANKING',
text = 'Το PIN σας πρέπει να αποτελείται από 4 ψηφία',
time = 5000,
type = 'error'
},

['pin_only_numbers'] = {
title = 'BANKING',
text = 'Μπορείτε να χρησιμοποιήσετε μόνο αριθμούς',
time = 5000,
type = 'error'
},


-- ΣΧΕΤΙΚΟ IBAN ΜΕΤΑΦΡΑΣΕΙΣ

['iban_not_exist'] = {
title = 'BANKING',
text = 'Αυτό το IBAN δεν υπάρχει',
time = 5000,
type = 'error'
},

['iban_in_use'] = {
title = 'BANKING',
text = 'Αυτό το IBAN χρησιμοποιείται ήδη',
time = 5000,
type = 'error'
},

['iban_only_numbers'] = {
title = 'BANKING',
text = 'Μπορείτε να χρησιμοποιήσετε μόνο αριθμούς στον IBAN σας',
time = 5000,
type = 'error'
},

['iban_changed'] = {
title = 'BANKING',
text = 'Το IBAN άλλαξε με επιτυχία σε ${s1}',
time = 5000,
type = 'success'
},

['iban_no_money'] = {
title = 'BANKING',
text = 'Πρέπει να έχετε ${s1}€ για να αλλάξετε τον IBAN σας',
time = 5000,
type = 'error'
},


-- ΑΝΑΛΗΨΗ / ΚΑΤΑΘΕΣΗ / ΜΕΤΑΒΙΒΑΣΗ / ΛΗΨΗ

['deposited'] = {
title = 'BANKING',
text = 'Έχετε καταθέσει ${s1}€',
time = 5000,
type = 'success'
},

['withdrawn'] = {
title = 'BANKING',
text = 'Έχετε αποσυρθεί ${s1}€',
time = 5000,
type = 'success'
},

['received_from'] = {
title = 'BANKING',
text = 'Έχετε λάβει ${s1}€ από ${s2}',
time = 5000,
type = 'success'
},

['transferred_to'] = {
title = 'BANKING',
text = 'Έχετε μεταφέρει ${s1}€ στο ${s2}',
time = 5000,
type = 'success'
},

['deposited_to'] = {
title = 'BANKING',
text = 'Έχετε καταθέσει ${s1}€ στο ${s2}',
time = 5000,
type = 'success'
},

['someone_withdrawing'] = {
title = 'BANKING',
text = 'Κάποιος ήδη αποσύρεται',
time = 5000,
type = 'error'
},

['you_have_withdrawn'] = {
title = 'BANKING',
text = 'Έχετε κάνει ανάληψη ${s1}€ από ${s2}',
time = 5000,
type = 'success'
},


-- ΓΕΝΙΚΕΣ ΜΕΤΑΦΡΑΣΕΙΣ

['no_creditcard'] = {
title = 'BANKING',
text = 'Δεν μπορείτε να έχετε πρόσβαση στο ΑΤΜ χωρίς πιστωτική κάρτα.',
time = 5000,
type = 'error'
},

['invalid_amount'] = {
title = 'BANKING',
text = 'Μη έγκυρο ποσό',
time = 5000,
type = 'error'
},

['invalid_input'] = {
title = 'BANKING',
text = 'Μη έγκυρη εισαγωγή',
time = 5000,
type = 'error'
},

['no_money_pocket'] = {
title = 'BANKING',
text = 'Δεν έχεις τόσα χρήματα πάνω σου',
time = 5000,
type = 'error'
},

['no_money_bank'] = {
title = 'BANKING',
text = 'Δεν έχεις τόσα χρήματα στην τράπεζα',
time = 5000,
type = 'error'
},

['not_send_yourself'] = {
title = 'BANKING',
text = 'Δεν μπορείτε να στείλετε χρήματα στον εαυτό σας',
time = 5000,
type = 'error'
},

['society_no_money'] = {
title = 'BANKING',
text = 'Η κοινωνία σας δεν έχει τόσα χρήματα στην τράπεζα',
time = 5000,
type = 'error'
},

['not_use_bank'] = {
title = 'BANKING',
text = 'Δεν μπορείτε να χρησιμοποιήσετε την τράπεζα αυτή τη στιγμή',
time = 5000,
type = 'error'
},

['bought_cc'] = {
title = 'BANKING',
text = 'Αγοράσατε μια πιστωτική κάρτα για ${s1}€',
time = 5000,
type = 'success'
},


-- TEXTUI ΜΕΤΑΦΡΑΣΕΙΣ

['open_banking'] = {
text = '[E] Να ανοίξω την τράπεζα',
color = 'darkblue',
side = 'left'
},

['open_atm'] = {
text = '[E] Aνοίξτε το ΑΤΜ',
color = 'darkblue',
side = 'left'
},

-- QB-TARGET ΜΕΤΑΦΡΑΣΕΙΣ

['open_banking_target'] = {
text = 'Να ανοίξω την τράπεζα',
},

['open_atm_target'] = {
text = 'Aνοίξτε το ΑΤΜ',
},

}

View file

@ -1,221 +0,0 @@
Locales['pt'] = {

-- PIN

['no_pin'] = {
title = 'BANCO',
text = 'Desloca-te a um banco para definires um código PIN',
time = 5000,
type = 'error'
},

['pin_changed'] = {
title = 'BANCO',
text = 'Código PIN alterado com sucesso para ${s1}',
time = 5000,
type = 'success'
},

['pin_no_money'] = {
title = 'BANCO',
text = 'Necessitas de ${s1}€ para alterar o teu código PIN',
time = 5000,
type = 'error'
},

['pin_digits'] = {
title = 'BANCO',
text = 'O código PIN deve ter 4 dígitos',
time = 5000,
type = 'error'
},

['pin_only_numbers'] = {
title = 'BANCO',
text = 'Apenas podes usar números',
time = 5000,
type = 'error'
},


-- IBAN

['iban_not_exist'] = {
title = 'BANCO',
text = 'Este IBAN não existe',
time = 5000,
type = 'error'
},

['iban_in_use'] = {
title = 'BANCO',
text = 'Este IBAN já se encontra em uso',
time = 5000,
type = 'error'
},

['iban_only_numbers'] = {
title = 'BANCO',
text = 'Apenas podes usar números no IBAN',
time = 5000,
type = 'error'
},

['iban_changed'] = {
title = 'BANCO',
text = 'IBAN alterado com sucesso para ${s1}',
time = 5000,
type = 'success'
},

['iban_no_money'] = {
title = 'BANCO',
text = 'Necessitas de ${s1}€ para alterar o teu IBAN',
time = 5000,
type = 'error'
},


-- LEVANTAMENTO / DEPÓSITO / TRANSFERÊNCIA / RECEBIDO

['deposited'] = {
title = 'BANCO',
text = 'Depositaste ${s1}€',
time = 5000,
type = 'success'
},

['withdrawn'] = {
title = 'BANCO',
text = 'Levantaste ${s1}€',
time = 5000,
type = 'success'
},

['received_from'] = {
title = 'BANCO',
text = 'Recebeste ${s1}€ de ${s2}',
time = 5000,
type = 'success'
},

['transferred_to'] = {
title = 'BANCO',
text = 'Transferiste ${s1}€ para ${s2}',
time = 5000,
type = 'success'
},

['deposited_to'] = {
title = 'BANCO',
text = 'Depositaste ${s1}€ para ${s2}',
time = 5000,
type = 'success'
},

['someone_withdrawing'] = {
title = 'BANCO',
text = 'Alguém já está a levantar dinheiro',
time = 5000,
type = 'error'
},

['you_have_withdrawn'] = {
title = 'BANCO',
text = 'Levantaste ${s1}€ de ${s2}',
time = 5000,
type = 'success'
},


-- GERAL

['no_creditcard'] = {
title = 'BANCO',
text = 'Não podes aceder ao multibanco sem um cartão de crédito',
time = 5000,
type = 'error'
},

['invalid_amount'] = {
title = 'BANCO',
text = 'Valor inválido',
time = 5000,
type = 'error'
},

['invalid_input'] = {
title = 'BANCO',
text = 'Input inválido',
time = 5000,
type = 'error'
},

['no_money_pocket'] = {
title = 'BANCO',
text = 'Não tens dinheiro suficiente na mão',
time = 5000,
type = 'error'
},

['no_money_bank'] = {
title = 'BANCO',
text = 'Não tens dinheiro suficiente no banco',
time = 5000,
type = 'error'
},

['not_send_yourself'] = {
title = 'BANCO',
text = 'Não podes transferir dinheiro para ti próprio',
time = 5000,
type = 'error'
},

['society_no_money'] = {
title = 'BANCO',
text = 'A tua organização não tem dinheiro suficiente no banco',
time = 5000,
type = 'error'
},

['not_use_bank'] = {
title = 'BANCO',
text = 'Não podes usar o banco neste momento',
time = 5000,
type = 'error'
},

['bought_cc'] = {
title = 'BANCO',
text = 'Compraste um cartão de crédito por ${s1}€',
time = 5000,
type = 'success'
},


-- TEXTUI

['open_banking'] = {
text = '[E] Aceder ao Banco',
color = 'darkblue',
side = 'left'
},

['open_atm'] = {
text = '[E] Aceder à ATM',
color = 'darkblue',
side = 'left'
},

-- QB-TARGET LOCALES

['open_banking_target'] = {
text = 'Aceder ao Banco',
},

['open_atm_target'] = {
text = 'Aceder à ATM',
},

}

View file

@ -1,22 +0,0 @@
CREATE TABLE `okokbanking_transactions` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`receiver_identifier` varchar(255) NOT NULL,
`receiver_name` varchar(255) NOT NULL,
`sender_identifier` varchar(255) NOT NULL,
`sender_name` varchar(255) NOT NULL,
`date` varchar(255) NOT NULL,
`value` int(50) NOT NULL,
`type` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
);

CREATE TABLE `okokbanking_societies` (
`society` varchar(255) NULL DEFAULT NULL,
`society_name` varchar(255) NULL DEFAULT NULL,
`value` int(50) NULL DEFAULT NULL,
`iban` varchar(255) NOT NULL,
`is_withdrawing` int(1) NULL DEFAULT NULL
);

ALTER TABLE `players` ADD COLUMN `pincode` int(50) NULL DEFAULT NULL;
ALTER TABLE `management_funds` ADD COLUMN `iban` varchar(255) DEFAULT NULL;

File diff suppressed because it is too large Load diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 1.9 KiB

File diff suppressed because it is too large Load diff

View file

@ -1,882 +0,0 @@
@import url("https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/bootstrap-icons.css");
@import url('https://fonts.googleapis.com/css2?family=Tajawal:wght@200;300;400;500;700;800;900&display=swap');

*,*:focus,*:hover{
outline:none;
}

html {
font-size: calc(16 / 19.2 * 1vw);
}

@media (min-aspect-ratio: 16 / 9) {
html {
font-size: calc(16 / 10.8 * 1vh);
}
}

body {
font-family: 'Tajawal', sans-serif;
background: none;
user-select: none;
}

.card {
border: none;
}

.card-body {
flex: none;
}

.main_card {
width: 62.5rem;
border-radius: 1.25rem;
background-color: #202128;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
border: none;
display: none;
box-shadow: 0rem 0rem 0.313rem 0rem rgba(10, 10, 10, 0.3);
}

.main_card-body {
background-color: transparent;
color: #d5d6da;
font-size: 0.9375rem;
font-weight: 500;
vertical-align: middle;
font-weight: 600;
height: 45rem;
}

.creditcard-classic_card {
border-radius: 0.9375rem;
width: 15.5rem;
height: 10.5625rem;
background: url('img/classic.png');
border: none;
margin: 0 auto;
margin-bottom: 1rem;
background-size: 100%;
}

.creditcard-classic_card-body {
background-color: transparent;
}

.logo {
max-width: 9.5rem;
max-height: 2.64rem;
}

hr {
color: #3e3f4b;
opacity: 1;
height: 0.00625rem;
}

hr:not([size]) {
height: 0.00625rem;
opacity: 1;
}

.dataTable-table > thead > tr > th {
border-bottom: none;
}

.dataTable-wrapper.no-footer .dataTable-container {
border-bottom: none;
}

.dataTable-top, .dataTable-bottom {
padding: 0 0;
}

thead {
display: none;
}

tr {
background-color: #2e2f36;
margin-bottom: 0.625rem;
font-size: 1.25rem;
transition: .25s;
}

tr:hover {
background-color: #292a31;
transition: .25s;
}


td:first-child {
border-top-left-radius: 0.625rem;
border-bottom-left-radius: 0.625rem;
}

td:last-child {
border-top-right-radius: 0.625rem;
border-bottom-right-radius: 0.625rem;
}

.dataTable-table {
border-collapse:separate;
border-spacing: 0rem 0.4375rem;
}

.sidebar-item {
color: #8f9094;
font-size: 1rem;
padding: 0.625rem;
border-radius: 0.625rem;
font-weight: 500;
transition: 0.4s;
width: 9.5rem;
margin-bottom: 0.75rem;
}

.sidebar-item:hover {
background-color: #1f5eff;
cursor: pointer;
transition: 0.25s;
color: #fff;
}

.sidebar-title {
color: #8d8d8d;
font-size: 0.875rem;
font-weight: 600;
}

.selected {
color: #fff;
background-color: #1f5eff;
font-weight: 600;
}

.bi-credit-card:hover {
fill: red;
}

.selected-page {
color: #fff;
font-size: 1.75rem;
margin-left: 0.9375rem;
}

.username {
color: #fff;
font-weight: 500;
font-size: 1.125rem;
}

.avatar {
border-radius: 50%;
width: 2.5rem;
margin-left: 0.625rem;
}

.fa-wifi {
transform: rotate(90deg);
color: #fff;
font-size: 0.875rem;
}

.btn {
font-weight: 500;
font-size: 1.125rem;
padding: 0.8125rem 1.0625rem;
border: none;
border-radius: 0.125rem;
transition: 0.25s;
letter-spacing: 0.0125rem;
}

.btn:focus {
box-shadow: none;
}

.btn-blue {
background-color: #1f5eff;
color: #e6e6e6;
}

.btn.btn-blue:hover {
background-color: #0a4df9;
color: #e6e6e6;
}

.modal-content {
background-color: transparent;
border: none;
}

.modal-body {
background-color: #292a31;
border-radius: 0.625rem;
color: #fff;
}

.form-control {
border: none;
background-color: #1d1e24;
height: 5rem;
font-size: 1.875rem;
border-radius: 0.625rem;
color: #fff;
}

.form-control:focus {
box-shadow: none;
border: none;
background-color: #1d1e24;
box-shadow: 0rem 0rem 0.3125rem 0.0625rem #1f5eff !important;
color: #fff;
}

input::-webkit-outer-spin-button,
input::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}

.viewall-badge {
background-color: #1f5eff !important;
transition: 0.25s;
}

.viewall-badge:hover {
background-color: #0a4df9 !important;
transition: 0.25s;
cursor: pointer;
}

.close-button {
color: #c7c7c9;
position: absolute;
right: 1.25rem;
top: 0.9rem;
transition: .25s;
font-size: 1.6rem;
line-height: 1;
}

.close-button:hover {
color: #fff;
transition: .25s;
cursor: pointer;
}

.dataTable-input {
background-color: #2e2f36;
border: none;
border-radius: 0.625rem;
color: #fff;
padding: 0.375rem 0.75rem;
font-size: 1.3rem;
}

.dataTable-pagination .active a, .dataTable-pagination .active a:focus, .dataTable-pagination .active a:hover {
background-color: #1f5eff;
cursor: pointer;
transition: .25s;
}

.dataTable-pagination a {
border-radius: 0.313rem;
color: #fff;
background-color: #2e2f36;
transition: .25s;
padding: 0.375rem 0.75rem;
margin-left: 0.125rem;
}

.dataTable-pagination a:hover {
background-color: #292a31;
transition: .25s;
}

.dataTable-pagination {
position: fixed;
right: 1rem;
bottom: 1rem;
}

.dataTable-bottom {
padding: 0rem 0rem;
font-size: 1.125rem;
}

.dataTable-top > nav:last-child, .dataTable-top > div:last-child, .dataTable-bottom > nav:last-child, .dataTable-bottom > div:last-child {
float: none;
}

.dataTable-top {
float: right;
}

#new_iban {
text-transform: uppercase;
}

::-webkit-input-placeholder {
text-transform: none;
}

.atm_card {
width: 20rem;
border-radius: 1.25rem;
background-color: #202128;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
border: none;
display: none;
box-shadow: 0rem 0rem 0.313rem 0rem rgba(10, 10, 10, 0.3);
}

.atm_card-body {
background-color: transparent;
color: #8f9094;
font-size: 0.9375rem;
font-weight: 500;
vertical-align: middle;
font-weight: 600;
}

.dots {
width: 50%;
justify-content: space-around;
padding: 1em;
padding-top: 2em;
}

.dot {
position: relative;
background: rgba(143, 144, 148, 0.5);
border-radius: 50%;
width: 1.6em;
height: 1.6em;
transform: scale3d(0.6, 0.6, 0.6);
}

.dot.active {
-webkit-animation: growDot 0.5s ease;
animation: growDot 0.5s ease;
-webkit-animation-fill-mode: forwards;
animation-fill-mode: forwards;
}

.dot.wrong {
-webkit-animation: wrong 0.9s ease;
animation: wrong 0.9s ease;
}

.dot.correct {
-webkit-animation: correct 0.9s ease;
animation: correct 0.9s ease;
}

.dot.clear {
-webkit-animation: clear 0.9s ease;
animation: clear 0.9s ease;
}

.numbers {
display: flex;
flex-flow: row wrap;
align-items: center;
justify-content: space-around;
align-content: flex-end;
margin: 0em 0;
}

.number {
position: relative;
width: 2.5em;
height: 2.5em;
margin: 0.5em;
text-align: center;
line-height: 2.5em;
font-weight: 400;
font-size: 1.8em;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
transition: all 0.5s ease;
border-radius: 0.625rem;
border: 0.125rem solid #1f5eff;
}
.number:hover {
background-color: #1f5eff;
color: #fff;
border-radius: 0.625rem;
cursor: pointer;
}

.number:before {
content: "";
position: absolute;
left: -0.125rem;
width: 2.5em;
height: 2.5em;
transition: all 0.5s ease;
}
.number.grow {
-webkit-animation: grow 0.6s ease;
animation: grow 0.6s ease;
}

@keyframes growDot {
100% {
background: white;
transform: scale3d(0.85, 0.85, 0.85);
}
}

@keyframes grow {
50% {
transform: scale3d(1.1, 1.1, 1.1);
}
100% {
transform: scale3d(1, 1, 1);
}
}

@keyframes wrong {
20% {
background: #ff0000;
transform: scale3d(0.85, 0.85, 0.85);
left: 0;
}
40% {
left: -0.3125rem;
}
60% {
left: 0.625rem;
}
80% {
left: -0.3125rem;
}
}

@keyframes correct {
20% {
background: #1ebc62;
transform: scale3d(0.85, 0.85, 0.85);
top: 0;
}
40% {
top: -0.3125rem;
}
60% {
top: 0.625rem;
}
80% {
top: -0.3125rem;
}
}

@keyframes clear {
20% {
background: #1f5eff;
transform: scale3d(0.85, 0.85, 0.85);
left: 0;
}
}

.load {
position: relative;
width: 9.375rem;
height: 9.375rem;
border-radius: 50%;
border: 0.625rem solid transparent;
border-top: 0.625rem solid #1f5eff;
border-bottom: 0.625rem solid #1f5eff;
animation: rotateAntiCW 1.8s linear infinite;
}

.load::after {
content: '';
position: absolute;
width: 8.125rem;
height: 8.125rem;
border-radius: 50%;
border: 0.625rem solid transparent;
border-left: 0.625rem solid #fff;
border-right: 0.625rem solid #fff;
animation: rotate 1s linear infinite;
}

@keyframes rotate {
0%{transform: rotate(0deg);}
100%{transform: rotate(-360deg);}
}

@keyframes rotateAntiCW {
0%{transform: rotate(0deg);}
100%{transform: rotate(360deg);}
}

input[type=password]:not(:placeholder-shown) {
font-family: Verdana, sans-serif;
font-size: 2.5rem;
}

.dataTable-table > tbody > tr > td, .dataTable-table > tbody > tr > th, .dataTable-table > tfoot > tr > td, .dataTable-table > tfoot > tr > th, .dataTable-table > thead > tr > td, .dataTable-table > thead > tr > th {
vertical-align: top;
padding: 0.5rem 0.625rem;
}

.card-header:first-child {
border-radius: calc(0.25rem - 0.0625rem) calc(0.25rem - 0.0625rem) 0 0;
}

.card-header {
border-bottom: none;
}

#myChart {
margin-top: 0!important;
margin-top: 0.3125rem;
width: 100%;
}

.dataTable-info {
display: none;
}

#last-t-body .dataTable-bottom .dataTable-pagination {
margin-top: 0;
}

.sidebar-s {
border-right: 0.0625rem solid rgba(62, 63, 75);
width: 11.0625rem;
}

.tab-s {
width: 82%;
display: flex;
flex-direction: column;
padding-right: calc(var(--bs-gutter-x) * .45);
}

.wallet-div {
font-size: 0.875rem;
margin-top: -0.75rem;
font-weight: 500;
position: absolute;
right: 7.1%;
}

.chart-main {
border-right: 0.0625rem solid rgba(62, 63, 75);
}

.chart-card, .settings-card {
background-color: transparent;
border-radius: 0.625rem;
box-shadow: 0rem 0rem 0.313rem 0rem rgba(10, 10, 10, 0.50);
}

.card-o-header {
background-color: #292a31;
border-top-right-radius: 0.625rem !important;
border-top-left-radius: 0.625rem !important;
}

.card-o-title {
color: #fff;
font-size: 1.125rem;
}

.chart-card-body {
background-color: #1d1e24;
border-bottom-left-radius: 0.625rem;
border-bottom-right-radius: 0.625rem;
padding: 0.6rem 1rem 0.5rem 1rem;
}

.chart-div {
height: 13.107rem;
min-height: 13.107rem;
}

.last-t-card, .actions-card, .settings2-card {
background-color: transparent;
border-radius: 0.625rem;
box-shadow: 0rem 0rem 0.313rem 0rem rgba(10, 10, 10, 0.50);
margin-top: 0.75rem;
}

#view_all_transactions, #view_all_transactions_society, .buy_new_card {
position: absolute;
font-size: 0.875rem;
right: 0.5625rem;
top: 0.625rem;
}

#last-t-body {
background-color: #1d1e24;
border-bottom-left-radius: 0.625rem;
border-bottom-right-radius: 0.625rem;
padding: 0.6rem 1rem;
padding: 0.51rem 1rem 0.6rem 1rem;
height: 18.05rem;
}

#text_atm {
font-size: 1.125rem;
}

#depositMoney, #withdrawMoney, #transferMoney, .buyccbtn {
border-radius: 0.625rem;
flex-basis: 100%;
margin-top: 1.125rem;
}

#transfer_iban {
margin-top: 1.125rem;
text-transform: uppercase;
}

.w25 {
width: 25rem;
}

.w20p {
width: 20%;
}

.modal-t {
font-weight: 600;
font-size: 1.875rem;
}

.ccard-card {
background-color: transparent;
border-radius: 0.625rem;
box-shadow: 0rem 0rem 0.313rem 0rem rgba(10, 10, 10, 0.50);
}

.ccard-body {
background-color: #1d1e24;
border-bottom-left-radius: 0.625rem;
border-bottom-right-radius: 0.625rem;
font-size: 1rem;
height: 19.4375rem;
}

.ccard-name {
color: #fff;
font-size: 0.75rem;
margin-left: 0.3125rem;
font-weight: 500;
}

.mt38p {
margin-top: 38%;
}

.ccard-status {
font-weight: 500;
color: #fff;
line-height: 1;
}

.ccard-active {
color: #fff;
font-size: 1.5rem;
color: #fff;
line-height: 1;
text-shadow: 0rem 0rem 0.125rem rgba(255, 255, 255, 0.5);
}

.ccard-valid {
width: 1.5625rem;
line-height: 1;
margin-right: 2.125rem;
}

.ccard-thru {
color: #fff;
font-size: 0.5rem;
font-weight: 500;
margin-right: 0.1875rem;
}

.ccard-exp {
color: #fff;
font-weight: 500;
font-size: 1rem;
}

.ccard-fs {
font-size: 1.28rem;
}

.fff {
color: #fff;
}

.actions-card_body, .settings-card_body {
background-color: #1d1e24;
border-bottom-left-radius: 0.625rem;
border-bottom-right-radius: 0.625rem;
}

#depositMoneyModal, #withdrawMoneyModal, #transferMoneyModal {
border-radius: 0.625rem;
flex-basis: 100%;
}

.mt4375 {
margin-top: 0.4375rem;
}

.lastT-action, .transactions-action {
background-color: #1d1e24;
padding: 0.3125rem 0.625rem 0.3125rem 0.625rem;
border-radius: 0.625rem;
}

.lastT-name-div {
font-weight: 500;
font-size: 1rem;
}

.lastT-name, .transactions-name {
color: #1f5eff;
text-transform: capitalize;
font-weight: 600;
}

.mtm3125 {
margin-top: -0.3125rem;
}

.fw500 {
font-weight: 500;
}

.lastT-received, .transactions-received {
color: #2ecc71;
}

.fs1125 {
font-size: 1.125rem;
}

.fs1875 {
font-size: 1.875rem;
}

.settings-col {
flex: 1 1 50%;
}

.changeiban-card, .changepin-card {
background-color: #292a31;
border-radius: 0.625rem;
color: #fff;
}

.fs15 {
font-size: 1.5rem;
}

#new_iban {
margin-top: 0.75rem;
width: 100%;
}

#change_iban {
border-radius: 0.625rem;
flex-basis: 100%;
margin-top: 0.75rem;
width: 100%;
font-size: 1.17rem;
}

.settings_info-card {
background-color: #1f5eff;
border-radius: 0.625rem;
color: #fff;
}

#new_pin {
margin-top: 0.75rem;
width: 100%;
}

#change_pin {
border-radius: 0.625rem;
flex-basis: 100%;
margin-top: 0.75rem;
width: 100%;
font-size: 1.17rem;
}

.pr05 {
padding-right: 0.5rem;
}

.pl05 {
padding-left: 0.5rem;
}

.stats-title {
background-color: #1f5eff;
border-radius: 0.625rem;
color: #fff;
}

.card-title {
font-weight: 600;
font-size: 1.25rem;
}

.fw125 {
font-size: 1.25rem;
}

.transactions-name-div {
font-weight: 500;
}

.ldata-txt {
font-size: 2.5rem;
color: #fff;
}

.floatr {
float: right;
}

.btn-dark {
background-color: #1d1e24;
}

.btn-dark:hover {
background-color: #1b1c22;
}

.modal-buycc {
width: 35rem;
}

#transactionsTable {
max-width: 100.1%;
width: 100.1%;
border-spacing: 0rem 0.5rem;
}

#transactionsData tr {
height: 4.55rem;
}

View file

@ -1,129 +0,0 @@
<!DOCTYPE html>
<html>
<meta charset="UTF-8">
<head>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<link href="https://cdn.jsdelivr.net/npm/simple-datatables@5.0/dist/style.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
<link href="styles.css" rel="stylesheet">
</head>

<body>
<div class="card main_card">
<div class="card-body main_card-body">
<div class="row h-100" id="menu"></div>
</div>
</div>

<div class="card atm_card">
<div class="card-body atm_card-body d-flex justify-content-center align-items-center flex-column">
<span class="close-button close-atm"><i class="fas fa-times"></i></span>
<div class="text-center">
<img src="img/logo.png" class="logo">
</div>
<div class="dots d-flex">
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
<div class="dot"></div>
</div>
<span id="text_atm">Enter your account's PIN code</span>
<div class="numbers">
<div class="row">
<div class="number">1</div>
<div class="number">2</div>
<div class="number">3</div>
</div>
<div class="row">
<div class="number">4</div>
<div class="number">5</div>
<div class="number">6</div>
</div>
<div class="row">
<div class="number">7</div>
<div class="number">8</div>
<div class="number">9</div>
</div>
<div class="row">
<div class="number">C</div>
<div class="number">0</div>
<div class="number">OK</div>
</div>
</div>
</div>
</div>

<!-- Deposit Modal -->
<div class="modal fade" id="depositModal" tabindex="-1">
<div class="modal-dialog modal-dialog-centered w25">
<div class="modal-content myinvoices_modal-content">
<div class="modal-body p-4 text-center">
<span class="modal-t">Deposit Money</span>
<span class="close-button" data-bs-dismiss="modal"><i class="fas fa-times"></i></span>
<div class="d-flex justify-content-center flex-column mt-3">
<input type="number" id="deposit_value" class="form-control flex-grow-1 text-center" placeholder="Amount" onkeyup="checkIfEmpty()">
<button type="button" id="depositMoney" class="btn btn-blue flex-grow-1 fs1875" data-bs-toggle="modal" data-bs-target="#depositModal" disabled><i class="bi bi-upload"></i> DEPOSIT</button>
</div>
</div>
</div>
</div>
</div>

<!-- Withdraw Modal -->
<div class="modal fade" id="withdrawModal" tabindex="-1">
<div class="modal-dialog modal-dialog-centered w25">
<div class="modal-content myinvoices_modal-content">
<div class="modal-body p-4 text-center">
<span class="modal-t">Withdraw Money</span>
<span class="close-button" data-bs-dismiss="modal"><i class="fas fa-times"></i></span>
<div class="d-flex justify-content-center flex-column mt-3">
<input type="number" id="withdraw_value" class="form-control flex-grow-1 text-center" placeholder="Amount" onkeyup="checkIfEmpty()">
<button type="button" id="withdrawMoney" class="btn btn-blue flex-grow-1 fs1875" data-bs-toggle="modal" data-bs-target="#withdrawModal" disabled><i class="bi bi-download"></i> WITHDRAW</button>
</div>
</div>
</div>
</div>
</div>

<!-- Transfer Modal -->
<div class="modal fade" id="transferModal" tabindex="-1">
<div class="modal-dialog modal-dialog-centered w25">
<div class="modal-content myinvoices_modal-content">
<div class="modal-body p-4 text-center">
<span class="modal-t">Transfer Money</span>
<span class="close-button" data-bs-dismiss="modal"><i class="fas fa-times"></i></span>
<div class="d-flex justify-content-center flex-column mt-3">
<input type="number" id="transfer_value" class="form-control flex-grow-1 text-center" placeholder="Amount" onkeyup="checkIfEmpty()">
<input type="text" id="transfer_iban" class="form-control flex-grow-1 text-center" placeholder="IBAN" onkeyup="checkIfEmpty()">
<button type="button" id="transferMoney" class="btn btn-blue flex-grow-1 fs1875" data-bs-toggle="modal" data-bs-target="#transferModal" disabled><i class="fas fa-exchange-alt"></i> TRANSFER</button>
</div>
</div>
</div>
</div>
</div>

<!-- Buy CC -->
<div class="modal fade" id="buycc_modal" tabindex="-1">
<div class="modal-dialog modal-lg modal-dialog-centered modal-buycc">
<div class="modal-content myinvoices_modal-content">
<div class="modal-body p-4 text-center">
<span class="modal-t">Are you sure?</span>
<hr>
<span class="close-button" data-bs-dismiss="modal"><i class="fas fa-times"></i></span>
<div class="text-center modal-t fw500">Do you want to buy a new Credit Card?</div>
<div class="d-flex justify-content-center align-items-center mt-2">
<button type="button" class="btn btn-dark w-50 me-2 buyccbtn fs1875" data-bs-dismiss="modal"><i class="fas fa-times"></i> CANCEL</button>
<button type="button" id="buy_new_cc" class="btn btn-blue w-50 ms-2 buyccbtn fs1875" data-bs-dismiss="modal"><i class="fas fa-shopping-cart"></i> BUY</button>
</div>
</div>
</div>
</div>
</div>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script src="https://cdn.jsdelivr.net/npm/simple-datatables@5.0" crossorigin="anonymous"></script>
<script src="scripts.js" type="text/javascript"></script>
</body>
</html>