From 897df27007d3b50f1d9d1b7f89c4455497966f65 Mon Sep 17 00:00:00 2001
From: Gellipapa <gellerthorvath0@gmail.com>
Date: Sat, 18 May 2024 13:54:45 +0200
Subject: [PATCH 1/4] :package: Implemented better job create method

---
 [core]/es_extended/fxmanifest.lua             |   3 +-
 [core]/es_extended/server/functions.lua       |  31 ------
 .../es_extended/server/modules/createJob.lua  | 100 ++++++++++++++++++
 3 files changed, 102 insertions(+), 32 deletions(-)
 create mode 100644 [core]/es_extended/server/modules/createJob.lua

diff --git a/[core]/es_extended/fxmanifest.lua b/[core]/es_extended/fxmanifest.lua
index fe10450d7..6e86e7319 100644
--- a/[core]/es_extended/fxmanifest.lua
+++ b/[core]/es_extended/fxmanifest.lua
@@ -30,7 +30,8 @@ server_scripts {
 	'common/modules/*.lua',
 	'common/functions.lua',
 	'server/modules/actions.lua',
-	'server/modules/npwd.lua'
+	'server/modules/npwd.lua',
+	'server/modules/createJob.lua'
 }
 
 client_scripts {
diff --git a/[core]/es_extended/server/functions.lua b/[core]/es_extended/server/functions.lua
index 38834ddc1..e4be7b301 100644
--- a/[core]/es_extended/server/functions.lua
+++ b/[core]/es_extended/server/functions.lua
@@ -406,37 +406,6 @@ function ESX.DiscordLogFields(name, title, color, fields)
     )
 end
 
