Everything works exceptionally fine, But i do get a couple issues. What the below code does is handle player data when exchanging one value to another (cash to bank and vise vera) the issue is, when i enter a value of '1' into the text box for a deposit and i have 0$ cash on me. i will draw out sum of cash equal to what was deposited before i deposited the '1' dollar (im trying to deposit 1 dollar to see if any bugs occur and sure enough)

NPC in the workspace.

local data = require(game:GetService("ServerScriptService"):WaitForChild("CoreScripts"):WaitForChild("Modules"):WaitForChild("DataHandler"))
local RE = game:GetService("ReplicatedStorage"):WaitForChild("BankRemotes"):WaitForChild("Bank00"):WaitForChild("InteractionRemote")
local RE2 = game:GetService("ReplicatedStorage"):WaitForChild("BankRemotes"):WaitForChild("Bank00"):WaitForChild("LeaveRemote")
local RE3 = game:GetService("ReplicatedStorage"):WaitForChild("BankRemotes"):WaitForChild("Bank00"):WaitForChild("TypeRemote")
local RE4 = game:GetService("ReplicatedStorage"):WaitForChild("BankRemotes"):WaitForChild("Bank00"):WaitForChild("TransactionRemote")
local RE5 = game:GetService("ReplicatedStorage"):WaitForChild("BankRemotes"):WaitForChild("Bank00"):WaitForChild("BalanceRemote")
local npc = script.Parent
local cd = npc.Parent:WaitForChild("Desk"):WaitForChild("Mic"):WaitForChild("ClickDetector")
local gui = npc.Head.BillboardGui
local NPCName = "Teller"
local message = "What can i do for ya?"
local message2 = "So you wanna make a transaction, or check your balance?"
local message3 = "You don't have enough to do that."
local chattime = .05
local animation = Instance.new("Animation")
animation.AnimationId = "http://www.roblox.com/Asset?ID=1258082161"
local idle = npc.Humanoid:LoadAnimation(animation)
local animation2 = Instance.new("Animation")
animation2.AnimationId = "http://www.roblox.com/Asset?ID=1258030744"
local lookaround = npc.Humanoid:LoadAnimation(animation2)

idle:play()
spawn(function()
	while wait(15) do
		lookaround:play()
	end
end)

RE.OnServerEvent:connect(function(player)
	local char = workspace:WaitForChild(player.Name)
	char:WaitForChild("Humanoid").WalkSpeed = 0
	char:WaitForChild("Humanoid").JumpPower = 0
	RE:FireClient(player, NPCName, message, chattime)
end)

RE2.OnServerEvent:connect(function(player) -- Leave selected
	local char = workspace:WaitForChild(player.Name)
	char:WaitForChild("Humanoid").WalkSpeed = 16
	char:WaitForChild("Humanoid").JumpPower = 50
end)

RE3.OnServerEvent:connect(function(player) -- Transaction selected
	RE3:FireClient(player, NPCName, message2, chattime, data.CurrentData(player).Cash, data.CurrentData(player).Bank)
end)

RE4.OnServerEvent:connect(function(player, transtype, amount, cash, bank) -- transaction made, update datastore.
	data.UpdateData(player, "Cash", cash)
	data.UpdateData(player, "Bank", bank)
	if transtype then
		local message5 = "Deposited $"..amount.." successfully."
		RE4:FireClient(player, NPCName, message5, chattime)
	elseif not transtype then
		local message5 = "Withdrew $"..amount.." successfully."
		RE4:FireClient(player, NPCName, message5, chattime)
	end
end)

RE5.OnServerEvent:connect(function(player) -- Check Balance
	local balance = "You have a total of $"..data.CurrentData(player).Bank.." in your bank account."
	RE5:FireClient(player, NPCName, balance, chattime)
end)

local script in a gui

local player = game:GetService("Players").LocalPlayer
local RE = game:GetService("ReplicatedStorage"):WaitForChild("BankRemotes"):WaitForChild("Bank00"):WaitForChild("InteractionRemote")
local RE2 = game:GetService("ReplicatedStorage"):WaitForChild("BankRemotes"):WaitForChild("Bank00"):WaitForChild("LeaveRemote")
local RE3 = game:GetService("ReplicatedStorage"):WaitForChild("BankRemotes"):WaitForChild("Bank00"):WaitForChild("TypeRemote")
local RE4 = game:GetService("ReplicatedStorage"):WaitForChild("BankRemotes"):WaitForChild("Bank00"):WaitForChild("TransactionRemote")
local RE5 = game:GetService("ReplicatedStorage"):WaitForChild("BankRemotes"):WaitForChild("Bank00"):WaitForChild("BalanceRemote")
local dialog = script.Parent
local choices = dialog.Choices
local choices2 = dialog.Choices2
local Transaction = choices.Transaction.Button
local leave = choices.Leave.Button
local withdraw = choices2.Withdraw.Button
local deposit = choices2.Deposit.Button
local balance = choices2.Balance.Button
local chat = dialog.dialogbox
local sound = dialog.Sound
local transframe = dialog.TransactionFrame
local transinfo = transframe.Type
local amount = transframe.Amount
local cd = workspace.MapContents.BuildingContents.Bank00.Interior:WaitForChild("Desk"):WaitForChild("Mic"):WaitForChild("ClickDetector")
local mark = workspace.MapContents.BuildingContents.Bank00.Interior.NPC.Head.BillboardGui
local active = false

