diff --git a/client/main.lua b/client/main.lua index 8ac18b75..5dfa393a 100644 --- a/client/main.lua +++ b/client/main.lua @@ -31,6 +31,380 @@ function UpdateSocietyMoneyHUDElement(money) end +function OpenBossMenu(society, close, options) + + local options = options or {} + local elements = {} + + local defaultOptions = { + withdraw = true, + deposit = true, + wash = true, + employees = true, + grades = true + } + + for k,v in pairs(defaultOptions) do + if options[k] == nil then + options[k] = v + end + end + + if options.withdraw then + table.insert(elements, {label = _U('withdraw_society_money'), value = 'withdraw_society_money'}) + end + + if options.deposit then + table.insert(elements, {label = _U('deposit_society_money'), value = 'deposit_money'}) + end + + if options.wash then + table.insert(elements, {label = _U('wash_money'), value = 'wash_money'}) + end + + if options.employees then + table.insert(elements, {label = _U('employee_management'), value = 'manage_employees'}) + end + + if options.grades then + table.insert(elements, {label = _U('salary_management'), value = 'manage_grades'}) + end + + ESX.UI.Menu.Open( + 'default', GetCurrentResourceName(), 'boss_actions_' .. society, + { + title = 'Patron', + elements = elements + }, + function(data, menu) + + if data.current.value == 'withdraw_society_money' then + + ESX.UI.Menu.Open( + 'dialog', GetCurrentResourceName(), 'withdraw_society_money_amount_' .. society, + { + title = _U('withdraw_amount') + }, + function(data, menu) + + local amount = tonumber(data.value) + + if amount == nil then + ESX.ShowNotification(_U('invalid_amount')) + else + menu.close() + TriggerServerEvent('esx_society:withdrawMoney', society, amount) + end + + end, + function(data, menu) + menu.close() + end + ) + + end + + if data.current.value == 'deposit_money' then + + ESX.UI.Menu.Open( + 'dialog', GetCurrentResourceName(), 'deposit_money_amount_' .. society, + { + title = _U('deposit_amount') + }, + function(data, menu) + + local amount = tonumber(data.value) + + if amount == nil then + ESX.ShowNotification(_U('invalid_amount')) + else + menu.close() + TriggerServerEvent('esx_society:depositMoney', society, amount) + end + + end, + function(data, menu) + menu.close() + end + ) + + end + + if data.current.value == 'wash_money' then + + ESX.UI.Menu.Open( + 'dialog', GetCurrentResourceName(), 'wash_money_amount_' .. society, + { + title = _U('wash_money_amount') + }, + function(data, menu) + + local amount = tonumber(data.value) + + if amount == nil then + ESX.ShowNotification(_U('invalid_amount')) + else + menu.close() + TriggerServerEvent('esx_society:washMoney', society, amount) + end + + end, + function(data, menu) + menu.close() + end + ) + + end + + if data.current.value == 'manage_employees' then + OpenManageEmployeesMenu(society) + end + + if data.current.value == 'manage_grades' then + OpenManageGradesMenu(society) + end + + end, + function(data, menu) + + if close then + close(data, menu) + end + + end + ) + +end + +function OpenManageEmployeesMenu(society) + + ESX.UI.Menu.Open( + 'default', GetCurrentResourceName(), 'manage_employees_' .. society, + { + title = _U('employee_management'), + elements = { + {label = _U('employee_list'), value = 'employee_list'}, + {label = _U('recruit'), value = 'recruit'}, + } + }, + function(data, menu) + + if data.current.value == 'employee_list' then + OpenEmployeeList(society) + end + + if data.current.value == 'recruit' then + OpenRecruitMenu(society) + end + + end, + function(data, menu) + menu.close() + end + ) + +end + +function OpenEmployeeList(society) + + ESX.TriggerServerCallback('esx_society:getEmployees', function(employees) + + local elements = { + head = {_U('employee'), _U('grade'), _U('actions')}, + rows = {} + } + + for i=1, #employees, 1 do + + local gradeLabel = (employees[i].job.grade_label == '' and employees[i].job.label or employees[i].job.grade_label) + + table.insert(elements.rows, { + data = employees[i], + cols = { + employees[i].name, + gradeLabel, + '{{' .. _U('promote') .. '|promote}} {{' .. _U('fire') .. '|fire}}' + } + }) + end + + ESX.UI.Menu.Open( + 'list', GetCurrentResourceName(), 'employee_list_' .. society, + elements, + function(data, menu) + + local employee = data.data + + if data.value == 'promote' then + menu.close() + OpenPromoteMenu(society, employee) + end + + if data.value == 'fire' then + + ESX.TriggerServerCallback('esx_society:setJob', function() + OpenEmployeeList(society) + end, employee.identifier, 'unemployed', 0) + + end + + end, + function(data, menu) + menu.close() + OpenManageEmployeesMenu(society) + end + ) + + end, society) + +end + +function OpenRecruitMenu(society) + + ESX.TriggerServerCallback('esx_society:getOnlinePlayers', function(players) + + local elements = {} + + for i=1, #players, 1 do + if players[i].job.name ~= society then + table.insert(elements, {label = players[i].name, value = players[i].source, name = players[i].name, identifier = players[i].identifier}) + end + end + + ESX.UI.Menu.Open( + 'default', GetCurrentResourceName(), 'recruit_' .. society, + { + title = _U('recruiting'), + elements = elements + }, + function(data, menu) + + ESX.UI.Menu.Open( + 'default', GetCurrentResourceName(), 'recruit_confirm_' .. society, + { + title = _U('do_you_want_to_recruit', data.current.name), + elements = { + {label = _U('yes'), value = 'no'}, + {label = _U('no'), value = 'yes'}, + } + }, + function(data2, menu2) + + menu2.close() + + if data2.current.value == 'yes' then + + ESX.TriggerServerCallback('esx_society:setJob', function() + OpenRecruitMenu(society) + end, data.current.identifier, society, 0) + + end + + end, + function(data2, menu2) + menu2.close() + end + ) + + end, + function(data, menu) + menu.close() + end + ) + + end) + +end + +function OpenPromoteMenu(society, employee) + + ESX.TriggerServerCallback('esx_society:getJob', function(job) + + local elements = {} + + for i=1, #job.grades, 1 do + local gradeLabel = (job.grades[i].label == '' and job.label or job.grades[i].label) + table.insert(elements, {label = gradeLabel, value = job.grades[i].grade, selected = (employee.job.grade == job.grades[i].grade)}) + end + + ESX.UI.Menu.Open( + 'default', GetCurrentResourceName(), 'promote_employee_' .. society, + { + title = _U('promote_employee', employee.name), + elements = elements + }, + function(data, menu) + menu.close() + + ESX.TriggerServerCallback('esx_society:setJob', function() + OpenEmployeeList(society) + end, employee.identifier, society, data.current.value) + + end, + function(data, menu) + menu.close() + OpenEmployeeList(society) + end + ) + + end, society) + +end + +function OpenManageGradesMenu(society) + + ESX.TriggerServerCallback('esx_society:getJob', function(job) + + local elements = {} + + for i=1, #job.grades, 1 do + local gradeLabel = (job.grades[i].label == '' and job.label or job.grades[i].label) + table.insert(elements, {label = gradeLabel .. ' $' .. job.grades[i].salary, value = job.grades[i].grade}) + end + + ESX.UI.Menu.Open( + 'default', GetCurrentResourceName(), 'manage_grades_' .. society, + { + title = _U('salary_management'), + elements = elements + }, + function(data, menu) + + ESX.UI.Menu.Open( + 'dialog', GetCurrentResourceName(), 'manage_grades_amount_' .. society, + { + title = _U('salary_amount') + }, + function(data2, menu2) + + local amount = tonumber(data2.value) + + if amount == nil then + ESX.ShowNotification(_U('invalid_amount')) + else + menu2.close() + + ESX.TriggerServerCallback('esx_society:setJobSalary', function() + OpenManageGradesMenu(society) + end, society, data.current.value, amount) + end + + end, + function(data2, menu2) + menu2.close() + end + ) + + end, + function(data, menu) + menu.close() + end + ) + + end, society) + +end + RegisterNetEvent('esx:playerLoaded') AddEventHandler('esx:playerLoaded', function(xPlayer) @@ -69,11 +443,15 @@ AddEventHandler('esx:setJob', function(job) end) -RegisterNetEvent('esx_addonAccount:setMoney') -AddEventHandler('esx_addonAccount:setMoney', function(name, money) +RegisterNetEvent('esx_addonaccount:setMoney') +AddEventHandler('esx_addonaccount:setMoney', function(society, money) - if PlayerData.job ~= nil and PlayerData.job.grade_name == 'boss' and 'society_' .. PlayerData.job.name == name then + if PlayerData.job ~= nil and PlayerData.job.grade_name == 'boss' and 'society_' .. PlayerData.job.name == society then UpdateSocietyMoneyHUDElement(money) end +end) + +AddEventHandler('esx_society:openBossMenu', function(society, close, options) + OpenBossMenu(society, close, options) end) \ No newline at end of file diff --git a/locales/br.lua b/locales/br.lua index db67419b..3eace68c 100644 --- a/locales/br.lua +++ b/locales/br.lua @@ -1,9 +1,30 @@ Locales['br'] = { - ['have_withdrawn'] = 'Você sacou ~g~$', - ['invalid_amount'] = 'Quantidade inválida', - ['have_deposited'] = 'Você depositou ~r~$', - ['you_have'] = 'Você tem ~g~$', - ['you_have_laundered'] = 'Você ~r~lavou~s~ seu dinheiro: ~g~$', + ['actions'] = 'actions', + ['deposit_amount'] = 'deposit amount', + ['deposit_society_money'] = 'deposit society money', + ['employee'] = 'employee', + ['employee_list'] = 'employee list', + ['employee_management'] = 'employee management', + ['fire'] = 'fire', + ['grade'] = 'grade', + ['have_deposited'] = 'Você depositou ~r~$', + ['have_withdrawn'] = 'Você sacou ~g~$', + ['invalid_amount'] = 'invalid amount', + ['invalid_amount'] = 'Quantidade inválida', + ['no'] = 'no', + ['promote'] = 'promote', + ['promote_employee'] = 'promote %s', + ['recruit'] = 'recruit', + ['recruiting'] = 'recruiting', + ['salary_amount'] = 'salary amount', + ['salary_management'] = 'salary management', + ['wash_money'] = 'wash money', + ['wash_money_amount'] = 'amount to wash', + ['withdraw_amount'] = 'witdraw amount', + ['withdraw_society_money'] = 'withdraw society money', + ['yes'] = 'yes', + ['you_have'] = 'Você tem ~g~$', + ['you_have_laundered'] = 'Você ~r~lavou~s~ seu dinheiro: ~g~$', } diff --git a/locales/en.lua b/locales/en.lua index 90ecab88..d60fd62c 100644 --- a/locales/en.lua +++ b/locales/en.lua @@ -1,9 +1,30 @@ Locales['en'] = { - ['have_withdrawn'] = 'you have withdrawn ~g~$', - ['invalid_amount'] = 'invalid amount', - ['have_deposited'] = 'you have deposited ~r~$', - ['you_have'] = 'you have ~g~$', - ['you_have_laundered'] = 'you have ~r~laundered~s~ your money: ~g~$', + ['actions'] = 'actions', + ['deposit_amount'] = 'deposit amount', + ['deposit_society_money'] = 'deposit society money', + ['employee'] = 'employee', + ['employee_list'] = 'employee list', + ['employee_management'] = 'employee management', + ['fire'] = 'fire', + ['grade'] = 'grade', + ['have_deposited'] = 'you have deposited ~r~$', + ['have_withdrawn'] = 'you have withdrawn ~g~$', + ['invalid_amount'] = 'invalid amount', + ['invalid_amount'] = 'invalid amount', + ['no'] = 'no', + ['promote'] = 'promote', + ['promote_employee'] = 'promote %s', + ['recruit'] = 'recruit', + ['recruiting'] = 'recruiting', + ['salary_amount'] = 'salary amount', + ['salary_management'] = 'salary management', + ['wash_money'] = 'wash money', + ['wash_money_amount'] = 'amount to wash', + ['withdraw_amount'] = 'witdraw amount', + ['withdraw_society_money'] = 'withdraw society money', + ['yes'] = 'yes', + ['you_have'] = 'you have ~g~$', + ['you_have_laundered'] = 'you have ~r~laundered~s~ your money: ~g~$', } diff --git a/locales/fr.lua b/locales/fr.lua index 6004ee9b..fb3f07a1 100644 --- a/locales/fr.lua +++ b/locales/fr.lua @@ -1,9 +1,30 @@ Locales['fr'] = { - ['have_withdrawn'] = 'vous avez retiré ~g~$', - ['invalid_amount'] = 'montant invalide', - ['have_deposited'] = 'vous avez déposé ~r~$', - ['you_have'] = 'vous avez ~g~$', - ['you_have_laundered'] = 'Vous avez ~r~blanchi~s~ votre argent : ~g~$', + ['actions'] = 'actions', + ['deposit_amount'] = 'montant du dépôt', + ['deposit_society_money'] = 'déposer argent société', + ['employee'] = 'employé', + ['employee_list'] = 'liste des employés', + ['employee_management'] = 'gestion employés', + ['fire'] = 'licencier', + ['grade'] = 'grade', + ['have_deposited'] = 'vous avez déposé ~r~$', + ['have_withdrawn'] = 'vous avez retiré ~g~$', + ['invalid_amount'] = 'montant invalide', + ['invalid_amount'] = 'montant invalide', + ['no'] = 'non', + ['promote'] = 'promouvoir', + ['promote_employee'] = 'promouvoir %s', + ['recruit'] = 'recruter', + ['recruiting'] = 'recrutement', + ['salary_amount'] = 'montant du salaire', + ['salary_management'] = 'gestion salaires', + ['wash_money'] = 'blanchir argent', + ['wash_money_amount'] = 'montant à blanchir', + ['withdraw_amount'] = 'montant du retrait', + ['withdraw_society_money'] = 'retirer argent société', + ['yes'] = 'oui', + ['you_have'] = 'vous avez ~g~$', + ['you_have_laundered'] = 'vous avez ~r~blanchi~s~ votre argent : ~g~$', } diff --git a/server/main.lua b/server/main.lua index d59a8cee..3376af76 100644 --- a/server/main.lua +++ b/server/main.lua @@ -1,7 +1,25 @@ -ESX = nil +ESX = nil +Jobs = {} TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) +AddEventHandler('onMySQLReady', function() + + local result = MySQL.Sync.fetchAll('SELECT * FROM jobs', {}) + + for i=1, #result, 1 do + Jobs[result[i].name] = result[i] + Jobs[result[i].name].grades = {} + end + + local result2 = MySQL.Sync.fetchAll('SELECT * FROM job_grades', {}) + + for i=1, #result2, 1 do + Jobs[result2[i].job_name].grades[tostring(result2[i].grade)] = result2[i] + end + +end) + RegisterServerEvent('esx_society:withdrawMoney') AddEventHandler('esx_society:withdrawMoney', function(society, amount) @@ -78,6 +96,137 @@ ESX.RegisterServerCallback('esx_society:getAccountMoney', function(source, cb, a end) end) +ESX.RegisterServerCallback('esx_society:getEmployees', function(source, cb, society) + + MySQL.Async.fetchAll( + 'SELECT * FROM users WHERE job = @job ORDER BY job_grade DESC', + { + ['@job'] = society + }, + function(result) + + local employees = {} + + for i=1, #result, 1 do + + table.insert(employees, { + name = result[i].name, + identifier = result[i].identifier, + job = { + name = result[i].job, + label = Jobs[result[i].job].label, + grade = result[i].job_grade, + grade_name = Jobs[result[i].job].grades[tostring(result[i].job_grade)].name, + grade_label = Jobs[result[i].job].grades[tostring(result[i].job_grade)].label, + } + }) + end + + cb(employees) + + end + ) + +end) + +ESX.RegisterServerCallback('esx_society:getJob', function(source, cb, society) + + local job = json.decode(json.encode(Jobs[society])) + local grades = {} + + for k,v in pairs(job.grades) do + table.insert(grades, v) + end + + table.sort(grades, function(a, b) + return a.grade < b.grade + end) + + job.grades = grades + + cb(job) + +end) + + +ESX.RegisterServerCallback('esx_society:setJob', function(source, cb, identifier, job, grade) + + local xPlayer = ESX.GetPlayerFromIdentifier(identifier) + + if xPlayer == nil then + + MySQL.Async.execute( + 'UPDATE users SET job = @job, job_grade = @job_grade WHERE identifier = @identifier', + { + ['@job'] = job, + ['@job_grade'] = grade, + ['@identifier'] = identifier + }, + function(rowsChanged) + cb() + end + ) + + else + xPlayer.setJob(job, grade) + cb() + end + +end) + +ESX.RegisterServerCallback('esx_society:setJobSalary', function(source, cb, job, grade, salary) + + MySQL.Async.execute( + 'UPDATE job_grades SET salary = @salary WHERE job_name = @job_name AND grade = @grade', + { + ['@salary'] = salary, + ['@job_name'] = job, + ['@grade'] = grade + }, + function(rowsChanged) + + Jobs[job].grades[tostring(grade)].salary = salary + + local xPlayers = ESX.GetPlayers() + + for i=1, #xPlayers, 1 do + + local xPlayer = ESX.GetPlayerFromId(xPlayers[i]) + + if xPlayer.job.name == job and xPlayer.job.grade == grade then + xPlayer.setJob(job, grade) + end + + end + + cb() + end + ) + +end) + +ESX.RegisterServerCallback('esx_society:getOnlinePlayers', function(source, cb) + + local xPlayers = ESX.GetPlayers() + local players = {} + + for i=1, #xPlayers, 1 do + + local xPlayer = ESX.GetPlayerFromId(xPlayers[i]) + + table.insert(players, { + source = xPlayer.source, + identifier = xPlayer.identifier, + name = xPlayer.name, + job = xPlayer.job + }) + + end + + cb(players) + +end) + function WashMoneyCRON(d, h, m) MySQL.Async.fetchAll(