# 4・Advanced configuration / Custom Framework

<figure><img src="/files/eFwDbWmBteIOxPQk0PMJ" alt=""><figcaption></figcaption></figure>

## ![:1arrowpink:](https://cdn.discordapp.com/emojis/1048588915277307934.gif?size=44\&quality=lossless) This topic concern people who have a custom Framework and know what they do.<br>

Here, we will explain how to adapt our script for a **custom Framework server**.\
**Do not touch any part of it if you don't know what you do.**

* First, go to `marketShop/config` and open the `config.lua` file.\
  At the top of the file, define your framework by "other"

{% code fullWidth="true" %}

```lua
FrameWork = "other"    		-- qb or esx or other
```

{% endcode %}

*Don't forget to config our config with the previous step.*

* Now, go to `marketShop/unencryptedServer` and go to the folder named `otherFramework`\
  You have 3 files inside.\
  Start with `enterprise.lua`, all functions are explained in this file.

{% code fullWidth="true" %}

```lua
if string.lower(FrameWork) ~= "other" then 
	return
end


affError("FRAMEWORK DEFINE : OTHER")
local QBCore = nil

--QBCore = exports['qb-core']:GetCoreObject()


----------------------------------------------------------------
-- Function To remove money from the supermarket bank account --
----------------------------------------------------------------

function RemoveMoneyFromEntreprise(price)
	local moneyRemoved = false
	
	if exports['qb-management']:RemoveMoney("supermarket", price) then
		moneyRemoved = true
	end
	
	return moneyRemoved
end

----------------------------------------------------------------------
-- Event triggered when a player clean the splat in the supermarket --
----------------------------------------------------------------------
RegisterServerEvent('marketShop:CleaningPay')
AddEventHandler('marketShop:CleaningPay', function(player)
	
	local Player = QBCore.Functions.GetPlayer(player)
	if RemoveMoneyFromEntreprise(CleaningPrice) then
		Player.Functions.AddMoney("bank", CleaningPrice)
	else
		TriggerClientEvent("marketShop:notif",player,TRAD["Trad-NoEnterpriseMoneyTitle"],TRAD["Trad-NoEnterpriseMoney"],"box","#FF0000")
	end
	
end)

```

{% endcode %}

* `inventory.lua`, all functions are explained in this file.

{% code fullWidth="true" %}

```lua
if string.lower(FrameWork) ~= "other" then 
	return
end
-- local QBCore = exports['qb-core']:GetCoreObject()



------------------------------------------------------------------------------
-- Function used to add item to the player (used when you bought something) --
------------------------------------------------------------------------------

function GiveToPlayerItem(player,item,qte)
	aff("Give to: "..tostring(player).." "..tostring(item).." "..tostring(qte))
	
    local Player = QBCore.Functions.GetPlayer(player)
	Player.Functions.AddItem(item, qte)
end


----------------------------------------------------------------------------------------------
-- Function used to remove item from the player (used when you put back in stock something) --
----------------------------------------------------------------------------------------------
function RemovePlayerItem(player,item,qte)
	local itemRemoved = false
	 local Player = QBCore.Functions.GetPlayer(player)
	 
	local invItem = Player.Functions.GetItemByName(item)
	if invItem and invItem.amount >= qte then
		Player.Functions.RemoveItem(item, qte)
		itemRemoved = true
	end
	
	return itemRemoved
end
```

{% endcode %}

* `payment.lua`, all functions are explained in this file.

{% code fullWidth="true" %}