cd.MouseHoverEnter:connect(function(player)
	mark.Enabled = true
end)

cd.MouseHoverLeave:connect(function(player)
	mark.Enabled = false
end)

cd.MouseClick:connect(function()
	dialog.Enabled = true
	RE:FireServer()
end)

Transaction.MouseButton1Click:connect(function()
	choices.Visible = false
	RE3:FireServer()
end)

leave.MouseButton1Click:connect(function()
	dialog.Enabled = false
	choices.Visible = false
	chat.Visible = false
	RE2:FireServer()
end)

local function deposittransaction(cash, bank) -- Check transaction type then make transaction
	transframe.Visible = true
	chat.Visible = false
	choices2.Visible = false
	amount:CaptureFocus()
	local transtype = true
	transinfo.Text = '- Deposit -'
	amount.FocusLost:connect(function()
		if not tonumber(amount.Text) then
			transinfo.Text = 'You must enter a number!'
			wait(1)
			transinfo.Text = '- Deposit -'
		elseif cash >= tonumber(amount.Text) then
			cash = cash - tonumber(amount.Text)
			bank = bank + tonumber(amount.Text)
			RE4:FireServer(transtype, amount.Text, cash, bank)
			RE2:FireServer()
		elseif cash < tonumber(amount.Text) then
			transinfo.Text = 'You dont have enough to do that!'
			wait(1)
			transinfo.Text = '- Deposit -'
		end
	end)
end

local function withdrawtransaction(cash, bank) -- Check transaction type then make transaction
	transframe.Visible = true
	chat.Visible = false
	choices2.Visible = false
	amount:CaptureFocus()
	local transtype = false
	transinfo.Text = '- Withdrawal -'
	amount.FocusLost:connect(function()
		if tonumber(amount.Text) == nil then
			transinfo.Text = 'You must enter a number!'
			wait(1)
			transinfo.Text = '- Withdrawal -'
		elseif bank >= tonumber(amount.Text) then
			cash = cash + tonumber(amount.Text)
			bank = bank - tonumber(amount.Text)
			RE4:FireServer(transtype, amount.Text, cash, bank)
			RE2:FireServer()
		elseif bank < tonumber(amount.Text) then
			transinfo.Text = 'You dont have enough to do that!'
			wait(1)
			transinfo.Text = '- Withdrawal -'
		end
	end)
end

balance.MouseButton1Click:connect(function() -- Check Balance
	RE5:FireServer()
end)

RE.OnClientEvent:connect(function(NPCName, message, chattime) -- Starting Interaction
	chat.Visible = true
	for i = 1, #message do
		chat.TextLabel.Text = NPCName..": "..string.sub(message,1,i)
		sound:Play()
		wait(chattime)
	end
	wait(1)
	choices.Visible = true
end)

RE3.OnClientEvent:connect(function(NPCName, message, chattime, cash, bank) -- Transaction Selected
	for i = 1, #message do
		chat.TextLabel.Text = NPCName..": "..string.sub(message,1,i)
		sound:Play()
		wait(chattime)
	end
	wait(1)
	choices2.Visible = true
	withdraw.MouseButton1Click:connect(function() -- Withdraw Cash
		withdrawtransaction(cash, bank)
	end)

	deposit.MouseButton1Click:connect(function() -- Deposit Cash
		deposittransaction(cash, bank)
	end)
end)

RE4.OnClientEvent:connect(function(NPCName, message, chattime) -- Make Transaction
	chat.Visible = true
	choices2.Visible = false
	for i = 1, #message do
		chat.TextLabel.Text = NPCName..": "..string.sub(message,1,i)
		sound:Play()
		wait(chattime)
	end
	wait(1)
	transframe.Visible = false
	chat.Visible = false
	dialog.Enabled = false
	RE2:FireServer()
end)

RE5.OnClientEvent:connect(function(NPCName, message, chattime) -- Check Balance
	chat.Visible = true
	choices2.Visible = false
	for i = 1, #message do
		chat.TextLabel.Text = NPCName..": "..string.sub(message,1,i)
		sound:Play()
		wait(chattime)
	end
	wait(1)
	chat.Visible = false
	dialog.Enabled = false
	RE2:FireServer()
end)

module for datastores

local data = {}
local ds = game:GetService("DataStoreService"):GetDataStore("TestingSim2Data_v0.1.0")
local RE = game:GetService("ReplicatedStorage"):WaitForChild("ClientRemotes"):WaitForChild("MoneyRemote")
local players = game:GetService('Players')

sessiondata = {}
local default = {
	Cash = 5000,
	Bank = 9999999999
}

data.UpdateData = function(player, index, value)
	sessiondata[player][index] = value
	RE:FireClient(player, sessiondata[player])
	print("Value "..sessiondata[player][index].." was updated to "..value)
end

local function SaveData(player)
	if sessiondata[player] then
		ds:SetAsync(player.UserId, sessiondata[player])
	end
end

local function SetupData(player)
	local playerdata = data.GetData(player)
	if not playerdata then
		print("setting up player data")
		sessiondata[player] = default
		SaveData(player)
	else
		print("player has data")
		sessiondata[player] = playerdata
	end
end

players.PlayerAdded:connect(function(player)
	SetupData(player)
end)

players.PlayerRemoving:connect(function(player)
	SaveData(player)
	sessiondata[player] = nil
end)

data.GetData = function(player)
	return ds:GetAsync(player.UserId)
end

data.CurrentData = function(player)
	return sessiondata[player]
end

return data