Skip to content

Commit 007e5ee

Browse files
authored
Merge pull request #398 from Z3rio/main
feat: improvements of invoice system
2 parents bd396e1 + 91db881 commit 007e5ee

File tree

5 files changed

+118
-99
lines changed

5 files changed

+118
-99
lines changed

client/main.lua

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ PhoneData = {
1111
MentionedTweets = {},
1212
Hashtags = {},
1313
Chats = {},
14-
Invoices = {},
1514
CallData = {},
1615
RecentCalls = {},
1716
Garage = {},
@@ -227,13 +226,6 @@ local function LoadPhone()
227226
PhoneData.Chats = Chats
228227
end
229228

230-
if pData.Invoices ~= nil and next(pData.Invoices) ~= nil then
231-
for _, invoice in pairs(pData.Invoices) do
232-
invoice.name = IsNumberInContacts(invoice.number)
233-
end
234-
PhoneData.Invoices = pData.Invoices
235-
end
236-
237229
if pData.Hashtags ~= nil and next(pData.Hashtags) ~= nil then
238230
PhoneData.Hashtags = pData.Hashtags
239231
end
@@ -598,11 +590,9 @@ RegisterNUICallback('GetBankContacts', function(_, cb)
598590
end)
599591

600592
RegisterNUICallback('GetInvoices', function(_, cb)
601-
if PhoneData.Invoices ~= nil and next(PhoneData.Invoices) ~= nil then
602-
cb(PhoneData.Invoices)
603-
else
604-
cb(nil)
605-
end
593+
QBCore.Functions.TriggerCallback('qb-phone:server:GetInvoices', function(resp)
594+
cb(resp)
595+
end)
606596
end)
607597

608598
RegisterNUICallback('SharedLocation', function(data, cb)
@@ -665,9 +655,8 @@ RegisterNUICallback('PayInvoice', function(data, cb)
665655
local society = data.society
666656
local amount = data.amount
667657
local invoiceId = data.invoiceId
668-
QBCore.Functions.TriggerCallback('qb-phone:server:PayInvoice', function(CanPay, Invoices)
669-
if CanPay then PhoneData.Invoices = Invoices end
670-
cb(CanPay)
658+
QBCore.Functions.TriggerCallback('qb-phone:server:PayInvoice', function(resp)
659+
cb(resp)
671660
end, society, amount, invoiceId, senderCitizenId)
672661
TriggerServerEvent('qb-phone:server:BillingEmail', data, true)
673662
end)
@@ -676,9 +665,8 @@ RegisterNUICallback('DeclineInvoice', function(data, cb)
676665
local society = data.society
677666
local amount = data.amount
678667
local invoiceId = data.invoiceId
679-
QBCore.Functions.TriggerCallback('qb-phone:server:DeclineInvoice', function(_, Invoices)
680-
PhoneData.Invoices = Invoices
681-
cb('ok')
668+
QBCore.Functions.TriggerCallback('qb-phone:server:DeclineInvoice', function(resp)
669+
cb(resp)
682670
end, society, amount, invoiceId)
683671
TriggerServerEvent('qb-phone:server:BillingEmail', data, false)
684672
end)
@@ -1456,7 +1444,6 @@ RegisterNetEvent('QBCore:Client:OnPlayerUnload', function()
14561444
MentionedTweets = {},
14571445
Hashtags = {},
14581446
Chats = {},
1459-
Invoices = {},
14601447
CallData = {},
14611448
RecentCalls = {},
14621449
Garage = {},

html/css/bank.css

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -76,37 +76,44 @@
7676
background-color: #dc143c;
7777
}
7878
.bank-app-invoice {
79-
position: relative;
80-
height: 6vh;
79+
height: fit-content;
80+
display: flex;
81+
flex-direction: column;
82+
padding: 8px 16px;
8183
width: 100%;
8284
letter-spacing: .05vh;
8385
border-bottom: .2vh solid #363d4b;
8486
}
8587
.bank-app-invoice-title {
8688
text-transform : capitalize;
87-
position: absolute;
88-
top: 1vh;
89-
left: 2vh;
89+
width: 100%;
9090
color: white;
9191
font-family: 'Poppins', sans-serif;
9292
font-size: 1.3vh;
9393
}
94+
.bank-app-invoice-info {
95+
width: 100%;
96+
display: flex;
97+
flex-direction: row;
98+
}
9499
.bank-app-invoice-amount {
95-
position: absolute;
96-
bottom: 1vh;
97-
left: 2vh;
98100
color: rgba(255, 255, 255, 0.781);
99101
font-family: 'Poppins', sans-serif;
100102
font-size: 1.22vh;
101103
}
102104
.bank-app-invoice-buttons {
103-
position: absolute;
104-
right: 1.2vh;
105-
bottom: .1vh;
106-
height: 3vh;
107-
width: 7vh;
108-
text-align: center;
109-
line-height: 3.5vh;
105+
margin-left: auto;
106+
}
107+
.bank-app-invoice-reason {
108+
color: rgba(255, 255, 255, 0.85);
109+
font-family: 'Poppins', sans-serif;
110+
font-size: 1.22vh;
111+
112+
width: 100%;
113+
114+
overflow: hidden;
115+
text-overflow: ellipsis;
116+
white-space: nowrap;
110117
}
111118
.bank-app-invoice-buttons > i {
112119
margin-left: .5vh;

html/js/bank.js

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ GetInvoiceLabel = function(type) {
134134
$(document).on('click', '.pay-invoice', function(event){
135135
event.preventDefault();
136136

137-
var InvoiceId = $(this).parent().parent().attr('id');
137+
var InvoiceId = $(this).parent().parent().parent().attr('id');
138138
var InvoiceData = $("#"+InvoiceId).data('invoicedata');
139139
var BankBalance = $(".bank-app-account-balance").data('balance');
140140

@@ -168,35 +168,40 @@ $(document).on('click', '.pay-invoice', function(event){
168168
}
169169
});
170170

171-
$(document).on('click', '.decline-invoice', function(event){
171+
$(document).on('click', '.decline-invoice', async function(event) {
172172
event.preventDefault();
173-
var InvoiceId = $(this).parent().parent().attr('id');
173+
var InvoiceId = $(this).parent().parent().parent().attr('id');
174174
var InvoiceData = $("#"+InvoiceId).data('invoicedata');
175175

176-
$.post('https://qb-phone/DeclineInvoice', JSON.stringify({
176+
const resp = await $.post('https://qb-phone/DeclineInvoice', JSON.stringify({
177177
sender: InvoiceData.sender,
178178
amount: InvoiceData.amount,
179179
society: InvoiceData.society,
180180
invoiceId: InvoiceData.id,
181181
}));
182-
$("#"+InvoiceId).animate({
183-
left: 30+"vh",
184-
}, 300, function(){
185-
setTimeout(function(){
186-
$("#"+InvoiceId).remove();
187-
}, 100);
188-
});
182+
if(resp === true) {
183+
QB.Phone.Notifications.Add("fas fa-university", "QBank", "You declined the invoice", "#8c7ae6")
184+
$("#"+InvoiceId).animate({
185+
left: 30+"vh",
186+
}, 300, function(){
187+
setTimeout(function(){
188+
$("#"+InvoiceId).remove();
189+
}, 100);
190+
});
191+
} else {
192+
QB.Phone.Notifications.Add("fas fa-university", "QBank", "Couldnt decline this invoice...", "#8c7ae6")
193+
}
189194
});
190195

191196
QB.Phone.Functions.LoadBankInvoices = function(invoices) {
192197
if (invoices !== null) {
193198
$(".bank-app-invoices-list").html("");
194199

195200
$.each(invoices, function(i, invoice){
196-
var Elem = '<div class="bank-app-invoice" id="invoiceid-'+i+'"> <div class="bank-app-invoice-title">'+invoice.society+' <span style="font-size: 1vh; color: gray;">(Sender: '+invoice.sender+')</span></div> <div class="bank-app-invoice-amount">&#36; '+invoice.amount+'</div> <div class="bank-app-invoice-buttons"> <i class="fas fa-check-circle pay-invoice"></i> <i class="fas fa-times-circle decline-invoice"></i> </div> </div>';
201+
var Elem = '<div class="bank-app-invoice" id="invoiceid-'+invoice.id+'"> <div class="bank-app-invoice-title">'+invoice.society+' <span style="font-size: 1vh; color: gray;">(Sender: '+invoice.sender+')</span></div>' + (typeof invoice.reason === 'string' ? `<div class="bank-app-invoice-reason">${invoice.reason}</div>` : '') + '<div class="bank-app-invoice-info"><div class="bank-app-invoice-amount">&#36; '+invoice.amount+'</div> <div class="bank-app-invoice-buttons"> <i class="fas fa-check-circle pay-invoice"></i>'+ (invoice.candecline === 1 ? '<i class="fas fa-times-circle decline-invoice"></i>' : '') + '</div></div></div>';
197202

198203
$(".bank-app-invoices-list").append(Elem);
199-
$("#invoiceid-"+i).data('invoicedata', invoice);
204+
$("#invoiceid-"+invoice.id).data('invoicedata', invoice);
200205
});
201206
}
202207
}

qb-phone.sql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ CREATE TABLE IF NOT EXISTS `phone_invoices` (
1515
`society` tinytext DEFAULT NULL,
1616
`sender` varchar(50) DEFAULT NULL,
1717
`sendercitizenid` varchar(50) DEFAULT NULL,
18+
`candecline` int(1) not null default 1,
19+
`reason` varchar(256) default null,
1820
PRIMARY KEY (`id`),
1921
KEY `citizenid` (`citizenid`)
2022
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

server/main.lua

Lines changed: 69 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,32 @@ end
160160
exports('sendNewMailToOffline', sendNewMailToOffline)
161161
-- Callbacks
162162

163+
QBCore.Functions.CreateCallback("qb-phone:server:GetInvoices", function(source, cb)
164+
local Player = QBCore.Functions.GetPlayer(source)
165+
166+
if Player then
167+
local invoices = MySQL.query.await('SELECT * FROM phone_invoices WHERE citizenid = ?', { Player.PlayerData.citizenid })
168+
for _, v in pairs(invoices) do
169+
local Ply = QBCore.Functions.GetPlayerByCitizenId(v.sender)
170+
if Ply ~= nil then
171+
v.number = Ply.PlayerData.charinfo.phone
172+
else
173+
local res = MySQL.query.await('SELECT * FROM players WHERE citizenid = ?', { v.sender })
174+
if res[1] ~= nil then
175+
res[1].charinfo = json.decode(res[1].charinfo)
176+
v.number = res[1].charinfo.phone
177+
else
178+
v.number = nil
179+
end
180+
end
181+
end
182+
cb(invoices)
183+
return
184+
end
185+
186+
cb({})
187+
end)
188+
163189
QBCore.Functions.CreateCallback('qb-phone:server:GetCallState', function(_, cb, ContactData)
164190
local Target = QBCore.Functions.GetPlayerByPhone(ContactData.number)
165191
if Target ~= nil then
@@ -187,7 +213,6 @@ QBCore.Functions.CreateCallback('qb-phone:server:GetPhoneData', function(source,
187213
MentionedTweets = {},
188214
Chats = {},
189215
Hashtags = {},
190-
Invoices = {},
191216
Garage = {},
192217
Mails = {},
193218
Adverts = {},
@@ -207,25 +232,6 @@ QBCore.Functions.CreateCallback('qb-phone:server:GetPhoneData', function(source,
207232
PhoneData.PlayerContacts = result
208233
end
209234

210-
local invoices = MySQL.query.await('SELECT * FROM phone_invoices WHERE citizenid = ?', { Player.PlayerData.citizenid })
211-
if invoices[1] ~= nil then
212-
for _, v in pairs(invoices) do
213-
local Ply = QBCore.Functions.GetPlayerByCitizenId(v.sender)
214-
if Ply ~= nil then
215-
v.number = Ply.PlayerData.charinfo.phone
216-
else
217-
local res = MySQL.query.await('SELECT * FROM players WHERE citizenid = ?', { v.sender })
218-
if res[1] ~= nil then
219-
res[1].charinfo = json.decode(res[1].charinfo)
220-
v.number = res[1].charinfo.phone
221-
else
222-
v.number = nil
223-
end
224-
end
225-
end
226-
PhoneData.Invoices = invoices
227-
end
228-
229235
local garageresult = MySQL.query.await('SELECT * FROM player_vehicles WHERE citizenid = ?', { Player.PlayerData.citizenid })
230236
if garageresult[1] ~= nil then
231237
PhoneData.Garage = garageresult
@@ -283,45 +289,57 @@ QBCore.Functions.CreateCallback('qb-phone:server:GetPhoneData', function(source,
283289
end)
284290

285291
QBCore.Functions.CreateCallback('qb-phone:server:PayInvoice', function(source, cb, society, amount, invoiceId, sendercitizenid)
286-
local Invoices = {}
287292
local Ply = QBCore.Functions.GetPlayer(source)
288293
local SenderPly = QBCore.Functions.GetPlayerByCitizenId(sendercitizenid)
289-
local invoiceMailData = {}
290-
if SenderPly and Config.BillingCommissions[society] then
291-
local commission = round(amount * Config.BillingCommissions[society])
292-
SenderPly.Functions.AddMoney('bank', commission)
293-
invoiceMailData = {
294-
sender = 'Billing Department',
295-
subject = 'Commission Received',
296-
message = string.format('You received a commission check of $%s when %s %s paid a bill of $%s.', commission, Ply.PlayerData.charinfo.firstname, Ply.PlayerData.charinfo.lastname, amount)
297-
}
298-
elseif not SenderPly and Config.BillingCommissions[society] then
299-
invoiceMailData = {
300-
sender = 'Billing Department',
301-
subject = 'Bill Paid',
302-
message = string.format('%s %s paid a bill of $%s', Ply.PlayerData.charinfo.firstname, Ply.PlayerData.charinfo.lastname, amount)
303-
}
304-
end
305-
Ply.Functions.RemoveMoney('bank', amount, 'paid-invoice')
306-
exports['qb-phone']:sendNewMailToOffline(sendercitizenid, invoiceMailData)
307-
exports['qb-banking']:AddMoney(society, amount, 'Phone invoice')
308-
MySQL.query('DELETE FROM phone_invoices WHERE id = ?', { invoiceId })
309-
local invoices = MySQL.query.await('SELECT * FROM phone_invoices WHERE citizenid = ?', { Ply.PlayerData.citizenid })
310-
if invoices[1] ~= nil then
311-
Invoices = invoices
294+
local invoiceMailData = nil
295+
if Ply then
296+
local exists = MySQL.query.await('select count(1) as count FROM phone_invoices WHERE id = ? and citizenid = ?', { invoiceId, Ply.PlayerData.citizenid })
297+
298+
if exists[1] and exists[1]["count"] == 1 then
299+
if SenderPly and Config.BillingCommissions[society] then
300+
local commission = round(amount * Config.BillingCommissions[society])
301+
SenderPly.Functions.AddMoney('bank', commission)
302+
invoiceMailData = {
303+
sender = 'Billing Department',
304+
subject = 'Commission Received',
305+
message = string.format('You received a commission check of $%s when %s %s paid a bill of $%s.', commission, Ply.PlayerData.charinfo.firstname, Ply.PlayerData.charinfo.lastname, amount)
306+
}
307+
elseif not SenderPly and Config.BillingCommissions[society] then
308+
invoiceMailData = {
309+
sender = 'Billing Department',
310+
subject = 'Bill Paid',
311+
message = string.format('%s %s paid a bill of $%s', Ply.PlayerData.charinfo.firstname, Ply.PlayerData.charinfo.lastname, amount)
312+
}
313+
end
314+
if Ply.Functions.RemoveMoney('bank', amount, 'paid-invoice') then
315+
MySQL.query('DELETE FROM phone_invoices WHERE id = ? and citizenid = ?', { invoiceId, Ply.PlayerData.citizenid })
316+
if invoiceMailData then
317+
exports['qb-phone']:sendNewMailToOffline(sendercitizenid, invoiceMailData)
318+
end
319+
TriggerEvent("qb-phone:server:paidInvoice", source, invoiceId)
320+
exports['qb-banking']:AddMoney(society, amount, 'Phone invoice')
321+
cb(true)
322+
return
323+
end
324+
end
312325
end
313-
cb(true, Invoices)
326+
cb(false)
314327
end)
315328

316329
QBCore.Functions.CreateCallback('qb-phone:server:DeclineInvoice', function(source, cb, _, _, invoiceId)
317-
local Invoices = {}
318330
local Ply = QBCore.Functions.GetPlayer(source)
319-
MySQL.query('DELETE FROM phone_invoices WHERE id = ?', { invoiceId })
320-
local invoices = MySQL.query.await('SELECT * FROM phone_invoices WHERE citizenid = ?', { Ply.PlayerData.citizenid })
321-
if invoices[1] ~= nil then
322-
Invoices = invoices
331+
if Ply then
332+
local exists = MySQL.query.await('select count(1) as count FROM phone_invoices WHERE id = ? and citizenid = ? and candecline = ?', { invoiceId, Ply.PlayerData.citizenid, 1 })
333+
334+
if exists[1] and exists[1]["count"] == 1 then
335+
TriggerEvent("qb-phone:server:declinedInvoice", source, invoiceId)
336+
MySQL.query('DELETE FROM phone_invoices WHERE id = ? and citizenid = ? and candecline = ?', { invoiceId, Ply.PlayerData.citizenid, 1 })
337+
cb(true)
338+
return
339+
end
323340
end
324-
cb(true, Invoices)
341+
342+
cb(false)
325343
end)
326344

327345
QBCore.Functions.CreateCallback('qb-phone:server:GetContactPictures', function(_, cb, Chats)

0 commit comments

Comments
 (0)