```lua
if string.lower(FrameWork) ~= "other" then 
	return
end

-- local QBCore = exports['qb-core']:GetCoreObject()


---------------------------------------------------------------------------------------------------------------------------------
-- The two event bellow are triggered when you pay at a cahsregister/automatic cash register                                   --
-- This is here where player have to pay for their stuff so we remove player money and transfer it to the supermarket account  --
-- This is here where the audio of the cash reg payment is triggered                                                           --
-- This is here where we set the payment status of the casreg (setPaidForCashReg)                                              --
---------------------------------------------------------------------------------------------------------------------------------

RegisterServerEvent('marketShop:PaidCashReg')
AddEventHandler('marketShop:PaidCashReg', function(data)
	local player = source
	local handle = tonumber(data.handle)
	Citizen.CreateThread(function()
		local locplayer = player
		local cashRegHandle = handle
		aff("^1PaidCashReg^7 "..tostring(cashRegHandle))
		
		local Player = QBCore.Functions.GetPlayer(player)
		local cashBalance = Player.PlayerData.money["cash"]
		local bankBalance = Player.PlayerData.money["bank"]
		local value = getPriceToPaidForCashReg(cashRegHandle)
		aff("getPaidStatusForCashReg : "..tostring(getPaidStatusForCashReg(cashRegHandle)).." getPaidStatusForCashReg2 : "..tostring(getPaidStatusForCashReg2(cashRegHandle)).." value: "..tostring(getPriceToPaidForCashReg(cashRegHandle)))
		if value > -1 then
			if getPaidStatusForCashReg(cashRegHandle) == false and getPaidStatusForCashReg2(cashRegHandle) == true then
				aff("a")
				if cashBalance >= value then
					aff("b")
					Player.Functions.RemoveMoney("cash", value)
					exports['qb-management']:AddMoney("supermarket", tonumber(value))
					TriggerClientEvent("marketShop:CLIBipPaid", -1, cashRegHandle)
					setPaidForCashReg(cashRegHandle)
				elseif bankBalance >= value then
					aff("c")
					Player.Functions.RemoveMoney("bank", value)
					exports['qb-management']:AddMoney("supermarket", tonumber(value))
					TriggerClientEvent("marketShop:CLIBipPaid", -1, cashRegHandle)
					setPaidForCashReg(cashRegHandle)
					-- TriggerEvent("marketShop:takeOutGarage", cashRegHandle)
				else
					aff("d")
					TriggerClientEvent("marketShop:notif",player,TRAD["Trad-PasThuneTitle"],TRAD["Trad-PasThune"],"box","#FF0000")
					-- TriggerClientEvent('QBCore:Notify', src, Lang:t("error.not_enough"), 'error')
				end
			else
				aff("e")
				if getPaidStatusForCashReg(cashRegHandle) == true then
					aff("f")
					TriggerClientEvent("marketShop:notif",player,TRAD["Trad-DejaPayerTitle"],TRAD["Trad-DejaPayer"],"box","#FF0000")
				end
				if getPaidStatusForCashReg2(cashRegHandle) == false then
					aff("g")
					TriggerClientEvent("marketShop:notif",player,TRAD["Trad-RienPayerTitle"],TRAD["Trad-RienPayer"],"box","#FF0000")
				end
			end
		end
	end)
end)

RegisterServerEvent('marketShop:PaidAutoCashReg')
AddEventHandler('marketShop:PaidAutoCashReg', function(data)
	local player = source
	local handle = tonumber(data.handle)
	Citizen.CreateThread(function()
		local locplayer = player
		local cashRegHandle = handle
		aff("^1PaidAutoCashReg^7 "..tostring(cashRegHandle))
		
		local Player = QBCore.Functions.GetPlayer(locplayer)
		local cashBalance = Player.PlayerData.money["cash"]
		local bankBalance = Player.PlayerData.money["bank"]
		local value = getPriceToPaidForAutoCashReg(cashRegHandle)
		
		aff("getPaidStatusForAutoCashReg : "..tostring(getPaidStatusForAutoCashReg(cashRegHandle)).." getPaidStatusForAutoCashReg2 : "..tostring(getPaidStatusForAutoCashReg2(cashRegHandle)).." value: "..tostring(getPriceToPaidForAutoCashReg(cashRegHandle)))
		if value > -1 then
			aff("value: "..tostring(value))
			if getPaidStatusForAutoCashReg(cashRegHandle) == false and getPaidStatusForAutoCashReg2(cashRegHandle) == true then
				aff("a")
				if cashBalance >= value then
					aff("b")
					Player.Functions.RemoveMoney("cash", value)
					exports['qb-management']:AddMoney("supermarket", tonumber(value))
					TriggerClientEvent("marketShop:CLIBipAutoPaid", -1, cashRegHandle)
					setPaidForAutoCashReg(cashRegHandle)
				elseif bankBalance >= value then
					aff("c")
					Player.Functions.RemoveMoney("bank", value)
					exports['qb-management']:AddMoney("supermarket", tonumber(value))
					TriggerClientEvent("marketShop:CLIBipAutoPaid", -1, cashRegHandle)
					setPaidForAutoCashReg(cashRegHandle)
					-- TriggerEvent("marketShop:takeOutGarage", cashRegHandle)
				else
					aff("d")
					TriggerClientEvent("marketShop:notif",locplayer,TRAD["Trad-PasThuneTitle"],TRAD["Trad-PasThune"],"box","#FF0000")
					-- TriggerClientEvent('QBCore:Notify', src, Lang:t("error.not_enough"), 'error')
				end
			else
				aff("e")
				if getPaidStatusForAutoCashReg(cashRegHandle) == true then
					aff("f")
					TriggerClientEvent("marketShop:notif",locplayer,TRAD["Trad-DejaPayerTitle"],TRAD["Trad-DejaPayer"],"box","#FF0000")
				end
				if getPaidStatusForAutoCashReg2(cashRegHandle) == false then
					aff("g")
					TriggerClientEvent("marketShop:notif",locplayer,TRAD["Trad-RienPayerTitle"],TRAD["Trad-RienPayer"],"box","#FF0000")
				end
			end
		end
	end)
end)
```