---- Create Job at Runtime
---- @param name string
---- @param label string
---- @param grades table
-function ESX.CreateJob(name, label, grades)
-    if not name then
-        return print("[^3WARNING^7] missing argument `name(string)` while creating a job")
-    end
-
-    if not label then
-        return print("[^3WARNING^7] missing argument `label(string)` while creating a job")
-    end
-
-    if not grades or not next(grades) then
-        return print("[^3WARNING^7] missing argument `grades(table)` while creating a job!")
-    end
-
-    local parameters = {}
-    local job = { name = name, label = label, grades = {} }
-
-    for _, v in pairs(grades) do
-        job.grades[tostring(v.grade)] = { job_name = name, grade = v.grade, name = v.name, label = v.label, salary = v.salary, skin_male = v.skin_male or "{}", skin_female = v.skin_female or "{}" }
-        parameters[#parameters + 1] = { name, v.grade, v.name, v.label, v.salary, v.skin_male or "{}", v.skin_female or "{}" }
-    end
-
-    MySQL.insert("INSERT IGNORE INTO jobs (name, label) VALUES (?, ?)", { name, label })
-    MySQL.prepare("INSERT INTO job_grades (job_name, grade, name, label, salary, skin_male, skin_female) VALUES (?, ?, ?, ?, ?, ?, ?)", parameters)
-
-    ESX.Jobs[name] = job
-end
-
 function ESX.RefreshJobs()
     local Jobs = {}
     local jobs = MySQL.query.await("SELECT * FROM jobs")
diff --git a/[core]/es_extended/server/modules/createJob.lua b/[core]/es_extended/server/modules/createJob.lua
new file mode 100644
index 000000000..6640eb093
--- /dev/null
+++ b/[core]/es_extended/server/modules/createJob.lua
@@ -0,0 +1,100 @@
+
+local NOTIFY_TYPES = {
+    INFO = "^5[%s]^7-^6[INFO]^7 %s",
+    SUCCESS = "^5[%s]^7-^2[SUCCESS]^7 %s",
+    ERROR = "^5[%s]^7-^1[ERROR]^7 %s"
+}
+
+local function doesJobAndGradesExist(name, grades)
+    local jobExists = ESX.Jobs[name] or false
+    for _, grade in ipairs(grades) do
+        if ESX.DoesJobExist(name, grade.grade) then
+            jobExists = true
+            break
+        end
+    end
+
+    return jobExists
+end
+
+local function generateTransactionQueries(name,grades)
+    local queries = {}
+    for _, grade in ipairs(grades) do
+        queries[#queries+1] = {
+            query = 'INSERT INTO job_grades (job_name, grade, name, label, salary, skin_male, skin_female) VALUES (?, ?, ?, ?, ?, ?, ?)',
+            values = {name, grade.grade, grade.name, grade.label, grade.salary, '{}', '{}'}
+        }
+    end
+
+    return queries
+end
+
+local function generateNewJobTable(name, label, grades)
+    local job = { name = name, label = label, grades = {} }
+    for _, v in pairs(grades) do
+        job.grades[tostring(v.grade)] = { job_name = name, grade = v.grade, name = v.name, label = v.label, salary = v.salary, skin_male = {}, skin_female = {} }
+    end
+
+    return job
+end
+
+local function notify(notifyType,resourceName,message,...)
+    local formattedMessage = string.format(message, ...)
+
+    if not NOTIFY_TYPES[notifyType] then
+        return print(NOTIFY_TYPES.INFO:format(resourceName,formattedMessage))
+    end
+
+    return print(NOTIFY_TYPES[notifyType]:format(resourceName,formattedMessage))
+end
+
+--- Create Job at Runtime
+--- @param name string
+--- @param label string
+--- @param grades table
+function ESX.CreateJob(name, label, grades)
+    local currentResourceName = GetInvokingResource()
+    local success = false
+
+    if not name or name == '' then
+        notify("ERROR",currentResourceName, 'Missing argument `name`')
+        return
+    end
+    if not label or label == '' then
+        notify("ERROR",currentResourceName, 'Missing argument `label`')
+        return
+    end
+    if not grades or not next(grades) then
+        notify("ERROR",currentResourceName, 'Missing argument `grades`')
+        return
+    end
+
+    local currentJobExist = doesJobAndGradesExist(name, grades)
+
+    if currentJobExist then
+        notify("ERROR",currentResourceName, 'Job already exists: `%s`', name)
+        return
+    end
+
+    MySQL.insert('INSERT IGNORE INTO jobs (name, label) VALUES (?, ?)', {name, label}, function(jobId)
+        if not jobId == 0 then
+            notify("ERROR",currentResourceName, 'Failed to insert job: `%s`', name)
+            return
+        end
+
+        local queries = generateTransactionQueries(name, grades)
+
+        MySQL.transaction(queries, function(results)
+            success = results
+            if not results then
+                notify("ERROR",currentResourceName, 'Failed to insert one or more grades for job: `%s`', name)
+                return
+            end
+
+            ESX.Jobs[name] = generateNewJobTable(name,label,grades)
+            notify("SUCCESS",currentResourceName, 'Job created successfully: `%s`', name)
+        end)
+    end)
+
+    return success
+end
\ No newline at end of file

From 1596816465d82e6e8e9bf28f54263212389b7b0c Mon Sep 17 00:00:00 2001
From: Gellipapa <gellerthorvath0@gmail.com>
Date: Sat, 18 May 2024 14:59:38 +0200
Subject: [PATCH 2/4] Revert ":package: Implemented better job create method"

This reverts commit 897df27007d3b50f1d9d1b7f89c4455497966f65.
---
 [core]/es_extended/fxmanifest.lua             |   3 +-
 [core]/es_extended/server/functions.lua       |  31 ++++++
 .../es_extended/server/modules/createJob.lua  | 100 ------------------
 3 files changed, 32 insertions(+), 102 deletions(-)
 delete mode 100644 [core]/es_extended/server/modules/createJob.lua

diff --git a/[core]/es_extended/fxmanifest.lua b/[core]/es_extended/fxmanifest.lua
index 6e86e7319..fe10450d7 100644
--- a/[core]/es_extended/fxmanifest.lua
+++ b/[core]/es_extended/fxmanifest.lua
@@ -30,8 +30,7 @@ server_scripts {
 	'common/modules/*.lua',
 	'common/functions.lua',
 	'server/modules/actions.lua',
-	'server/modules/npwd.lua',
-	'server/modules/createJob.lua'
+	'server/modules/npwd.lua'
 }
 
 client_scripts {
diff --git a/[core]/es_extended/server/functions.lua b/[core]/es_extended/server/functions.lua
index e4be7b301..38834ddc1 100644
--- a/[core]/es_extended/server/functions.lua
+++ b/[core]/es_extended/server/functions.lua
@@ -406,6 +406,37 @@ function ESX.DiscordLogFields(name, title, color, fields)
     )
 end
 
+--- Create Job at Runtime
+--- @param name string
+--- @param label string
+--- @param grades table
+function ESX.CreateJob(name, label, grades)
+    if not name then
+        return print("[^3WARNING^7] missing argument `name(string)` while creating a job")
+    end
+
+    if not label then
+        return print("[^3WARNING^7] missing argument `label(string)` while creating a job")
+    end
+
+    if not grades or not next(grades) then
+        return print("[^3WARNING^7] missing argument `grades(table)` while creating a job!")
+    end
+
+    local parameters = {}
+    local job = { name = name, label = label, grades = {} }
+
+    for _, v in pairs(grades) do
+        job.grades[tostring(v.grade)] = { job_name = name, grade = v.grade, name = v.name, label = v.label, salary = v.salary, skin_male = v.skin_male or "{}", skin_female = v.skin_female or "{}" }
+        parameters[#parameters + 1] = { name, v.grade, v.name, v.label, v.salary, v.skin_male or "{}", v.skin_female or "{}" }
+    end
+
+    MySQL.insert("INSERT IGNORE INTO jobs (name, label) VALUES (?, ?)", { name, label })
+    MySQL.prepare("INSERT INTO job_grades (job_name, grade, name, label, salary, skin_male, skin_female) VALUES (?, ?, ?, ?, ?, ?, ?)", parameters)
+
+    ESX.Jobs[name] = job
+end
+
 function ESX.RefreshJobs()
     local Jobs = {}
     local jobs = MySQL.query.await("SELECT * FROM jobs")
diff --git a/[core]/es_extended/server/modules/createJob.lua b/[core]/es_extended/server/modules/createJob.lua
deleted file mode 100644
index 6640eb093..000000000
--- a/[core]/es_extended/server/modules/createJob.lua
+++ /dev/null
@@ -1,100 +0,0 @@
-
-local NOTIFY_TYPES = {
-    INFO = "^5[%s]^7-^6[INFO]^7 %s",
-    SUCCESS = "^5[%s]^7-^2[SUCCESS]^7 %s",
-    ERROR = "^5[%s]^7-^1[ERROR]^7 %s"
-}
-
-local function doesJobAndGradesExist(name, grades)
-    local jobExists = ESX.Jobs[name] or false
-    for _, grade in ipairs(grades) do
-        if ESX.DoesJobExist(name, grade.grade) then
-            jobExists = true
-            break
-        end
-    end
-
-    return jobExists
-end
-
-local function generateTransactionQueries(name,grades)
-    local queries = {}
-    for _, grade in ipairs(grades) do
-        queries[#queries+1] = {
-            query = 'INSERT INTO job_grades (job_name, grade, name, label, salary, skin_male, skin_female) VALUES (?, ?, ?, ?, ?, ?, ?)',
-            values = {name, grade.grade, grade.name, grade.label, grade.salary, '{}', '{}'}
-        }
-    end
-
-    return queries
-end
-
-local function generateNewJobTable(name, label, grades)
-    local job = { name = name, label = label, grades = {} }
-    for _, v in pairs(grades) do
-        job.grades[tostring(v.grade)] = { job_name = name, grade = v.grade, name = v.name, label = v.label, salary = v.salary, skin_male = {}, skin_female = {} }
-    end
-
-    return job
-end
-
-local function notify(notifyType,resourceName,message,...)
-    local formattedMessage = string.format(message, ...)
-
-    if not NOTIFY_TYPES[notifyType] then
-        return print(NOTIFY_TYPES.INFO:format(resourceName,formattedMessage))
-    end
-
-    return print(NOTIFY_TYPES[notifyType]:format(resourceName,formattedMessage))
-end
-
---- Create Job at Runtime
---- @param name string
---- @param label string
---- @param grades table
-function ESX.CreateJob(name, label, grades)
-    local currentResourceName = GetInvokingResource()
-    local success = false
-
-    if not name or name == '' then
-        notify("ERROR",currentResourceName, 'Missing argument `name`')
-        return
-    end
-    if not label or label == '' then
-        notify("ERROR",currentResourceName, 'Missing argument `label`')
-        return
-    end
-    if not grades or not next(grades) then
-        notify("ERROR",currentResourceName, 'Missing argument `grades`')
-        return
-    end
-
-    local currentJobExist = doesJobAndGradesExist(name, grades)
-
-    if currentJobExist then
-        notify("ERROR",currentResourceName, 'Job already exists: `%s`', name)
-        return
-    end
-
-    MySQL.insert('INSERT IGNORE INTO jobs (name, label) VALUES (?, ?)', {name, label}, function(jobId)
-        if not jobId == 0 then
-            notify("ERROR",currentResourceName, 'Failed to insert job: `%s`', name)
-            return
-        end
-
-        local queries = generateTransactionQueries(name, grades)
-
-        MySQL.transaction(queries, function(results)
-            success = results
-            if not results then
-                notify("ERROR",currentResourceName, 'Failed to insert one or more grades for job: `%s`', name)
-                return
-            end
-
-            ESX.Jobs[name] = generateNewJobTable(name,label,grades)
-            notify("SUCCESS",currentResourceName, 'Job created successfully: `%s`', name)
-        end)
-    end)
-
-    return success
-end
\ No newline at end of file

From 40abb5550527a89ba30fed30f915c0613314a542 Mon Sep 17 00:00:00 2001
From: Gellipapa <gellerthorvath0@gmail.com>
Date: Sat, 18 May 2024 15:21:01 +0200
Subject: [PATCH 3/4] :package: Implemented new better createJob method

---
 [core]/es_extended/fxmanifest.lua             |   3 +-
 [core]/es_extended/server/functions.lua       |  31 ------
 .../es_extended/server/modules/createJob.lua  | 100 ++++++++++++++++++
 3 files changed, 102 insertions(+), 32 deletions(-)
 create mode 100644 [core]/es_extended/server/modules/createJob.lua

diff --git a/[core]/es_extended/fxmanifest.lua b/[core]/es_extended/fxmanifest.lua
index fe10450d7..6e86e7319 100644
--- a/[core]/es_extended/fxmanifest.lua
+++ b/[core]/es_extended/fxmanifest.lua
@@ -30,7 +30,8 @@ server_scripts {
 	'common/modules/*.lua',
 	'common/functions.lua',
 	'server/modules/actions.lua',
-	'server/modules/npwd.lua'
+	'server/modules/npwd.lua',
+	'server/modules/createJob.lua'
 }
 
 client_scripts {
diff --git a/[core]/es_extended/server/functions.lua b/[core]/es_extended/server/functions.lua
index 38834ddc1..e4be7b301 100644
--- a/[core]/es_extended/server/functions.lua
+++ b/[core]/es_extended/server/functions.lua
@@ -406,37 +406,6 @@ function ESX.DiscordLogFields(name, title, color, fields)
     )
 end
 
---- Create Job at Runtime
---- @param name string
---- @param label string
---- @param grades table
-function ESX.CreateJob(name, label, grades)
-    if not name then
-        return print("[^3WARNING^7] missing argument `name(string)` while creating a job")
-    end
-
-    if not label then
-        return print("[^3WARNING^7] missing argument `label(string)` while creating a job")
-    end
-
-    if not grades or not next(grades) then
-        return print("[^3WARNING^7] missing argument `grades(table)` while creating a job!")
-    end
-
-    local parameters = {}
-    local job = { name = name, label = label, grades = {} }
-
-    for _, v in pairs(grades) do
-        job.grades[tostring(v.grade)] = { job_name = name, grade = v.grade, name = v.name, label = v.label, salary = v.salary, skin_male = v.skin_male or "{}", skin_female = v.skin_female or "{}" }
-        parameters[#parameters + 1] = { name, v.grade, v.name, v.label, v.salary, v.skin_male or "{}", v.skin_female or "{}" }
-    end
-
-    MySQL.insert("INSERT IGNORE INTO jobs (name, label) VALUES (?, ?)", { name, label })
-    MySQL.prepare("INSERT INTO job_grades (job_name, grade, name, label, salary, skin_male, skin_female) VALUES (?, ?, ?, ?, ?, ?, ?)", parameters)
-
-    ESX.Jobs[name] = job
-end
-
 function ESX.RefreshJobs()
     local Jobs = {}
     local jobs = MySQL.query.await("SELECT * FROM jobs")
diff --git a/[core]/es_extended/server/modules/createJob.lua b/[core]/es_extended/server/modules/createJob.lua
new file mode 100644
index 000000000..535394bba
--- /dev/null
+++ b/[core]/es_extended/server/modules/createJob.lua
@@ -0,0 +1,100 @@
+
+local NOTIFY_TYPES = {
+    INFO = "^5[%s]^7-^6[INFO]^7 %s",
+    SUCCESS = "^5[%s]^7-^2[SUCCESS]^7 %s",
+    ERROR = "^5[%s]^7-^1[ERROR]^7 %s"
+}
+
+local function doesJobAndGradesExist(name, grades)
+    local jobExists = false
+    for _, grade in ipairs(grades) do
+        if ESX.DoesJobExist(name, grade.grade) then
+            jobExists = true
+            break
+        end
+    end
+
+    return jobExists
+end
+
+local function generateTransactionQueries(name,grades)
+    local queries = {}
+    for _, grade in ipairs(grades) do
+        queries[#queries+1] = {
+            query = 'INSERT INTO job_grades (job_name, grade, name, label, salary, skin_male, skin_female) VALUES (?, ?, ?, ?, ?, ?, ?)',
+            values = {name, grade.grade, grade.name, grade.label, grade.salary, '{}', '{}'}
+        }
+    end
+
+    return queries
+end
+
+local function generateNewJobTable(name, label, grades)
+    local job = { name = name, label = label, grades = {} }
+    for _, v in pairs(grades) do
+        job.grades[tostring(v.grade)] = { job_name = name, grade = v.grade, name = v.name, label = v.label, salary = v.salary, skin_male = {}, skin_female = {} }
+    end
+
+    return job
+end
+
+local function notify(notifyType,resourceName,message,...)
+    local formattedMessage = string.format(message, ...)
+
+    if not NOTIFY_TYPES[notifyType] then
+        return print(NOTIFY_TYPES.INFO:format(resourceName,formattedMessage))
+    end
+
+    return print(NOTIFY_TYPES[notifyType]:format(resourceName,formattedMessage))
+end
+
+--- Create Job at Runtime
+--- @param name string
+--- @param label string
+--- @param grades table
+function ESX.CreateJob(name, label, grades)
+    local currentResourceName = GetInvokingResource()
+    local success = false
+
+    if not name or name == '' then
+        notify("ERROR",currentResourceName, 'Missing argument `name`')
+        return
+    end
+    if not label or label == '' then
+        notify("ERROR",currentResourceName, 'Missing argument `label`')
+        return
+    end
+    if not grades or not next(grades) then
+        notify("ERROR",currentResourceName, 'Missing argument `grades`')
+        return
+    end
+
+    local currentJobExist = doesJobAndGradesExist(name, grades)
+
+    if currentJobExist then
+        notify("ERROR",currentResourceName, 'Job or grades already exists: `%s`', name)
+        return
+    end
+
+    MySQL.insert('INSERT IGNORE INTO jobs (name, label) VALUES (?, ?)', {name, label}, function(jobId)
+        if not jobId == 0 then
+            notify("ERROR",currentResourceName, 'Failed to insert job: `%s`', name)
+            return
+        end
+
+        local queries = generateTransactionQueries(name, grades)
+
+        MySQL.transaction(queries, function(results)
+            success = results
+            if not results then
+                notify("ERROR",currentResourceName, 'Failed to insert one or more grades for job: `%s`', name)
+                return
+            end
+
+            ESX.Jobs[name] = generateNewJobTable(name,label,grades)
+            notify("SUCCESS",currentResourceName, 'Job created successfully: `%s`', name)
+        end)
+    end)
+
+    return success
+end
\ No newline at end of file

From 257d3af110544e1cd57d42cc51544f905919caf4 Mon Sep 17 00:00:00 2001
From: Gellipapa <gellerthorvath0@gmail.com>
Date: Sat, 18 May 2024 17:09:56 +0200
Subject: [PATCH 4/4] :ambulance: fix job checker (Arctos)

---
 [core]/es_extended/server/modules/createJob.lua | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/[core]/es_extended/server/modules/createJob.lua b/[core]/es_extended/server/modules/createJob.lua
index 535394bba..aab40338d 100644
--- a/[core]/es_extended/server/modules/createJob.lua
+++ b/[core]/es_extended/server/modules/createJob.lua
@@ -6,15 +6,17 @@ local NOTIFY_TYPES = {
 }
 
 local function doesJobAndGradesExist(name, grades)
-    local jobExists = false
-    for _, grade in ipairs(grades) do
-        if ESX.DoesJobExist(name, grade.grade) then
-            jobExists = true
-            break
-        end
+    if not ESX.Jobs[name] then 
+       return false
     end
 
-    return jobExists
+   for _, grade in ipairs(grades) do
+       if not ESX.DoesJobExist(name, grade.grade) then
+           return false
+       end
+   end
+
+   return true
 end
 
 local function generateTransactionQueries(name,grades)