{% endcode %}

* Now you go to `marketShop/unencryptedClient` and go to the folder named `otherFramework`\
  You have one `enterprise.lua` file.\
  Like the others, all functions are explained in this file.

{% code fullWidth="true" %}

```lua
if string.lower(FrameWork) ~= "other" then 
	return
end

local PlayerJob = {}
local onDuty = false

--local QBCore = exports['qb-core']:GetCoreObject()


---------------------------------------------------------
-- Function To check if the player work at supermarket --
---------------------------------------------------------
function IsMarketEmployee()
	local isMarketEmployee = false
	if PlayerJob.name == 'supermarket' then
		isMarketEmployee = true
	end
	return isMarketEmployee, onDuty
end

--------------------------------------------------------------------
-- Function To check if the player is the boss of the supermarket --
--------------------------------------------------------------------
function IsPatron()
	aff("IsPatron : "..tostring(PlayerJob.isboss))
	return PlayerJob.isboss
end


----------------------------------------
-- Client side on/off duty management --
----------------------------------------
RegisterNetEvent("marketShop:SetDutyStatus")
AddEventHandler('marketShop:SetDutyStatus', function()
	onDuty = not onDuty
    TriggerServerEvent("QBCore:ToggleDuty")
end)






---------------------------------------------------------------------------------
-- All event below are QB relative, but i let it their to remind you to manage --
-- disconnection / connection and job changing                                 --
---------------------------------------------------------------------------------
RegisterNetEvent('QBCore:Client:OnJobUpdate', function(JobInfo)
	aff("^4-----------OnJobUpdate-----------^7 "..tostring(JobInfo.name))
    PlayerJob = JobInfo
    if PlayerJob.name == 'supermarket' then
        onDuty = PlayerJob.onduty
        if PlayerJob.onduty then
            TriggerServerEvent("marketShop:AddActifEmployee")
        else
            TriggerServerEvent("marketShop:RemoveActifEmployee")
        end
    end
end)



RegisterNetEvent('QBCore:Client:SetDuty', function(duty)
    if PlayerJob.name == 'supermarket' and duty ~= onDuty then
        if duty then
            TriggerServerEvent("marketShop:AddActifEmployee")
        else
            TriggerServerEvent("marketShop:RemoveActifEmployee")
        end
    end

    onDuty = duty
end)



RegisterNetEvent('QBCore:Client:OnPlayerLoaded', function()

    CreateThread(function()
        Wait(1000)
        QBCore.Functions.GetPlayerData(function(PlayerData)
            PlayerJob = PlayerData.job
            onDuty = PlayerData.job.onduty
            
            if PlayerJob.name == 'supermarket' and onDuty then
                TriggerServerEvent("marketShop:AddActifEmployee", PlayerJob.name)
            end
        end)
		TriggerServerEvent("marketShop:getAllLockStatus")
		TriggerServerEvent("marketShop:getAllAutoLockStatus")
    end)
end)

AddEventHandler('onResourceStart', function(resource)
    if GetCurrentResourceName() == resource then
        PlayerJob = QBCore.Functions.GetPlayerData().job
		onDuty = PlayerJob.onduty
		for k,v in pairs(PlayerJob) do
			aff("k : "..tostring(k).." v: "..tostring(v))
		end
    end
end)

RegisterNetEvent('QBCore:Client:OnPlayerUnload', function()
    if PlayerJob.name == 'supermarket' and onDuty then
        TriggerServerEvent("marketShop:RemoveActifEmployee", PlayerJob.name)
    end
end)
```

{% endcode %}

### **Now you can start our script and all should works perfectly !**

\
Please, contact us by opening a ticket on our discord's server.&#x20;


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://patamods.gitbook.io/patamods-documentation/scripts/supermarket/4-advanced-configuration-custom-framework.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
