· 8 years ago · Aug 08, 2018, 01:30 PM
1
2-- module describing business system (company, money laundering)
3
4local cfg = module("cfg/business")
5local cfgGroup = module("cfg/groups")
6local cfg_base = module("cfg/base")
7local groups = cfgGroup.groups
8local htmlEntities = module("lib/htmlEntities")
9local lang = vRP.lang
10
11local sanitizes = module("cfg/sanitizes")
12local busi_notes = {}
13local businesschest = cfg.busichest
14
15-- sql
16MySQL.createCommand("vRP/business_tables",[[
17CREATE TABLE IF NOT EXISTS vrp_user_business(
18 user_id INTEGER,
19 name VARCHAR(30),
20 description TEXT,
21 capital INTEGER,
22 treasury BIGINT DEFAULT '0',
23 activity_sector TEXT NOT NULL,
24 salaries TEXT NOT NULL,
25 paychecks TEXT NOT NULL,
26 laundered INTEGER,
27 reset_timestamp INTEGER,
28 prod_reset_timestamp BIGINT DEFAULT '0',
29 size BIGINT DEFAULT '0',
30 last_prod_reset_date TEXT NOT NULL,
31 last_leader_change TEXT NOT NULL,
32 busi_notes TEXT NOT NULL,
33 CONSTRAINT pk_user_business PRIMARY KEY(user_id),
34 CONSTRAINT fk_user_business_users FOREIGN KEY(user_id) REFERENCES vrp_users(id) ON DELETE CASCADE
35);
36]])
37
38--MySQL.createCommand("vRP/add_chestrank", "ALTER TABLE vrp_user_business ADD chest_rank INTEGER default NULL")
39
40MySQL.createCommand("vRP/create_business","INSERT IGNORE INTO vrp_user_business(user_id,name,description,capital,laundered,reset_timestamp,activity_sector,salaries,paychecks) VALUES(@user_id,@name,'',@capital,0,@time,@sector,@sal,'"..json.encode(cfg.default_paychecks).."')")
41MySQL.createCommand("vRP/delete_business","DELETE FROM vrp_user_business WHERE user_id = @user_id")
42MySQL.createCommand("vRP/get_business","SELECT vrp_user_business.* FROM vrp_user_business WHERE user_id = @user_id")
43MySQL.createCommand("vRP/get_business_name","SELECT name,activity_sector FROM vrp_user_business WHERE user_id = @user_id")
44MySQL.createCommand("vRP/add_capital","UPDATE vrp_user_business SET capital = capital + @capital WHERE user_id = @user_id")
45MySQL.createCommand("vRP/add_laundered","UPDATE vrp_user_business SET laundered = laundered + @laundered WHERE user_id = @user_id")
46MySQL.createCommand("vRP/get_business_page","SELECT user_id,name,description,capital FROM vrp_user_business ORDER BY capital DESC LIMIT @b,@n")
47MySQL.createCommand("vRP/reset_transfer","UPDATE vrp_user_business SET laundered = 0, reset_timestamp = @time WHERE user_id = @user_id")
48MySQL.createCommand("vRP/get_all_business","SELECT vrp_user_business.* FROM vrp_user_business")
49MySQL.createCommand("vRP/get_business_paychecks","SELECT paychecks FROM vrp_user_business WHERE user_id = @bus_id")
50MySQL.createCommand("vRP/get_busi_treasury","SELECT user_id,treasury FROM vrp_user_business")
51MySQL.createCommand("vRP/get_busi_salaries","SELECT user_id,salaries FROM vrp_user_business")
52MySQL.createCommand("vRP/update_treasury","UPDATE vrp_user_business SET treasury = @treas WHERE user_id = @bus_id")
53MySQL.createCommand("vRP/get_capital","SELECT capital FROM vrp_user_business WHERE user_id = @bus_id")
54MySQL.createCommand("vRP/update_busi_reset_prod","UPDATE vrp_user_business SET prod_reset_timestamp = @time, last_prod_reset_date = @date WHERE user_id = @bus_id")
55MySQL.createCommand("vRP/update_salaries","UPDATE vrp_user_business SET salaries = @sals WHERE user_id = @bus_id")
56MySQL.createCommand("vRP/update_paychecks","UPDATE vrp_user_business SET paychecks = @pay WHERE user_id = @bus_id")
57MySQL.createCommand("vRP/check_busi_name","SELECT user_id FROM vrp_user_business WHERE name = @bus_name")
58MySQL.createCommand("vRP/update_busi_notes","UPDATE vrp_user_business SET busi_notes = @notes WHERE user_id = @bus_id")
59MySQL.createCommand("vRP/get_busi_notes","SELECT busi_notes FROM vrp_user_business WHERE user_id = @bus_id")
60MySQL.createCommand("vRP/updateChestSize","UPDATE vrp_user_business SET size = @sizes WHERE user_id = @bus_id")
61MySQL.createCommand("vRP/updateChestRank","UPDATE vrp_user_business SET chest_rank = @ranks WHERE user_id = @bus_id")
62
63
64-- init
65MySQL.query("vRP/business_tables")
66--MySQL.query("vRP/add_chestrank")
67
68-- api
69
70-- cbreturn user business data or nil
71function vRP.getUserBusiness(user_id, cbr)
72 local task = Task(cbr)
73
74 if user_id ~= nil then
75 MySQL.query("vRP/get_business", {user_id = user_id}, function(rows, affected)
76 local business = rows[1]
77
78 -- when a business is fetched from the database, check for update of the laundered capital transfer capacity
79 if business and os.time() >= business.reset_timestamp+cfg.transfer_reset_interval*60 then
80 MySQL.query("vRP/reset_transfer", {user_id = user_id, time = os.time()})
81 business.laundered = 0
82 end
83
84 task({business})
85 end)
86 else
87 task()
88 end
89end
90
91function vRP.updateChestSize(busi_id,size)
92 if busi_id ~= nil and size ~= nil then
93 MySQL.query("vRP/updateChestSize", {sizes = size, bus_id = busi_id})
94 end
95end
96
97function update_chest_rank(busi_id,rank)
98 if busi_id ~= nil and rank ~= nil then
99 MySQL.query("vRP/updateChestRank", {ranks = rank, bus_id = busi_id})
100 end
101end
102
103function update_busi_notes(busi_id,note)
104 MySQL.query("vRP/update_busi_notes", {notes = note, bus_id = busi_id})
105end
106
107function get_busi_notes(busi_id, cbr)
108 local task = Task(cbr, {nil})
109 MySQL.query("vRP/get_busi_notes", {bus_id = busi_id}, function(rows, affected)
110 if #rows >= 1 then
111 task({rows[1].busi_notes})
112 else
113 task()
114 end
115 end)
116end
117
118function check_busi_name(name, cbr)
119 local task = Task(cbr, {false})
120 MySQL.query("vRP/check_busi_name", {bus_name = name}, function(rows, affected)
121 if #rows >= 1 then
122 task({true})
123 else
124 task()
125 end
126 end)
127end
128
129function vRP.getBusinessName(user_id, cbr)
130 local task = Task(cbr, {nil})
131
132 if user_id ~= nil then
133 MySQL.query("vRP/get_business_name", {user_id = user_id}, function(rows, affected)
134 local business = rows[1]
135 if business then
136 task({business})
137 else
138 task()
139 end
140 end)
141 else
142 task()
143 end
144end
145
146function vRP.getAllBusiness(cbr)
147 local task = Task(cbr, {nil})
148
149 MySQL.query("vRP/get_all_business", {}, function(rows, affected)
150 if #rows >= 1 then
151 task({rows})
152 else
153 task()
154 end
155 end)
156end
157
158-- close the business of an user
159function vRP.closeBusiness(user_id)
160 MySQL.query("vRP/delete_business", {user_id = user_id})
161end
162
163-- business interaction
164
165-- page start at 0
166local function open_business_directory(player,page) -- open business directory with pagination system
167 if page < 0 then page = 0 end
168
169 local menu = {name=lang.business.directory.title().." ("..page..")",css={top="75px",header_color="rgba(240,203,88,0.75)"}}
170
171 MySQL.query("vRP/get_business_page", {b = page*10, n = 10}, function(rows, affected)
172 local count = 0
173 for k,v in pairs(rows) do
174 count = count+1
175 local row = v
176
177 if row.user_id ~= nil then
178 -- get owner identity
179 vRP.getUserIdentity(row.user_id,function(identity)
180 if identity then
181 -- exclude special business => Medic busi
182 if row.name ~= "Los Santos Medical Center" then
183 menu[htmlEntities.encode(row.name)] = {function()end, lang.business.directory.info({row.capital,htmlEntities.encode(identity.name),htmlEntities.encode(identity.firstname),identity.registration,identity.phone})}
184 end
185 end
186
187 -- check end, open menu
188 count = count-1
189 if count == 0 then
190 menu[lang.business.directory.dnext()] = {function() open_business_directory(player,page+1) end}
191 menu[lang.business.directory.dprev()] = {function() open_business_directory(player,page-1) end}
192
193 vRP.openMenu(player,menu)
194 end
195 end)
196 end
197 end
198 end)
199end
200
201local function business_enter()
202 local source = source
203
204 local user_id = vRP.getUserId(source)
205 if user_id ~= nil then
206 -- build business menu
207 local menu = {name=lang.business.title(),css={top="75px",header_color="rgba(240,203,88,0.75)"}}
208
209 vRP.getBussinessPlayer(user_id, function(business)
210 if business and vRP.getRank(user_id) == 7 then -- have a business and is the leader !!
211 if vRP.isNotWorking(user_id) == nil then
212 -- access denied for medic leader
213 if not checkIfMedic(user_id) then
214 menu["Gestion entreprise"] = {function(player,choice)
215 ch_open_business_manage(player,user_id)
216 end,"Permet de gérer les aspects administratif de vôtre société"}
217 end
218 end
219 else
220 menu["Création entreprise"] = {function(player,choice)
221 vRP.getBussinessPlayer(user_id, function(busi)
222 if busi == nil then
223 ch_open_business_creator(player)
224 else
225 vRPclient.notify(player,{"~r~Vous ne pouvez pas créer d'entreprise si vous êtes déjà salarié !!"})
226 end
227 end)
228 end,"Permet d'enregistrer votre société auprès de la chambre du commerce"}
229 end
230
231 -- business list
232 menu[lang.business.directory.title()] = {function(player,choice)
233 open_business_directory(player,0)
234 end,lang.business.directory.description()}
235
236 -- open menu
237 vRP.openMenu(source,menu)
238 end)
239 end
240end
241
242local function business_leave()
243 vRP.closeMenu(source)
244end
245
246local function build_client_business(source) -- build the city hall area/marker/blip
247 local user_id = vRP.getUserId(source)
248 if user_id ~= nil then
249 for k,v in pairs(cfg.commerce_chambers) do
250 local x,y,z = table.unpack(v)
251
252 vRPclient.addBlip(source,{x,y,z,cfg.blip[1],cfg.blip[2],lang.business.title()})
253 vRPclient.addMarker(source,{x,y,z-1,0.7,0.7,0.5,0,255,125,125,150})
254
255 -- vRP.setArea(source,"vRP:business"..k,x,y,z,1,1.5,business_enter,business_leave)
256 vRP.setArea(source,"vRP:business"..k,x,y,z,1,1.5,business_enter,business_leave)
257 end
258 end
259end
260
261
262AddEventHandler("vRP:playerSpawn",function(user_id, source, first_spawn)
263 -- first spawn, build business
264 if first_spawn then
265 build_client_business(source)
266 end
267end)
268
269
270--====================================================================================
271--
272--
273--
274-- BILL SYSTEM
275--
276--
277--
278--====================================================================================
279
280-- sql
281
282MySQL.createCommand("vRP/bill_business", [[
283CREATE TABLE IF NOT EXISTS bill_business(
284 id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
285 busi_id BIGINT NOT NULL,
286 target_id BIGINT NOT NULL,
287 busi_name text,
288 bill_creator text,
289 bill_receiver text,
290 bill_date text,
291 bill_type text,
292 bill_reason text,
293 bill_amount text,
294 bill_state text,
295 bill_retry BIGINT NOT NULL DEFAULT '0'
296);
297]])
298
299MySQL.createCommand("vRP/get_existing_bill","SELECT bill_business.* FROM bill_business WHERE bill_business.busi_id = @bus_id AND bill_business.target_id = @id AND bill_business.bill_state = 'ATTENTE'")
300MySQL.createCommand("vRP/add_bill","INSERT INTO bill_business (busi_id, target_id, busi_name, bill_creator, bill_receiver, bill_date, bill_type, bill_reason, bill_amount, bill_state) VALUES(@id, @tid, @name, @creator, @receiver, @date, @type, @reason, @amount, @state)")
301MySQL.createCommand("vRP/update_bill","UPDATE bill_business SET bill_state = @state, bill_creator = @creator, bill_date = @date, bill_retry = @retry WHERE id = @bill_id")
302MySQL.createCommand("vRP/cancel_bill","UPDATE bill_business SET bill_state = 'ANNULE' WHERE id = @bill_id")
303MySQL.createCommand("vRP/get_bills","SELECT bill_business.* FROM bill_business WHERE bill_business.busi_id = @id")
304MySQL.createCommand("vRP/get_bills_filter","SELECT bill_business.* FROM bill_business WHERE bill_business.busi_id = @id AND bill_business.bill_state = @state")
305MySQL.createCommand("vRP/del_bills","DELETE FROM bill_business WHERE bill_business.busi_id = @id")
306
307-- init
308MySQL.query("vRP/bill_business")
309
310
311-- some business don't need to have bill menu so we filter them with this table
312-- values are business ID. This is special business so we need special ID to not nuke classical business
313-- DO NOT USE -1 VALUE !!
314local allowed_business_bill = {
315 ["Ambulancier"] = -2,
316}
317
318local wait_answer = false
319
320--====================================================================================
321-- MYSQL
322--====================================================================================
323
324function get_existing_bills(identifier,busi_id, cbr)
325 local task = Task(cbr, {{}})
326 MySQL.query("vRP/get_existing_bill", {id = identifier, bus_id = busi_id}, function(rows, affected)
327 if #rows > 0 then
328 task({rows})
329 else
330 task()
331 end
332 end)
333end
334
335local function add_bill(target_id,busi_name,busi_id,bill_state,bill_reason,bill_amount,bill_type,bill_sender,bill_receiver)
336 local bill_date = os.date("%d/%m/%Y %H:%M:%S")
337 MySQL.query("vRP/add_bill", {id = busi_id, tid = target_id, name = busi_name, creator = bill_sender, receiver = bill_receiver,
338 date = bill_date, type = bill_type, reason = bill_reason, amount = bill_amount, state = bill_state})
339end
340
341local function update_bill(id,bill_state,bill_sender,bill_retry)
342 local bill_date = os.date("%d/%m/%Y %H:%M:%S")
343 MySQL.query("vRP/update_bill", {state = bill_state, creator = bill_sender, date = bill_date, retry = bill_retry, bill_id = id})
344end
345
346local function cancel_bill(id)
347 MySQL.query("vRP/cancel_bill", {bill_id = id})
348end
349
350function del_bills(busi_id)
351 MySQL.query("vRP/del_bills", {id = busi_id})
352end
353
354function get_filtered_bills(identifier,filter,cbr)
355 local task = Task(cbr, {{}})
356 if filter == "TOUS" then
357 MySQL.query("vRP/get_bills", {id = identifier}, function(rows, affected)
358 if #rows > 0 then
359 task({rows})
360 else
361 task()
362 end
363 end)
364 else
365 MySQL.query("vRP/get_bills_filter", {id = identifier, state = filter}, function(rows, affected)
366 if #rows > 0 then
367 task({rows})
368 else
369 task()
370 end
371 end)
372 end
373end
374
375--====================================================================================
376-- Utils
377--====================================================================================
378
379local function ch_get_business_info(player,user_id,cbr)
380 local task = Task(cbr, {nil})
381 -- get name
382 local busi_name = ""
383 local busi_id = -1
384 for k,v in pairs(allowed_business_bill) do
385 if vRP.hasGroup(user_id, k) then
386 busi_name = k
387 busi_id = v
388 break
389 end
390 end
391
392 if busi_id == -1 then
393 -- look into business table if player belong to business
394 -- we be coded when the new business system will be made
395 vRP.getBussinessPlayer(user_id, function(busi)
396 if busi then
397 task({{name = busi.busi_name, id = busi.busi_id}})
398 else
399 vRPclient.notify(player,{"Impossible d'obtenir l'identifiant de votre entreprise !"})
400 task()
401 end
402 end)
403 else
404 task({{name = busi_name, id = busi_id}})
405 end
406end
407
408local function ch_user_allowed_menu(user_id,cbr)
409 local task = Task(cbr, {false})
410 -- get name
411 local result = false
412 for k,v in pairs(allowed_business_bill) do
413 if vRP.hasGroup(user_id, k) then
414 result = true
415 break
416 end
417 end
418
419 if not result then
420 -- look into business table if player belong to business. if yes then user can have business menu
421 vRP.getBussinessPlayer(user_id, function(busi)
422 if busi then
423 task({true})
424 else
425 task()
426 end
427 end)
428 else
429 task({true})
430 end
431end
432
433local function ch_make_bill(player,user_id,nplayer,nuser_id,name,id,reason,amount,type,update,retry)
434 vRP.getUserIdentity(user_id, function(identity)
435 -- get sender identity
436 bill_sender = identity.name.." "..identity.firstname
437 vRP.getUserIdentity(nuser_id, function(identityT)
438 -- get receiver identity
439 bill_receiver = identityT.name.." "..identityT.firstname
440
441 local amount_val = tonumber(amount)
442 if amount_val then
443 if amount_val <= 1000000 and amount_val > 0 then
444 -- calculate taxe
445 local tax = 0
446 if id == -5 then
447 -- special tax for avocat !!!
448 tax = vRP.getEarningValueByCat("justice_tax")
449 else
450 tax = vRP.getEarningValueByCat("div_buy_tax")
451 end
452 local amountTax = math.floor((amount_val * tax)/100)
453 local finalAmount = vRP.comma_value(amount + amountTax)
454 local amountToPay = math.floor(amountTax + amount_val)
455
456 -- we need to send bill message at the user
457 vRP.request(nplayer,htmlEntities.encode("[FACTURE] Vous devez payer "..finalAmount.."$ (taxe : "..tax.."%, soit "..vRP.comma_value(amount).." + "..vRP.comma_value(amountTax).."$) a "..bill_sender.." pour "..reason.." (virement bancaire autorise). Acceptez-vous ?"), 30, function(v,ok)
458 if ok then -- receiver accepted to pay bill
459 if vRP.tryFullPayment(nuser_id,amountToPay) then
460 vRPclient.notify(nplayer,{"~g~Facture payée ("..finalAmount.."$)"})
461 vRPclient.notify(player,{"~g~Le client a payé la facture de "..vRP.comma_value(amount).."$ ("..finalAmount.."$ TTC)"})
462 if update then
463 -- update bill
464 -- update value is the bill ID
465 retry = retry + 1
466 update_bill(update,"OK",bill_sender,retry)
467 else
468 add_bill(nuser_id,name,id,"OK",reason,amount,type,bill_sender,bill_receiver)
469 end
470 -- give tax to government
471 vRP.updateCityMoney(amountTax)
472
473 -- update productivity
474 vRP.getProductivityPlayer(user_id, function(prod_val)
475 prod_val = prod_val + amount_val
476 vRP.setProductivityPlayer(user_id,prod_val)
477
478 -- update business treasury
479 vRP.getBussinessPlayer(user_id, function(busi)
480 if busi then
481 if checkIfMedic(user_id) then
482 -- medic a special treatment all bills go to town !!
483 vRP.updateCityMoney(amount_val)
484 else
485 --vRP.addBusiTreasury(busi.busi_id,amount_val)
486 vRP.addMoneyBusiChest(busi.busi_id,amount_val)
487 end
488 else
489 vRPclient.notify(nplayer,{"~r~Impossible de déterminer ton entreprise. Rien n'est transmit"})
490 end
491
492 add_busi_book(busi.busi_id, "FACTURE", "ENTREE", "Facture de "..bill_sender.." Ã "..bill_receiver, amount_val)
493
494 wait_answer = false
495 end)
496 end)
497 else
498 vRPclient.notify(nplayer,{"~r~Fonds insufissants !!"})
499 -- receiver refused to pay.. Ask sender what he want to do
500 vRP.request(player,htmlEntities.encode("[FACTURE] Le client ne peut pas payer. Voulez-vous sauvegarder la facture en status ATTENTE ?"), 60, function(v,ok)
501 if ok then
502 if update then
503 -- update bill
504 -- update value is the bill ID
505 retry = retry + 1
506 update_bill(update,"ATTENTE",bill_sender,retry)
507 else
508 -- save bill in pending state
509 add_bill(nuser_id,name,id,"ATTENTE",reason,amount,type,bill_sender,bill_receiver)
510 end
511 else
512 if update then
513 -- update bill
514 -- update value is the bill ID
515 retry = retry + 1
516 update_bill(update,"ANNULE",bill_sender,retry)
517 else
518 -- save bill in pending state
519 add_bill(nuser_id,name,id,"ANNULE",reason,amount,type,bill_sender,bill_receiver)
520 end
521 end
522 wait_answer = false
523 end)
524 end
525 else
526 -- receiver refused to pay.. Ask sender what he want to do
527 vRP.request(player,htmlEntities.encode("[FACTURE] Le client a refuse de payer. Voulez-vous sauvegarder la facture en status ATTENTE ?"), 60, function(v,ok)
528 if ok then
529 if update then
530 -- update bill
531 -- update value is the bill ID
532 retry = retry + 1
533 update_bill(update,"ATTENTE",bill_sender,retry)
534 else
535 -- save bill in pending state
536 add_bill(nuser_id,name,id,"ATTENTE",reason,amount,type,bill_sender,bill_receiver)
537 end
538 else
539 if update then
540 -- update bill
541 -- update value is the bill ID
542 retry = retry + 1
543 update_bill(update,"ANNULE",bill_sender,retry)
544 else
545 -- save bill in pending state
546 add_bill(nuser_id,name,id,"ANNULE",reason,amount,type,bill_sender,bill_receiver)
547 end
548 end
549 wait_answer = false
550 end)
551 end
552 end)
553 else
554 vRPclient.notify(player,{"~o~La montant ne doit pas dépasser 1 000 000 $ et supérieur à 0 $"})
555 end
556 else
557 vRPclient.notify(player,{lang.common.invalid_value()})
558 end
559
560 end)
561 end)
562end
563
564-- pending bills
565local function ch_pay_older_bills(player,choice)
566 vRPclient.getNearestPlayer(player,{10},function(nplayer)
567 local nuser_id = vRP.getUserId(nplayer)
568 local user_id = vRP.getUserId(player)
569 if nuser_id and user_id then
570 ch_get_business_info(player,user_id, function(busi_info)
571 if busi_info then
572 get_existing_bills(nuser_id,busi_info.id,function(bills)
573 for k,m in ipairs(bills) do
574 vRPclient.notify(player,{"~o~Une facture de "..m.bill_creator.." du "..m.bill_date.." a été transmise. Montant : "..m.bill_amount.." $ ("..k.."/"..#bills..")."})
575 -- for each pending bills we will ask nearest player to pay them !!
576 wait_answer = true
577 ch_make_bill(player,user_id,nplayer,nuser_id,m.busi_name,m.busi_id,m.bill_reason,m.bill_amount,m.bill_type,m.id,m.bill_retry)
578
579 while wait_answer do
580 -- check status every 1 second
581 Citizen.Wait(1000)
582 end
583 end
584 end)
585 end
586 end)
587 else
588 vRPclient.notify(player,{lang.common.no_player_near()})
589 end
590 end)
591end
592
593-- bill
594local function ch_bill_player(player,choice)
595 vRPclient.getNearestPlayer(player,{10},function(nplayer)
596 local nuser_id = vRP.getUserId(nplayer)
597 local user_id = vRP.getUserId(player)
598 if nuser_id and user_id then
599
600 -- get existing bills, if existing bills then user must pay them before
601 ch_get_business_info(player,user_id, function(busi_info)
602 if busi_info then
603 vRP.prompt(player,"Raison de la facture","",function(player, reason)
604 vRP.prompt(player,"montant de la prestation","",function(player, amount)
605 ch_make_bill(player,user_id,nplayer,nuser_id,busi_info.name,busi_info.id,reason,amount,"IN",nil,nil)
606 end)
607 end)
608 end
609 end)
610 else
611 vRPclient.notify(player,{lang.common.no_player_near()})
612 end
613 end)
614end
615
616local function ch_get_bills_menu(player,user_id,filter)
617 ch_get_business_info(player,user_id, function(busi_info)
618 if busi_info then
619 get_filtered_bills(busi_info.id,filter, function(bills)
620 local finalbills = {}
621
622 for k,m in ipairs(bills) do
623 table.insert(finalbills, {id = m.id, target = m.target_id, busi = htmlEntities.encode(m.busi_name), sender = htmlEntities.encode(m.bill_creator),
624 receiver = htmlEntities.encode( m.bill_receiver), time = m.bill_date, _type = m.bill_type, msg = htmlEntities.encode(m.bill_reason),
625 amount = m.bill_amount, state = m.bill_state, retry = m.bill_retry})
626 end
627
628 TriggerClientEvent("business:updateBillGUI", player, finalbills)
629 end)
630 else
631 TriggerClientEvent("business:disableLoading", player)
632 end
633 end)
634end
635
636local function ch_cancel_bill_menu(player,user_id,id,filter)
637 if id ~= -1 then
638 cancel_bill(id)
639 vRPclient.notify(player,{"~g~Mise à jour des factures en cours.."})
640 Citizen.Wait(2000)
641 ch_get_business_info(player,user_id, function(busi_info)
642 if busi_info then
643 get_filtered_bills(busi_info.id,filter, function(bills)
644 local finalbills = {}
645
646 for k,m in ipairs(bills) do
647 table.insert(finalbills, {id = m.id, target = m.target_id, busi = htmlEntities.encode(m.busi_name), sender = htmlEntities.encode(m.bill_creator),
648 receiver = htmlEntities.encode( m.bill_receiver), time = m.bill_date, _type = m.bill_type, msg = htmlEntities.encode(m.bill_reason),
649 amount = m.bill_amount, state = m.bill_state, retry = m.bill_retry})
650 end
651
652 TriggerClientEvent("business:updateBillGUI", player, finalbills)
653 end)
654 else
655 TriggerClientEvent("business:disableLoading", player)
656 end
657 end)
658 else
659 TriggerClientEvent("business:disableLoading", player)
660 end
661end
662
663local function ch_make_illegal_bill(player,user_id,nuser_id,busi_name,busi_id,reason,bill_receiver)
664 vRP.getUserIdentity(user_id, function(identity)
665 -- get sender identity
666 bill_sender = identity.name.." "..identity.firstname
667 local _busi_id = busi_id
668 vRP.getUserBusiness(busi_id, function(business) -- update business data
669 if business then
670 local launder_left = math.min(business.capital-business.laundered,vRP.getInventoryItemAmount(user_id,"dirty_money")) -- compute launder capacity
671 vRP.prompt(player,lang.business.launder.prompt({launder_left}),""..launder_left,function(player,amount)
672 amount = parseInt(amount)
673
674 if amount then
675 if amount > launder_left then
676 amount = launder_left
677 end
678
679 if amount > 0 and amount <= launder_left then
680 if vRP.tryGetInventoryItem(user_id,"dirty_money",amount,false) then
681
682 local tax_p = vRP.getEarningValueByCat("div_buy_tax") -- de 0 Ã 100%
683 local amount_f = math.floor((amount*100)/(100+tax_p))
684 local amountTax = amount - amount_f
685 local accounting_amount = math.floor((amount_f * cfg.div_account))
686 local final_amount = amount_f - accounting_amount
687
688 -- add laundered amount
689 MySQL.query("vRP/add_laundered", {user_id = _busi_id, laundered = amount})
690
691 vRPclient.notify(player,{lang.business.launder.laundered({amount})})
692 add_bill(nuser_id,busi_name,busi_id,"OK",reason,final_amount,"IN",bill_sender,bill_receiver)
693
694 -- set productivity
695 vRP.getProductivityPlayer(user_id, function(prod_val)
696 prod_val = prod_val + final_amount
697 vRP.setProductivityPlayer(user_id,prod_val)
698 end)
699
700 -- give tax to government
701 vRP.updateCityMoney(amountTax)
702
703 -- add money to treasury
704 --vRP.addBusiTreasury(busi_id,final_amount)
705 vRP.addMoneyBusiChest(busi_id,final_amount)
706
707 add_busi_book(busi_id, "FACTURE", "ENTREE", "Facture de "..bill_sender.." à"..bill_receiver, final_amount)
708 else
709 vRPclient.notify(player,{lang.business.launder.not_enough()})
710 end
711 else
712 vRPclient.notify(player,{lang.common.invalid_value()})
713 end
714 else
715 vRPclient.notify(player,{lang.common.invalid_value()})
716 end
717 end)
718 else
719 vRPclient.notify(player,{"~r~Impossible de déterminer votre entreprise !"})
720 end
721 end)
722 end)
723end
724
725-- illegal bill
726local function ch_illegal_bill(player,choice)
727 local user_id = vRP.getUserId(player)
728 if user_id and vRP.getRank(user_id) >= 7 then
729 vRPclient.getNearestPlayer(player,{2},function(nplayer)
730 local nuser_id = vRP.getUserId(nplayer)
731 ch_get_business_info(player,user_id, function(busi_info)
732 if busi_info then
733 vRP.prompt(player,"Raison de la facture","",function(player, reason)
734 if nuser_id then
735 vRP.request(nplayer,htmlEntities.encode("[BLANCHIMENT] Voulez-vous que votre nom apparaisse sur une facture fictive pour un blanchiment d'argent ? "), 30, function(v,ok)
736 if ok then
737 vRP.getUserIdentity(nuser_id, function(identity)
738 local name = identity.name.." "..identity.firstname
739 ch_make_illegal_bill(player,user_id,-1,busi_info.name,busi_info.id,reason,name)
740 end)
741 else
742 vRPclient.notify(player,{"~r~La personne à côté de vous a refusée d'apparaitre sur votre fausse facture !"})
743 end
744 end)
745 else
746 vRP.prompt(player,"Saisir un nom (format : nom prenom) pour la facture","",function(player, name)
747 -- ask player to fill name
748 ch_make_illegal_bill(player,user_id,-1,busi_info.name,busi_info.id,reason,name)
749 end)
750 end
751 end)
752 end
753 end)
754 end)
755 end
756end
757
758local function ch_get_treasury(player,choice)
759 local user_id = vRP.getUserId(player)
760 if user_id and vRP.getRank(user_id) >= 6 then
761 vRP.getBussinessPlayer(user_id, function(busi)
762 if busi then
763 if vRP.getBusiTreasury(busi.busi_id) > 0 then
764 local busi_treas = "INCONNU"
765
766 if business_treasury[busi.busi_id] then
767 busi_treas = tostring(business_treasury[busi.busi_id])
768 end
769 vRP.prompt(player,"Combien voulez-vous retirer de la trésorerie ? (montant disponible : "..busi_treas.." $)","",function(player, amount)
770 amount = parseInt(amount)
771
772 if amount and amount > 0 then
773 vRP.prompt(player,"Saisir la raison du retrait","",function(player, reason)
774 if (vRP.getBusiTreasury(busi.busi_id) - amount) < 0 then
775 -- no more money !!
776 amount = vRP.getBusiTreasury(busi.busi_id)
777 vRPclient.notify(player,{"~o~Le montant demandé est supérieur au solde disponible : "..amount.." $"})
778 end
779
780 if vRP.reduceBusiTreasury(busi.busi_id,amount) then
781 vRP.getUserIdentity(user_id, function(identity)
782 vRP.giveBankMoney(user_id,amount)
783 local name = identity.name.." "..identity.firstname
784 log_discord(user_id,"RETRAIT TRESORERIE pour le joueur : ","MONTANT : "..amount,name)
785 add_busi_book(busi.busi_id, "RETRAIT", "SORTIE", "Retrait d'argent de la trésorerie par "..name.." | Raison : "..reason, amount)
786 vRPclient.notify(player,{"~g~Vous avez reçu : "..amount.." $ de votre entreprise !"})
787 end)
788 else
789 vRPclient.notify(player,{"~r~Une erreur est survenue lors de l'obtention de l'argent !"})
790 end
791 end)
792 else
793 vRPclient.notify(player,{lang.common.invalid_value()})
794 end
795 end)
796
797 else
798 vRPclient.notify(player,{"~r~La trésorerie est à 0$ !"})
799 end
800 else
801 vRPclient.notify(player,{"~r~Impossible d'obtenir l'identifiant de votre entreprise !"})
802 end
803 end)
804 end
805end
806
807function ch_get_busi_notes(player,choice)
808 -- display aptitudes
809 local user_id = vRP.getUserId(player)
810 if user_id ~= nil then
811 vRP.getBussinessPlayer(user_id, function(busi)
812 if busi then
813
814 if busi_notes[player] then -- hide
815 busi_notes[player] = nil
816 vRPclient.removeDiv(player,{"busi_player_notes"})
817 end
818
819 local content = "<h2>Notes de l'entreprise "..busi.busi_name.." : </h2><br />"
820
821 get_busi_notes(busi.busi_id, function(notes)
822 if notes then
823 content = content..""..notes.."<br />"
824 content = content.."<br /> 🔙 <small>".."APPUYEZ SUR [BACKSPACE] POUR FERMER".."</small><br />"
825 busi_notes[player] = true
826 vRPclient.setDiv(player,{"busi_player_notes",cfg.busi_player_notes, content})
827 else
828 vRPclient.notify(player,{"~r~Impossible d'obtenir les notes de ton entreprise !"})
829 end
830 end)
831
832 else
833 vRPclient.notify(player,{"~r~Impossible de déterminer ton entreprise !"})
834 end
835 end)
836 end
837end
838
839function ch_set_busi_notes(player,choice)
840 local user_id = vRP.getUserId(player)
841 if user_id ~= nil then
842 vRP.getBussinessPlayer(user_id, function(busi)
843 if busi then
844 get_busi_notes(busi.busi_id, function(notes)
845 if notes == nil then
846 notes = ""
847 end
848 -- input
849 vRP.prompt(player,"Notes pour l'entreprise "..busi.busi_name,notes,function(player,text)
850 if text then
851 -- SQL
852 update_busi_notes(busi.busi_id,text)
853 vRPclient.notify(player,{"~g~Note de l'entreprise définie !"})
854 else
855 vRPclient.notify(player,{"~r~teste invalid !"})
856 end
857 end)
858 end)
859 else
860 vRPclient.notify(player,{"~r~Impossible de déterminer ton entreprise !"})
861 end
862 end)
863 end
864end
865
866function ch_remove_busi_notes(player,choice)
867 local user_id = vRP.getUserId(player)
868 if user_id ~= nil then
869 vRP.getBussinessPlayer(user_id, function(busi)
870 if busi then
871 -- SQL
872 update_busi_notes(busi.busi_id,"")
873 vRPclient.notify(player,{"~g~Note de l'entreprise supprimée !"})
874 else
875 vRPclient.notify(player,{"~r~Impossible de déterminer ton entreprise !"})
876 end
877 end)
878 end
879end
880
881function ch_change_minrank_busichest(player,choice)
882 local user_id = vRP.getUserId(player)
883 if user_id ~= nil then
884 vRP.getBussinessPlayer(user_id, function(busi)
885 if busi then
886 vRP.getUserBusiness(busi.busi_id, function(business)
887 if business then
888 if business.chest_rank ~= nil then
889 vRPclient.notify(player,{"~g~Le rang actuel est : "..business.chest_rank})
890 else
891 vRPclient.notify(player,{"~r~Aucun rang n'est defini pour le moment"})
892 end
893 --input rank
894 vRP.prompt(player,"Rang minimum pour sortir des objets du coffre (entre 0 et 7) : ","",function(player,rank)
895 rank = parseInt(rank)
896 if rank then
897 if (rank >= 0) and (rank <= 7) then
898 --SQL update column chest_rank
899 update_chest_rank(busi.busi_id,tonumber(rank))
900 else
901 vRPclient.notify(player,{"~r~rang invalide !"})
902 end
903 else
904 vRPclient.notify(player,{"~r~rang invalide !"})
905 end
906 end)
907 end
908 end)
909 end
910 end)
911 end
912end
913
914--====================================================================================
915-- GUI
916--====================================================================================
917
918local function ch_manage_busi(player,choice)
919 local user_id = vRP.getUserId(player)
920 if user_id and vRP.getRank(user_id) >= 6 then
921 vRP.getBussinessPlayer(user_id, function(busi)
922 if busi then
923 vRP.getUserBusiness(busi.busi_id, function(business)
924 if business then
925 local cap = vRP.comma_value(business.capital)
926 local paycheck = {}
927 local paycheck_table = {}
928 local is_medic = checkIfMedic(user_id)
929
930 if is_medic then
931 local value
932 for i=1,6 do
933 -- get salaries value from governor table
934 value = vRP.getOutgoingValueByCat("emergency_rank_"..i)
935 table.insert(paycheck_table, {pay = value, name = "rank_"..i})
936 end
937 else
938 paycheck = json.decode(business.paychecks)
939 end
940
941 for k,v in pairs(paycheck) do
942 table.insert(paycheck_table, {pay = v, name = k})
943 end
944
945 -- get job offers for the current busi
946 get_busi_job_offers(busi.busi_id, function(offers)
947 -- get request to job offers related to current busi
948 get_job_requests(busi.busi_id, function(offers_reqs)
949
950 local salary_table = {}
951 local count = 0
952 local busi_salaries = json.decode(business.salaries)
953 for k,v in pairs(busi_salaries) do
954 count=count+1
955
956 vRP.getUserIdentity(k, function(identity)
957 vRP.getProductivityPlayer(k,function(prod_val)
958 local nametmp = htmlEntities.encode(identity.firstname).." "..htmlEntities.encode(identity.name)
959 local paych
960 if v == 7 then
961 paych = "AUCUN"
962 else
963 paych = paycheck["rank_"..v]
964 end
965 table.insert(salary_table, {name = nametmp, prod = prod_val, rank = v, sal_id = k, pay = paych})
966 -- wait a bit to slow process
967 Citizen.Wait(20)
968
969 count=count-1
970 --check end to avoid async spam ..
971 if count == 0 then
972 TriggerClientEvent("business:activateMenu", player, cap, business.name, business.activity_sector, business.user_id, business.last_prod_reset_date,
973 salary_table,business_treasury[busi.busi_id],paycheck_table,offers,offers_reqs,nil,is_medic)
974 end
975 end)
976 end)
977 end
978
979 end)
980 end)
981 else
982 vRPclient.notify(player,{"~r~Impossible de déterminer votre entreprise !"})
983 end
984 end)
985
986 else
987 vRPclient.notify(player,{"~r~Impossible d'obtenir l'identifiant de votre entreprise !"})
988 end
989 end)
990 else
991 vRPclient.notify(player,{"~r~Vous n'avez pas l'autorisation nécessaire pour accéder au menu !"})
992 end
993end
994
995local function ch_busi_book(player,choice)
996 local user_id = vRP.getUserId(player)
997 if user_id then
998 vRP.ch_create_book_busi(player,user_id)
999 end
1000end
1001
1002local function ch_busi_chest(player,choice)
1003 local player = player
1004 local user_id = vRP.getUserId(player)
1005 if user_id then
1006 vRP.getUserBusiness(user_id, function(business)
1007 if business then
1008 if business.size == 0 then
1009 vRP.request(player,"Vous souhaitez acheter un coffre pour votre entreprise pour "..cfg.chestprice..", voulez vous continuer ?", 60, function(v,ok)
1010 if ok then
1011 if vRP.tryPayment(user_id,cfg.chestprice) then
1012 vRP.updateChestSize(user_id,100)
1013 vRPclient.notify(player,{"~g~Coffre mis en place!"})
1014 else
1015 vRPclient.notify(player,{"~r~Vous n'avez pas assez d'argent sur vous!"})
1016 end
1017 end
1018 end)
1019 else
1020 vRPclient.notify(player,{"~r~Votre entreprise à deja un coffre !"})
1021 end
1022 else
1023 vRPclient.notify(player,{"~r~Vous n'est pas PDG d'une d'entreprise !"})
1024 end
1025 end)
1026 end
1027end
1028--====================================================================================
1029-- Menu
1030--====================================================================================
1031
1032vRP.registerMenuBuilder("main", function(add, data)
1033 local player = data.player
1034
1035 local user_id = vRP.getUserId(player)
1036 if user_id ~= nil then
1037 local choices = {}
1038
1039 ch_user_allowed_menu(user_id, function(allowed)
1040 if allowed then
1041 choices["ðŸ Entreprise"] = {function(player,choice)
1042
1043 vRP.buildMenu("entreprise", {player = player}, function(menu)
1044 menu.name = "Entreprise"
1045 menu.css = {top="75px",header_color="rgba(0,125,255,0.75)"}
1046
1047 if vRP.isNotWorking(user_id) == nil then
1048 -- busi actions are allowed only if player is working !!
1049 if vRP.getRank(user_id) >= 6 then
1050 menu["Administration"] = {ch_manage_busi,"Administrer l'entreprise."}
1051 menu["Livret de compte"] = {ch_busi_book,"Accéder au livret de compte."}
1052 menu["Acheter coffre"] = {ch_busi_chest,"Acheter coffre entreprise"}
1053 if not checkIfMedic(user_id) then
1054 menu["Retrait trésorerie"] = {ch_get_treasury,"Retirer de l'argent de la trésorerie."}
1055 menu["Changement rang coffre"] = {ch_change_minrank_busichest, "Changer le rang minimum pour sortir des items de l'inventaire"}
1056 end
1057 menu["Note Creation"] = {ch_set_busi_notes,"Créer une note pour l'entreprise."}
1058 menu["Note Suppression"] = {ch_remove_busi_notes,"Supprimer une note pour l'entreprise."}
1059 end
1060
1061 if vRP.getRank(user_id) >= 7 then --PDG only : can laundering money
1062 menu["Blanchiment"] = {ch_illegal_bill,"Faites de fausses factures pour blanchir de l'argent sale."}
1063 end
1064
1065 menu["Note de l'entreprise"] = {ch_get_busi_notes,"Accéder aux notes de l'entreprise."}
1066 menu["Facturer"] = {ch_bill_player,"Facturer le joueur le plus proche."}
1067 menu["Rappel Facture"] = {ch_pay_older_bills,"Effectuer le paiement des factures en ATTENTE pour le joueur le plus proche."}
1068 menu["Quitter Service"] = {ch_job_state_switch,"Désactiver votre service"}
1069 else
1070 menu["Reprendre Service"] = {ch_job_state_switch,"Activer votre service"}
1071 end
1072
1073
1074 local _player = player
1075 vRPclient.isInComa(_player,{}, function(in_coma)
1076 if not in_coma then
1077 vRP.openMenu(_player,menu)
1078 end
1079 end)
1080
1081 end)
1082 end}
1083 end
1084 add(choices)
1085 end)
1086 end
1087end)
1088
1089RegisterServerEvent('business:quick')
1090AddEventHandler('business:quick', function(type, value)
1091 local Source = source
1092 local user_id = vRP.getUserId(Source)
1093 local _type = type
1094 if user_id ~= nil then
1095 if _type == "bills" then ch_get_bills_menu(Source,user_id,value) end
1096 if _type == "dismiss" then
1097 if tonumber(user_id) ~= tonumber(value) then
1098 ch_fire_salary(Source,value,true,true,nil,true,false)
1099 else
1100 vRPclient.notify(Source,{"~r~L'auto-licenciement ?? So 2000"})
1101 TriggerClientEvent("business:disableLoading", Source)
1102 end
1103 end
1104 if _type == "reset_prod" then
1105 ch_reset_prod(Source,value)
1106 end
1107 if _type == "employee_tel" then
1108 if tonumber(user_id) ~= tonumber(value) then
1109 ch_busi_employee_tel(Source,value)
1110 else
1111 vRPclient.notify(Source,{"~r~Impossible d'ajouter votre propre N° !"})
1112 TriggerClientEvent("business:disableLoading", Source)
1113 end
1114 end
1115 if _type == "change_lead" then
1116 if tonumber(user_id) ~= tonumber(value) then
1117 ch_change_leader(Source,value)
1118 else
1119 vRPclient.notify(Source,{"~r~Une erreur est survenue"})
1120 end
1121 end
1122 if _type == "remove_offer" then ch_remove_offer(Source,user_id,value) end
1123 end
1124end)
1125
1126RegisterServerEvent('business:set_value')
1127AddEventHandler('business:set_value', function(type, value, param)
1128 local Source = source
1129 local _value = value
1130 local _param = param
1131 local user_id = vRP.getUserId(Source)
1132 local _type = type
1133 if user_id ~= nil then
1134 if _type == "cancel" then ch_cancel_bill_menu(Source,user_id,_value,_param) end
1135 if _type == "prime" then ch_give_prime(Source,user_id,_value,_param) end
1136 if _type == "rank" then ch_give_rank(Source,user_id,_value,_param) end
1137 if _type == "paycheck" then ch_set_paycheck(Source,user_id,_value,_param) end
1138 end
1139end)
1140
1141
1142--====================================================================================
1143--
1144--
1145--
1146-- BUSINNESS MANAGEMENT SYSTEM
1147--
1148--
1149--
1150--====================================================================================
1151
1152-- sql
1153
1154MySQL.createCommand("vRP/job_offers", [[
1155CREATE TABLE IF NOT EXISTS job_offers(
1156 id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
1157 busi_id BIGINT NOT NULL,
1158 busi_name text,
1159 busi_sector text,
1160 job_creator text,
1161 job_rank BIGINT NOT NULL,
1162 job_date text,
1163 job_desc text,
1164 job_reason text
1165);
1166]])
1167
1168MySQL.createCommand("vRP/job_request", [[
1169CREATE TABLE IF NOT EXISTS job_request(
1170 id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
1171 job_offers_id BIGINT NOT NULL,
1172 user_id BIGINT NOT NULL,
1173 req_name text,
1174 req_date text,
1175 req_msg text,
1176 req_state text,
1177 req_tel text
1178);
1179]])
1180
1181MySQL.createCommand("vRP/busi_book", [[
1182CREATE TABLE IF NOT EXISTS busi_book(
1183 id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
1184 busi_id BIGINT NOT NULL,
1185 date_timestamp BIGINT NOT NULL,
1186 tag text,
1187 type text,
1188 date text,
1189 message text,
1190 amount BIGINT NOT NULL
1191);
1192]])
1193
1194
1195-- init
1196MySQL.query("vRP/job_offers")
1197MySQL.query("vRP/job_request")
1198MySQL.query("vRP/busi_book")
1199
1200MySQL.createCommand("vRP/add_job_offer","INSERT INTO job_offers (busi_id, busi_name, busi_sector, job_creator, job_rank, job_date, job_desc, job_reason) VALUES(@id, @name, @sector, @creator, @rank, @date, @desc, @reason)")
1201MySQL.createCommand("vRP/add_job_request","INSERT INTO job_request (job_offers_id, user_id, req_name, req_date, req_msg, req_state, req_tel) VALUES(@job_id, @id, @name, @date, @msg, 'ATTENTE', @tel)")
1202MySQL.createCommand("vRP/get_job_offers","SELECT job_offers.* FROM job_offers")
1203MySQL.createCommand("vRP/get_busi_job_offers","SELECT job_offers.* FROM job_offers WHERE busi_id = @bus_id")
1204MySQL.createCommand("vRP/get_job_requests","SELECT job_request.* FROM job_request WHERE job_offers_id IN (SELECT job_offers.id FROM job_offers WHERE busi_id = @id) AND req_state = 'ATTENTE'")
1205MySQL.createCommand("vRP/check_job_offers","SELECT job_offers.id FROM job_offers WHERE busi_id = @bus_id AND job_rank = @rank")
1206MySQL.createCommand("vRP/get_job_offer_by_req","SELECT job_offers.* FROM job_offers WHERE id IN (SELECT job_request.job_offers_id FROM job_request WHERE id = @uid)")
1207MySQL.createCommand("vRP/del_related_req","DELETE FROM job_request WHERE user_id = @id")
1208MySQL.createCommand("vRP/update_related_req","UPDATE job_request SET req_state = 'REFUSE' WHERE id = @uid")
1209MySQL.createCommand("vRP/get_job_req_by_user","SELECT job_request.* FROM job_request WHERE user_id = @id")
1210MySQL.createCommand("vRP/del_req_by_id","DELETE FROM job_request WHERE id = @uid")
1211MySQL.createCommand("vRP/get_busi_id_offer","SELECT busi_id,job_reason FROM job_offers WHERE id = @uid")
1212MySQL.createCommand("vRP/del_offers_by_busi","DELETE FROM job_offers WHERE busi_id = @bus_id")
1213MySQL.createCommand("vRP/get_offer_by_id","SELECT job_offers.* FROM job_offers WHERE id = @uid")
1214MySQL.createCommand("vRP/del_offer_by_id","DELETE FROM job_offers WHERE id = @uid")
1215MySQL.createCommand("vRP/del_req_by_offer_id","DELETE FROM job_request WHERE job_offers_id = @uid")
1216MySQL.createCommand("vRP/get_req_by_offer_id","SELECT user_id,req_tel FROM job_request WHERE job_offers_id = @uid")
1217MySQL.createCommand("vRP/add_busi_book","INSERT INTO busi_book (busi_id, date_timestamp, tag, type, date, amount, message) VALUES(@id, @time, @tag, @type, @date, @amount, @msg)")
1218MySQL.createCommand("vRP/del_busi_book","DELETE FROM busi_book WHERE busi_id = @bus_id")
1219MySQL.createCommand("vRP/get_busi_book_date","SELECT busi_book.* FROM busi_book WHERE busi_id = @bus_id AND tag LIKE @tag AND type LIKE @type AND date_timestamp >= @date AND date_timestamp <= @date2")
1220MySQL.createCommand("vRP/update_leader_change","UPDATE vrp_user_business SET last_leader_change = @date WHERE user_id = @bus_id")
1221MySQL.createCommand("vRP/get_leader_change","SELECT last_leader_change FROM vrp_user_business WHERE user_id = @bus_id")
1222MySQL.createCommand("vRP/change_leader","UPDATE bill_business SET busi_id = @new_id WHERE busi_id = @old_id;UPDATE busi_book SET busi_id = @new_id WHERE busi_id = @old_id;UPDATE job_offers SET busi_id = @new_id WHERE busi_id = @old_id;UPDATE vrp_user_business SET user_id = @new_id WHERE user_id = @old_id;")
1223
1224
1225
1226business_treasury = {}
1227local business_debug = false
1228
1229local busi_salaries = {}
1230
1231local business_wait_group = {}
1232local business_wait_business = {}
1233local business_wait_rank = {}
1234local can_remove_from_busi = {}
1235
1236--====================================================================================
1237-- MYSQL
1238--====================================================================================
1239
1240function del_busi_book(busi_id)
1241 _____business_debug("suppression livret de compte pour entreprise "..busi_id)
1242 MySQL.query("vRP/del_busi_book", {bus_id = busi_id})
1243end
1244
1245function get_busi_book_date(busi_id,_tag,_type,_date,_date2, cbr)
1246 local task = Task(cbr, {{}})
1247 MySQL.query("vRP/get_busi_book_date", {bus_id = busi_id, tag = _tag, type = _type, date = _date, date2 = _date2}, function(rows, affected)
1248 if #rows > 0 then
1249 task({rows})
1250 else
1251 task()
1252 end
1253 end)
1254end
1255
1256-- update leader change timer
1257function update_leader_timer(time,user_id)
1258 MySQL.query("vRP/update_leader_change", {date = time, bus_id = user_id})
1259end
1260
1261function change_leader(new_user_id,old_user_id)
1262 MySQL.query("vRP/change_leader", {new_id = new_user_id, old_id = old_user_id})
1263end
1264
1265function vRP.get_leader_change(user_id, cbr)
1266 local task = Task(cbr, {nil})
1267 MySQL.query("vRP/get_leader_change", {bus_id = user_id}, function(rows, affected)
1268 if #rows >= 1 then
1269 task({rows[1].last_leader_change})
1270 else
1271 task()
1272 end
1273 end)
1274end
1275
1276function add_busi_book(busi_id, _tag, _type, message, _amount)
1277 local _time = os.time()
1278 local _date = os.date("%d/%m/%Y %H:%M:%S")
1279 _____business_debug("insertion livre de compte : "..message.." ".._date)
1280 MySQL.query("vRP/add_busi_book", {id = busi_id, time = _time, tag = _tag, type = _type, msg = message, date = _date, amount = _amount})
1281end
1282
1283function set_busi_paychecks(busi_id, paychecks)
1284 _____business_debug("save paychecks "..busi_id)
1285 MySQL.query("vRP/update_paychecks", {bus_id = busi_id, pay = paychecks})
1286end
1287
1288function get_busi_paychecks(busi_id, cbr)
1289 local task = Task(cbr, {{}})
1290 MySQL.query("vRP/get_business_paychecks", {bus_id = busi_id}, function(rows, affected)
1291 if #rows > 0 then
1292 task({rows[1]})
1293 else
1294 task()
1295 end
1296 end)
1297end
1298
1299function get_busi_id_offer(offer_id, cbr)
1300 local task = Task(cbr, {nil})
1301 MySQL.query("vRP/get_busi_id_offer", {uid = offer_id}, function(rows, affected)
1302 if #rows > 0 then
1303 task({rows[1]})
1304 else
1305 task()
1306 end
1307 end)
1308end
1309
1310function get_offer_by_id(offer_id, cbr)
1311 local task = Task(cbr, {nil})
1312 MySQL.query("vRP/get_offer_by_id", {uid = offer_id}, function(rows, affected)
1313 if #rows > 0 then
1314 task({rows[1]})
1315 else
1316 task()
1317 end
1318 end)
1319end
1320
1321function check_job_offers(busi_id,_rank, cbr)
1322 local task = Task(cbr, {nil})
1323 MySQL.query("vRP/check_job_offers", {bus_id = busi_id, rank = _rank}, function(rows, affected)
1324 if #rows > 0 then
1325 task({rows[1]})
1326 else
1327 task()
1328 end
1329 end)
1330end
1331
1332function get_job_offer_by_req(req_id, cbr)
1333 local task = Task(cbr, {nil})
1334 MySQL.query("vRP/get_job_offer_by_req", {uid = req_id}, function(rows, affected)
1335 if #rows > 0 then
1336 task({rows[1]})
1337 else
1338 task()
1339 end
1340 end)
1341end
1342
1343function get_job_req_by_user(user_id, cbr)
1344 local task = Task(cbr, {{}})
1345 MySQL.query("vRP/get_job_req_by_user", {id = user_id}, function(rows, affected)
1346 if #rows > 0 then
1347 task({rows})
1348 else
1349 task()
1350 end
1351 end)
1352end
1353
1354function get_req_by_offer_id(user_id, cbr)
1355 local task = Task(cbr, {{}})
1356 MySQL.query("vRP/get_req_by_offer_id", {uid = user_id}, function(rows, affected)
1357 if #rows > 0 then
1358 task({rows})
1359 else
1360 task()
1361 end
1362 end)
1363end
1364
1365function del_offer_by_id(id)
1366 _____business_debug("suppression offre ayant pour id "..id)
1367 MySQL.query("vRP/del_offer_by_id", {uid = id})
1368end
1369
1370function del_req_by_offer_id(id)
1371 _____business_debug("suppression resquests ayant pour offer id "..id)
1372 MySQL.query("vRP/del_req_by_offer_id", {uid = id})
1373end
1374
1375function del_related_req(user_id)
1376 _____business_debug("suppression resquests pour le joueur "..user_id)
1377 MySQL.query("vRP/del_related_req", {id = user_id})
1378end
1379
1380function del_req_by_id(id)
1381 _____business_debug("suppression resquests ayant pour id "..id)
1382 MySQL.query("vRP/del_req_by_id", {uid = id})
1383end
1384
1385function del_offers_by_busi(busi_id)
1386 _____business_debug("suppression des offres pour l'entreprise ayant pour id "..busi_id)
1387 MySQL.query("vRP/del_offers_by_busi", {bus_id = busi_id})
1388end
1389
1390function set_busi_treasury(busi_id, treasury)
1391 _____business_debug("save tresorie "..busi_id.." "..treasury)
1392 MySQL.query("vRP/update_treasury", {bus_id = busi_id, treas = treasury})
1393end
1394
1395function update_related_req(req_id)
1396 _____business_debug("update offer resquest to REFUSED "..req_id)
1397 MySQL.query("vRP/update_related_req", {uid = req_id})
1398end
1399
1400function set_busi_salaries(busi_id, salaries)
1401 _____business_debug("save salaries "..busi_id)
1402 MySQL.query("vRP/update_salaries", {bus_id = busi_id, sals = salaries})
1403end
1404
1405function get_busi_treasuries(cbr)
1406 local task = Task(cbr, {{}})
1407 MySQL.query("vRP/get_busi_treasury", {}, function(rows, affected)
1408 if #rows > 0 then
1409 task({rows})
1410 else
1411 task()
1412 end
1413 end)
1414end
1415
1416function get_busi_salaries(cbr)
1417 local task = Task(cbr, {{}})
1418 MySQL.query("vRP/get_busi_salaries", {}, function(rows, affected)
1419 if #rows > 0 then
1420 task({rows})
1421 else
1422 task()
1423 end
1424 end)
1425end
1426
1427function add_job_offer(busi_id, busi_name, busi_sector, job_creator, job_rank, job_date, job_desc, job_reason)
1428 MySQL.query("vRP/add_job_offer", {id = busi_id, name = busi_name, sector = busi_sector, creator = job_creator, rank = job_rank, date = job_date, desc = job_desc, reason = job_reason})
1429end
1430
1431function get_job_offers(cbr)
1432 local task = Task(cbr, {{}})
1433 MySQL.query("vRP/get_job_offers", {}, function(rows, affected)
1434 if #rows > 0 then
1435 task({rows})
1436 else
1437 task()
1438 end
1439 end)
1440end
1441
1442function get_busi_job_offers(busi_id, cbr)
1443 local task = Task(cbr, {{}})
1444 MySQL.query("vRP/get_busi_job_offers", {bus_id = busi_id}, function(rows, affected)
1445 if #rows > 0 then
1446 task({rows})
1447 else
1448 task()
1449 end
1450 end)
1451end
1452
1453function add_job_request(job_offers_id, user_id, req_name, req_date, req_msg, req_tel)
1454 MySQL.query("vRP/add_job_request", {job_id = job_offers_id, id = user_id, name = req_name, date = req_date, msg = req_msg, tel = req_tel})
1455end
1456
1457function get_job_requests(busi_id,cbr)
1458 local task = Task(cbr, {{}})
1459 MySQL.query("vRP/get_job_requests", {id = busi_id}, function(rows, affected)
1460 if #rows > 0 then
1461 task({rows})
1462 else
1463 task()
1464 end
1465 end)
1466end
1467
1468function get_capital(busi_id,cbr)
1469 local task = Task(cbr, {0})
1470 MySQL.query("vRP/get_capital", {bus_id = busi_id}, function(rows, affected)
1471 if #rows > 0 then
1472 task({rows[1]})
1473 else
1474 task()
1475 end
1476 end)
1477end
1478
1479function set_busi_reset_prod(busi_id, prod_reset_timestamp, last_prod_reset_date)
1480 _____business_debug("business prod reset "..busi_id.." ---- "..prod_reset_timestamp.." | "..last_prod_reset_date)
1481 MySQL.query("vRP/update_busi_reset_prod", {bus_id = busi_id, time = prod_reset_timestamp, date = last_prod_reset_date})
1482end
1483
1484--====================================================================================
1485-- UTILS
1486--====================================================================================
1487
1488function _____business_debug(msg)
1489 if business_debug then
1490 msg = "BUSINESS : " .. tostring(msg)
1491 print(msg)
1492 end
1493end
1494
1495-- log into discord some actions (to avoid money glitch with treasury)
1496-- becasue treasuries are savec every 2 minutes on database
1497-- so users can try to get lot of money and wait restart which can reset treasury to older value..
1498function log_discord(user_id,msg,amount,name)
1499 Citizen.CreateThread(function()
1500 if cfg_base.is_server_prod then
1501 if name then
1502 local final_msg = "["..os.date("%d/%m/%Y %H:%M:%S").."] => "..msg..user_id.." "..name.." "..amount
1503 PerformHttpRequest('https://discordapp.com/api/webhooks/385120999831633921/cvZSGtKTSHN9wc_iC52PVQsLCoGE3oEVy4Wp0Ffj5zrgnFN7gRk-sKfBa-uu1EFUMVGW',
1504 function(err, text, headers) end, 'POST', json.encode({username = "Business Watcher", content = final_msg}), { ['Content-Type'] = 'application/json' })
1505 else
1506 vRP.getUserIdentity(tonumber(user_id), function(identity)
1507 local name
1508 if identity then
1509 name = "( "..identity.name.." "..identity.firstname.." )"
1510 else
1511 name "( identitée inconnue )"
1512 end
1513
1514 local final_msg = "["..os.date("%d/%m/%Y %H:%M:%S").."] => "..msg..user_id.." "..name.." "..amount
1515 PerformHttpRequest('https://discordapp.com/api/webhooks/385120999831633921/cvZSGtKTSHN9wc_iC52PVQsLCoGE3oEVy4Wp0Ffj5zrgnFN7gRk-sKfBa-uu1EFUMVGW',
1516 function(err, text, headers) end, 'POST', json.encode({username = "Business Watcher", content = final_msg}), { ['Content-Type'] = 'application/json' })
1517 end)
1518 end
1519 end
1520 end)
1521end
1522log_discord("","==========DEMARRAGE SERVER==========","","")
1523
1524
1525-- save treasuries
1526function save_busi_treasury()
1527 -- for each business we save treasury
1528 for k,v in pairs(business_treasury) do
1529 set_busi_treasury(k,v)
1530 end
1531 -- waiting 20 seconds (default 2 minutes)
1532 SetTimeout(20000, save_busi_treasury)
1533end
1534SetTimeout(30000, save_busi_treasury)
1535
1536-- init treasuries at server start
1537function init_busi_treasury()
1538 get_busi_treasuries(function(busi_treasuries)
1539 for k,v in ipairs(busi_treasuries) do
1540 _____business_debug("init busines teasury "..v.user_id.. " | "..v.treasury)
1541 business_treasury[v.user_id] = v.treasury
1542 end
1543 end)
1544end
1545SetTimeout(5000, init_busi_treasury)
1546
1547
1548-- init salaries at server start
1549function init_busi_salaries()
1550 get_busi_salaries(function(business)
1551 for k,v in ipairs(business) do
1552 busi_salaries[v.user_id] = json.decode(v.salaries)
1553 _____business_debug("init busines salaries "..v.user_id)
1554 end
1555 end)
1556end
1557SetTimeout(5000, init_busi_salaries)
1558
1559function add_busi_salarie(busi_id,user_id,rank)
1560 if busi_salaries[busi_id] then
1561 busi_salaries[busi_id][user_id] = rank
1562 _____business_debug("Ajout employe du tableau salaries server "..busi_id.." user : "..user_id.." rang : "..busi_salaries[busi_id][user_id])
1563 end
1564end
1565
1566function remove_busi_salarie(busi_id,user_id)
1567 if busi_salaries[busi_id] then
1568 _____business_debug("Supression employe du tableau salaries server "..busi_id.." user : "..user_id)
1569 busi_salaries[busi_id][user_id] = nil
1570 end
1571end
1572
1573function delete_busi_salarie(busi_id)
1574 if busi_salaries[busi_id] then
1575 _____business_debug("Supression entreprise donc supression tableau salaries server "..busi_id)
1576 busi_salaries[busi_id] = nil
1577 end
1578end
1579
1580function create_busi_salarie(busi_id,user_id,rank)
1581 busi_salaries[busi_id] = {}
1582 busi_salaries[busi_id][user_id] = rank
1583 _____business_debug("Creation entreprise dans tableau salaries server "..busi_id.." user : "..user_id.." rang : "..busi_salaries[busi_id][user_id])
1584end
1585
1586function check_busi_salarie(busi_id,user_id)
1587 local found = false
1588
1589 for k,v in pairs(busi_salaries[busi_id]) do
1590 if tonumber(k) == tonumber(user_id) then
1591 found = true
1592 break
1593 end
1594 end
1595
1596 if found then
1597 _____business_debug("Le joueur est considéré en tant qu'employe dans l'entreprise "..busi_id.." user : "..user_id)
1598 return true
1599 else
1600 _____business_debug("Le joueur ne fait pas partie de l'entreprise "..busi_id.." user : "..user_id)
1601 return false
1602 end
1603end
1604
1605function busi_prod_reset()
1606 Citizen.CreateThread(function()
1607 while true do
1608 local process_ok
1609 vRP.getAllBusiness(function(business)
1610 for k,v in ipairs(business) do
1611 if v.prod_reset_timestamp == 0 then
1612 -- not initialized
1613 set_busi_reset_prod(v.user_id, os.time(), os.date("%d/%m/%Y %H:%M:%S"))
1614 else
1615 local elapsed_time = os.time() - v.prod_reset_timestamp
1616 if elapsed_time >= cfg.reset_prod_cd then
1617 -- minimum cooldown time is reached
1618 -- for each salaries we will set prod value at 0
1619 local busi_salaries = json.decode(v.salaries)
1620 for i,j in pairs(busi_salaries) do
1621 vRP.setProductivityPlayer(i,0)
1622 end
1623 -- set new time for next reset
1624 set_busi_reset_prod(v.user_id, os.time(), os.date("%d/%m/%Y %H:%M:%S"))
1625 end
1626 end
1627 end
1628 process_ok = true
1629 end)
1630 while process_ok == nil do Citizen.Wait(0) end
1631 -- wait 2 hours
1632 Citizen.Wait(7200000)
1633 end
1634 end)
1635end
1636SetTimeout(15000, busi_prod_reset)
1637
1638function remove_salary_from_business(player,tplayer,user_id,isFired,busi_id)
1639 user_id = tonumber(user_id)
1640 if tplayer then
1641 vRP.stopMission(tplayer)
1642 end
1643
1644 -- init waiting booleans
1645 business_wait_group[user_id] = true
1646 business_wait_business[user_id] = true
1647 business_wait_rank[user_id] = true
1648
1649 local count = 0
1650 local max_val = 300 -- -> 300 * 100 ms = 30 seconds to wait
1651
1652 -- here we need to wait between each step because each step can load & save (offline mode) data ..
1653 -- so mysql transfer is a bit longer
1654
1655 vRP.addUserBusinessGroup(player,user_id,cfgGroup.no_job_group)
1656 while business_wait_group[user_id] and count < max_val do Citizen.Wait(100) count=count+1 end
1657
1658 count = 0
1659 vRP.setBusinessRank(player,user_id,-1)
1660 while business_wait_rank[user_id] and count < max_val do Citizen.Wait(100) count=count+1 end
1661
1662 count = 0
1663 vRP.setBussinessPlayer(player,user_id,nil)
1664 while business_wait_business[user_id] and count < max_val do Citizen.Wait(100) count=count+1 end
1665
1666 vRP.setProductivityPlayer(user_id,0)
1667
1668 business_wait_group[user_id] = nil
1669 business_wait_business[user_id] = nil
1670 business_wait_rank[user_id] = nil
1671
1672 -- this part is only for fired salaries
1673 if isFired == true and can_remove_from_busi[user_id] == true then
1674 _____business_debug("Une demande de suppression du salarie dans la tableau entreprise a été demandé")
1675 vRP.removeSalaryBussiness(busi_id, user_id)
1676 return true
1677 else
1678 return false
1679 end
1680end
1681
1682function buildJodRequest(player,user_id,isUpdate)
1683 Citizen.CreateThread(function()
1684 get_job_offers(function(job_offers)
1685 local tmp_sector = {}
1686 local tmp_busi = {}
1687 local tmp_offers = {}
1688 local saved_busi_paychecks = {}
1689 local delete_offer_busi = {}
1690 local count = 0
1691 local max_val = 300 -- -> 300 * 100 ms = 30 seconds to wait
1692 local wait
1693
1694 for k,v in ipairs(job_offers) do
1695 if tmp_sector[v.busi_sector] then
1696 _____business_debug("Secteur d'activite existant : "..v.busi_sector)
1697 if not tmp_busi[v.busi_id] then
1698 -- init new busi for this sector
1699 tmp_busi[v.busi_id] = {sector = v.busi_sector, name = v.busi_name}
1700
1701
1702 if not saved_busi_paychecks[v.busi_id] then
1703 wait = nil
1704 count = 0
1705 _____business_debug("Recuperation paychecks : "..v.busi_id)
1706 -- we need to get in database paychecks for this busi
1707 get_busi_paychecks(v.busi_id, function(result)
1708 if result.paychecks then
1709 -- special work for medic business
1710 if v.busi_id == -2 then
1711 local value
1712 local medic_table = {}
1713 for i=1,6 do
1714 -- get salaries value from governor table
1715 value = vRP.getOutgoingValueByCat("emergency_rank_"..i)
1716 medic_table["rank_"..i] = value
1717 end
1718 saved_busi_paychecks[v.busi_id] = medic_table
1719 else
1720 saved_busi_paychecks[v.busi_id] = json.decode(result.paychecks)
1721 end
1722 else
1723 _____business_debug("Une ancienne offre non supprimée appartient a une antreprise inexistante ! : "..v.busi_id)
1724 saved_busi_paychecks[v.busi_id] = nil
1725 delete_offer_busi[v.busi_id] = true
1726 end
1727 wait = false
1728 end)
1729 while wait == nil and count < max_val do Citizen.Wait(100) count=count+1 end
1730 _____business_debug("FIN Recuperation paychecks : "..v.busi_id.." state "..tostring(wait).." count "..count)
1731 end
1732 end
1733
1734 if saved_busi_paychecks[v.busi_id] then
1735 -- store offer and add it to temp offers table
1736 tmp_offers[v.id] = {id = v.id,bus_id = v.busi_id, name = v.busi_name, sector = v.busi_sector, creator = v.job_creator,
1737 rank = v.job_rank, date = v.job_date, desc = v.job_desc, title = v.job_reason, sal = saved_busi_paychecks[v.busi_id]["rank_"..v.job_rank]}
1738 end
1739 else
1740 _____business_debug("Nouveau secteur d'activite : "..v.busi_sector)
1741 -- init new sector & new busi
1742 tmp_sector[v.busi_sector] = true
1743 tmp_busi[v.busi_id] = {sector = v.busi_sector, name = v.busi_name}
1744
1745 if not saved_busi_paychecks[v.busi_id] then
1746 wait = nil
1747 count = 0
1748 _____business_debug("Recuperation paychecks : "..v.busi_id)
1749 -- we need to get in database paychecks for this busi
1750 get_busi_paychecks(v.busi_id, function(result)
1751 if result.paychecks then
1752 -- special work for medic business
1753 if v.busi_id == -2 then
1754 local value
1755 local medic_table = {}
1756 for i=1,6 do
1757 -- get salaries value from governor table
1758 value = vRP.getOutgoingValueByCat("emergency_rank_"..i)
1759 medic_table["rank_"..i] = value
1760 end
1761 saved_busi_paychecks[v.busi_id] = medic_table
1762 else
1763 saved_busi_paychecks[v.busi_id] = json.decode(result.paychecks)
1764 end
1765 else
1766 _____business_debug("Une ancienne offre non supprimée appartient a une antreprise inexistante ! : "..v.busi_id)
1767 saved_busi_paychecks[v.busi_id] = nil
1768 delete_offer_busi[v.busi_id] = true
1769 end
1770 wait = false
1771 end)
1772 while wait == nil and count < max_val do Citizen.Wait(100) count=count+1 end
1773 _____business_debug("FIN Recuperation paychecks : "..v.busi_id.." state "..tostring(wait).." count "..count)
1774 end
1775
1776 if saved_busi_paychecks[v.busi_id] then
1777 -- store offer and add it to busi table
1778 tmp_offers[v.id] = {id = v.id, bus_id = v.busi_id, name = v.busi_name, sector = v.busi_sector, creator = v.job_creator,
1779 rank = v.job_rank, date = v.job_date, desc = v.job_desc, title = v.job_reason, sal = saved_busi_paychecks[v.busi_id]["rank_"..v.job_rank]}
1780 end
1781
1782 end
1783 end
1784
1785 for i,j in pairs(delete_offer_busi) do
1786 _____business_debug("Suppression des offres pour l'entreprise fantôme "..tonumber(i))
1787 del_offers_by_busi(tonumber(i))
1788 end
1789
1790 get_job_req_by_user(user_id, function(my_requests)
1791 TriggerClientEvent("business:openJobSearch", player,tmp_sector,tmp_busi,tmp_offers,my_requests,isUpdate)
1792 end)
1793 end)
1794 end)
1795end
1796
1797function sendLeaderSMS(busi_id,msg)
1798 Citizen.CreateThread(function()
1799 busi_id = tonumber(busi_id)
1800
1801 -- look for business leader id
1802 for k,v in pairs(busi_salaries[busi_id]) do
1803 -- currently user_id = business id bu if it change we need to adatp here
1804 if tonumber(k) == busi_id then
1805 _____business_debug("La patron a été trouvé "..busi_id.." "..k)
1806 local tplayer = vRP.getUserSource(tonumber(k))
1807 if tplayer then
1808 _____business_debug("Le patron est en ligne envoi d'un sms")
1809 vRP.getUserIdentity(k, function(identity)
1810 if identity then
1811 TriggerEvent('gcPhone:receiveBusinessMsg', msg, identity.phone, tplayer)
1812 end
1813 end)
1814 end
1815 end
1816 end
1817
1818 end)
1819end
1820
1821function sendNewJobMsg(tplayer,target_id,busi_id)
1822 Citizen.CreateThread(function()
1823 vRP.getUserIdentity(target_id, function(identity)
1824 if identity then
1825 vRP.getBusinessName(busi_id, function(business)
1826 if business then
1827 msg = "Bonjour. Nous venons d'être informé que votre demande a été selectionnée par l'entreprise "..business.name.." Vous êtes désormais "..business.activity_sector
1828 local lenght = string.len(msg)
1829 if lenght > 255 then
1830 -- message is too long..
1831 local val_to_reduce = lenght - 255
1832 -- +3 for 3 dots
1833 val_to_reduce = val_to_reduce + 3
1834 msg = string.sub(msg, 1, (lenght - val_to_reduce)).."..."
1835 end
1836 TriggerEvent('gcPhone:receiveBusinessMsg', msg, identity.phone, tplayer)
1837 end
1838 end)
1839 end
1840 end)
1841 end)
1842end
1843
1844-- check if player belong to special group
1845function checkSpecialJob(user_id)
1846 if vRP.hasGroup(user_id,"Fbi") or vRP.hasGroup(user_id,"Police") or checkIfMedic(user_id) or
1847 vRP.hasGroup(user_id,"Vice Gouverneur") or vRP.hasGroup(user_id,"Sheriff") or vRP.hasGroup(user_id,"Gouverneur")
1848 or vRP.hasGroup(user_id,"Juge") then
1849 _____business_debug("Le joueur "..user_id.." fait parti d'un groupe spécial !!!")
1850 return true
1851 else
1852 _____business_debug("Le joueur "..user_id.." ne fait pas parti d'un groupe spécial !!!")
1853 return false
1854 end
1855end
1856
1857function checkIfMedic(user_id)
1858 if vRP.hasGroup(user_id,"Ambulancier") then
1859 _____business_debug("Le joueur "..user_id.." fait parti du groupe Ambulancier !!!")
1860 return true
1861 else
1862 return false
1863 end
1864end
1865
1866function addPlayerToBusinness(Source,target_id,_busi_id,offer,_name,is_immediat)
1867 -- add rank and business to leader
1868 vRP.setBussinessPlayer(Source,target_id,{busi_id = _busi_id, busi_name = _name})
1869 vRP.setBusinessRank(Source,target_id,offer.job_rank)
1870 vRP.setProductivityPlayer(target_id,0)
1871
1872 -- add job to user
1873 vRP.addUserBusinessGroup(Source,target_id,offer.busi_sector)
1874 -- stop mission if target have one
1875 local tplayer = vRP.getUserSource(tonumber(target_id))
1876 if tplayer then
1877 vRP.stopMission(tplayer)
1878 if not is_immediat then
1879 sendNewJobMsg(tplayer,tonumber(target_id),_busi_id)
1880 end
1881 end
1882
1883 -- add user in server local array (allow him to valid paycheck verification)
1884 add_busi_salarie(_busi_id,target_id,offer.job_rank)
1885 vRP.addSalaryBussiness(_busi_id, target_id, offer.job_rank)
1886 vRP.setCreateBusiState(tonumber(target_id),nil)
1887
1888
1889 -- all requests are deleted for the new salary
1890 del_related_req(target_id)
1891 Citizen.Wait(3000)
1892end
1893
1894function sendDeleteOfferMsg(requests,offer)
1895 local _requests = requests
1896 local _offer = offer
1897 Citizen.CreateThread(function()
1898 for k,v in ipairs(_requests) do
1899 local tplayer = vRP.getUserSource(tonumber(v.user_id))
1900 local save_phone = v.req_tel -- identity.phone
1901 _____business_debug("Envoi sms offer delete à "..v.user_id.." TEL : "..tostring(save_phone))
1902 msg = "Bonjour. Nous venons d'être informé que l'entreprise a supprimé l'offre : ".._offer.job_reason
1903 local lenght = string.len(msg)
1904 if lenght > 255 then
1905 -- message is too long..
1906 local val_to_reduce = lenght - 255
1907 -- +3 for 3 dots
1908 val_to_reduce = val_to_reduce + 3
1909 msg = string.sub(msg, 1, (lenght - val_to_reduce)).."..."
1910 end
1911 TriggerEvent('gcPhone:receiveBusinessMsg', msg, save_phone, tplayer)
1912 Citizen.Wait(1000)
1913 end
1914 end)
1915end
1916
1917function catch(what)
1918 return what[1]
1919end
1920
1921function try(what)
1922 status, result = pcall(what[1])
1923 if not status then
1924 what[2](result)
1925 end
1926 return result
1927end
1928
1929function parse_date(date, is_end)
1930 local pattern ="(%d+)/(%d+)/(%d+) (%d+):(%d+):(%d+)"
1931
1932 if is_end then
1933 date = date.." 23:59:59"
1934 else
1935 date = date.." 00:00:00"
1936 end
1937
1938 local runday,runmonth,runyear,runhour,runmin,runsec = date:match(pattern)
1939 return os.time({year = runyear, month = runmonth, day = runday, hour = runhour, min = runmin, sec = runsec})
1940end
1941
1942function changeLeader(_player,_new_id,_busi_id)
1943 local player = _player
1944 local new_id = _new_id
1945 local busi_id = _busi_id
1946
1947 _____business_debug("Changement de leader d'entreprise enclenché. BUSI_ID "..busi_id.." | NEW_ID "..new_id)
1948 change_leader(new_id,busi_id)
1949 Citizen.Wait(4000)
1950
1951 local count = 0
1952 local max_val = 6000 -- -> 6000 * 100 ms = 6000 seconds to wait (10 minutes)
1953 local runLeader = true
1954
1955 vRP.getUserBusiness(new_id, function(business)
1956 if business then
1957 -- change server variables by copying values with new ID and deleting old value
1958 vRPclient.notify(player,{"Changement du leader en cours.."})
1959 local save
1960 if business_treasury[busi_id] then
1961 save = business_treasury[busi_id]
1962 business_treasury[new_id] = save
1963 business_treasury[busi_id] = nil
1964 else
1965 business_treasury[new_id] = 0
1966 end
1967
1968 if busi_salaries[busi_id] then
1969 save = busi_salaries[busi_id]
1970 busi_salaries[new_id] = save
1971 busi_salaries[busi_id] = nil
1972 else
1973 busi_salaries[new_id] = 0
1974 end
1975
1976 -- need to refresh business data for other salaries
1977 vRPclient.notify(player,{"Changement du leader en cours.."})
1978 vRP.refreshBusinessSalaries(player,new_id)
1979 Citizen.Wait(2000)
1980 vRPclient.notify(player,{"Changement du leader en cours.."})
1981
1982 vRP.rankSalaryBussiness(new_id, new_id, 7)
1983 vRP.rankSalaryBussiness(new_id, busi_id, 6)
1984 vRP.setBusinessRank(player,new_id,7)
1985 vRP.setBusinessRank(player,busi_id,6)
1986 vRPclient.notify(player,{"Changement du leader en cours.."})
1987 runLeader = false
1988 else
1989 vRPclient.notify(player,{"~r~Une erreur est survenue lors du changement de leader. Veuillez contacter un dieu !!"})
1990 runLeader = false
1991 end
1992 end)
1993
1994 while runLeader and count < max_val do Citizen.Wait(100) count=count+1 end
1995end
1996
1997
1998--====================================================================================
1999-- GUI
2000--====================================================================================
2001
2002function ch_delete_busi(Source,user_id,busi_id,external_close)
2003 if checkIfMedic(user_id) then
2004 vRPclient.notify(Source,{"~r~Action impossible pour cette entreprise !"})
2005 TriggerClientEvent("business:disableLoading", Source)
2006 else
2007 Citizen.CreateThread(function()
2008 local salaries
2009 local busi_name
2010 local count = 0
2011 local max_val = 300 -- -> 300 * 100 ms = 30 seconds to wait
2012
2013 -- fire all salaries
2014 vRP.getUserBusiness(busi_id, function(business)
2015 salaries = json.decode(business.salaries)
2016 busi_name = business.name
2017 end)
2018
2019 while salaries == nil and count < max_val do Citizen.Wait(100) count=count+1 end
2020
2021 if salaries ~= nil then
2022 vRP.getUserBusiness(busi_id, function(business)
2023 if not business then
2024 vRPclient.notify(Source,{"~r~Une erreur administrative est intervenue lors de la fermeture de l'entreprise !"})
2025 TriggerClientEvent("business:disableLoading", Source)
2026 else
2027 vRP.closeBusiness(busi_id)
2028 Citizen.Wait(3000)
2029
2030 del_offers_by_busi(busi_id)
2031 -- remove business from list of treasuries
2032 if business_treasury[busi_id] then
2033 -- give treasury to leader
2034 vRP.giveBankMoney(tonumber(user_id), business_treasury[busi_id])
2035 -- give capital
2036 vRP.giveBankMoney(tonumber(user_id), business.capital)
2037 business_treasury[busi_id] = nil
2038 end
2039 for k,v in pairs(salaries) do
2040 -- disable fired mode because the business is already deleted (no need to update salaries table)
2041 -- we manage our own notification
2042 ch_fire_salary(Source,k,false,false,busi_name,false,false)
2043 end
2044
2045 -- delete all bills
2046 del_bills(busi_id)
2047
2048 -- delete all busi book
2049 del_busi_book(busi_id)
2050 if not external_close then
2051 vRPclient.notify(Source,{"~g~Votre entreprise a bien été fermée."})
2052 TriggerClientEvent("business:closeCommercialManage", Source)
2053 vRP.closeMenu(Source)
2054 else
2055 vRPclient.notify(Source,{"~g~Le gouvernement confirme la suppression de l'entreprise."})
2056 end
2057 end
2058 end)
2059 else
2060 vRPclient.notify(Source,{"~r~Impossible d'obtenir la liste des salariés. Fermeture annulée"})
2061 TriggerClientEvent("business:disableLoading", Source)
2062 end
2063 end)
2064 end
2065end
2066
2067function ch_add_capital(Source,user_id,amount)
2068 if amount > 0 then
2069 local amountTax = vRP.getEarningValueByCat("busi_modify_tax")
2070 if amount > amountTax then
2071 if vRP.tryPayment(user_id,amount) then
2072 get_capital(user_id,function(cap)
2073 -- reduce tax from capital given
2074 amount = amount - amountTax
2075 MySQL.query("vRP/add_capital", {user_id = user_id, capital = amount})
2076 vRP.updateCityMoney(amountTax)
2077 vRPclient.notify(Source,{lang.business.addcapital.added({amount})})
2078 vRPclient.notify(Source,{lang.business.addcapital.added({amount})})
2079 vRPclient.notify(Source,{lang.business.addcapital.tax({amountTax})})
2080 cap.capital = cap.capital + amount
2081 TriggerClientEvent("business:updateManagment", Source, cap.capital)
2082 end)
2083 else
2084 vRPclient.notify(Source,{lang.money.not_enough()})
2085 TriggerClientEvent("business:disableLoading", Source)
2086 end
2087 else
2088 vRPclient.notify(Source,{lang.money.not_enough_tax({amountTax})})
2089 TriggerClientEvent("business:disableLoading", Source)
2090 end
2091 else
2092 vRPclient.notify(Source,{lang.common.invalid_value()})
2093 TriggerClientEvent("business:disableLoading", Source)
2094 end
2095end
2096
2097function ch_sell_capital(Source,user_id,amount)
2098 vRPclient.notify(Source,{"~r~Fonction non disponible pour le moment."})
2099end
2100
2101function ch_give_prime(Source,user_id,target_id,amount)
2102 amount = tonumber(amount)
2103 if amount then
2104 if tonumber(user_id) ~= tonumber(target_id) then
2105 if amount > 0 then
2106 local tplayer = vRP.getUserSource(target_id)
2107 if tplayer then
2108 vRP.getBussinessPlayer(user_id, function(busi)
2109 if tonumber(busi.busi_id) == tonumber(target_id) then
2110 -- target is the leader !!!
2111 vRPclient.notify(Source,{"~r~Impossible de donner une prime au patron !"})
2112 TriggerClientEvent("business:disableLoading", Source)
2113 else
2114 if (vRP.getBusiTreasury(busi.busi_id) - amount) < 0 then
2115 vRPclient.notify(Source,{"~r~Vous n'avez pas assez d'argent en trésorerie !!"})
2116 else
2117 if vRP.reduceBusiTreasury(busi.busi_id,amount) then
2118 vRP.getUserIdentity(tonumber(target_id), function(identity)
2119 vRP.getProductivityPlayer(target_id, function(prod_val)
2120 -- reduce prodcutivity for prime
2121 prod_val = prod_val - amount
2122 vRP.setProductivityPlayer(target_id,prod_val)
2123 end)
2124 local name = identity.name.." "..identity.firstname
2125 log_discord(target_id,"PRIME pour le joueur : ","MONTANT : "..amount,name)
2126 target_id = tonumber(target_id)
2127 vRP.giveBankMoney(target_id, amount)
2128 add_busi_book(busi.busi_id, "PRIME", "SORTIE", "Une prime de "..amount.." $ a été versée au salarié : "..name, amount)
2129 vRPclient.notify(Source,{"~g~Prime envoyée avec succès !!"})
2130 vRPclient.notify(tplayer,{"~g~Vous avez reçu : "..amount.." $ de votre entreprise !"})
2131 TriggerClientEvent("business:updateTreasury", Source, business_treasury[busi.busi_id])
2132 end)
2133 else
2134 vRPclient.notify(Source,{"~r~Une erreur est survenue lors de l'obtention de l'argent !"})
2135 end
2136 end
2137 end
2138 end)
2139 else
2140 vRPclient.notify(Source,{"~r~Impossible de donner un prime quand l'employé n'est pas présent !"})
2141 end
2142 else
2143 vRPclient.notify(Source,{"~r~La valeur doit être supérieur à 0 !"})
2144 end
2145 else
2146 vRPclient.notify(Source,{"~r~Pas de prime pour toi !"})
2147 end
2148 else
2149 vRPclient.notify(Source,{"~r~Valeur incorrecte !"})
2150 TriggerClientEvent("business:disableLoading", Source)
2151 end
2152end
2153
2154function ch_give_rank(Source,user_id,target_id,rank)
2155 Citizen.CreateThread(function()
2156 if tonumber(user_id) ~= tonumber(target_id) then
2157 rank = tonumber(rank)
2158 if rank then
2159 if rank >= 1 and rank <= 6 then
2160 vRP.getBussinessPlayer(tonumber(user_id), function(busi)
2161 if busi then
2162 if tonumber(busi.busi_id) == tonumber(target_id) then
2163 -- target is the leader !!!
2164 vRPclient.notify(Source,{"~r~Impossible de changer le rang du patron idiot !"})
2165 TriggerClientEvent("business:disableLoading", Source)
2166 else
2167 target_id = tonumber(target_id)
2168 local count = 0
2169 local max_val = 300 -- -> 300 * 100 ms = 30 seconds to wait
2170 business_wait_rank[target_id] = true
2171
2172 vRP.setBusinessRank(Source,target_id,rank)
2173 while business_wait_rank[target_id] and count < max_val do Citizen.Wait(100) count=count+1 end
2174
2175 if business_wait_rank[target_id] == false then
2176 -- apply rank for salary business table
2177 vRP.rankSalaryBussiness(busi.busi_id, target_id, rank)
2178 ch_update_sal_business(Source,busi.busi_id)
2179 vRPclient.notify(Source,{"~g~Nouvelle position hierachique définie avec succès !"})
2180 else
2181 vRPclient.notify(Source,{"~r~impossible d'attribuer le rang essayez plus tard !"})
2182 TriggerClientEvent("business:disableLoading", Source)
2183 end
2184 business_wait_rank[target_id] = nil
2185 end
2186 else
2187 vRPclient.notify(Source,{"~r~Impossible de déterminer l'entreprise !"})
2188 TriggerClientEvent("business:disableLoading", Source)
2189 end
2190 end)
2191 else
2192 vRPclient.notify(Source,{"~r~La valeur du rang n'est pas valide ! (1 minimum - 6 maximum)"})
2193 TriggerClientEvent("business:disableLoading", Source)
2194 end
2195 else
2196 vRPclient.notify(Source,{"~r~Valeur incorrecte !"})
2197 TriggerClientEvent("business:disableLoading", Source)
2198 end
2199 else
2200 vRPclient.notify(Source,{"~r~Tu n'as pas besoin d'un rang inférieur ! Tu es l'élite ;)"})
2201 TriggerClientEvent("business:disableLoading", Source)
2202 end
2203 end)
2204end
2205
2206function ch_fire_salary(Source,target_id,isFired,notif,busi_name,check_leader,inform_leader)
2207 target_id = tonumber(target_id)
2208 Citizen.CreateThread(function()
2209 _____business_debug("Demande de licenciement pour le joueur "..target_id)
2210 vRP.getBussinessPlayer(target_id, function(busi)
2211 if busi then
2212 if tonumber(busi.busi_id) == tonumber(target_id) and check_leader == true then
2213 -- target is the leader !!!
2214 vRPclient.notify(Source,{"~r~Impossible de licencier le patron idiot !"})
2215 TriggerClientEvent("business:disableLoading", Source)
2216 else
2217 local tplayer = vRP.getUserSource(target_id)
2218 can_remove_from_busi[target_id] = false
2219
2220 if remove_salary_from_business(player,tplayer,target_id,isFired,busi.busi_id) then
2221 if notif then
2222 vRPclient.notify(Source,{"~g~Salarié licencié !"})
2223 TriggerEvent("business:sendPhoneMsg",target_id,busi.busi_name,busi.busi_id,tplayer)
2224 ch_update_sal_business(Source,busi.busi_id)
2225 end
2226
2227 -- remove user in server local array (denied him to valid paycheck verification)
2228 remove_busi_salarie(busi.busi_id,target_id)
2229 elseif notif then
2230 vRPclient.notify(Source,{"~r~Une erreur est survenue lors du licenciement !"})
2231 TriggerClientEvent("business:disableLoading", Source)
2232 elseif not isFired then
2233 delete_busi_salarie(busi.busi_id)
2234 -- we are here when we delete our own business
2235 TriggerEvent("business:sendPhoneMsg",target_id,busi_name,busi.busi_id,tplayer)
2236 end
2237
2238 can_remove_from_busi[target_id] = nil
2239
2240 if inform_leader then
2241 vRP.getUserIdentity(target_id, function(identity)
2242 local name = identity.name.." "..identity.firstname
2243 local msg = "L'employé "..name.." a quitté votre entreprise."
2244 local lenght = string.len(msg)
2245 if lenght > 255 then
2246 -- message is too long..
2247 local val_to_reduce = lenght - 255
2248 -- +3 for 3 dots
2249 val_to_reduce = val_to_reduce + 3
2250 msg = string.sub(msg, 1, (lenght - val_to_reduce)).."..."
2251 _____business_debug("Taille Message reduit "..string.len(msg))
2252 _____business_debug("Message reduit "..msg)
2253 end
2254 sendLeaderSMS(busi.busi_id,msg)
2255 end)
2256 end
2257 end
2258 elseif notif then
2259 local user_id = vRP.getUserId(Source)
2260 if user_id then
2261 vRP.getBussinessPlayer(user_id, function(busi)
2262 if busi then
2263 vRP.removeSalaryBussiness(busi.busi_id, target_id)
2264 vRPclient.notify(Source,{"~o~Employé supprimé de la liste des salariés"})
2265 ch_update_sal_business(Source,busi.busi_id)
2266 else
2267 vRPclient.notify(Source,{"~r~Impossible de déterminer votre entreprise !"})
2268 TriggerClientEvent("business:disableLoading", Source)
2269 end
2270 end)
2271 else
2272 vRPclient.notify(Source,{"~r~Une erreur est survenue lors du licenciement !"})
2273 TriggerClientEvent("business:disableLoading", Source)
2274 end
2275 end
2276 end)
2277 end)
2278end
2279
2280function ch_update_sal_business(player,busi_id)
2281 vRP.getUserBusiness(busi_id, function(business)
2282 if business then
2283 local cap = vRP.comma_value(business.capital)
2284 local paycheck = json.decode(business.paychecks)
2285
2286 local salary_table = {}
2287 local count = 0
2288 local busi_salaries = json.decode(business.salaries)
2289 for k,v in pairs(busi_salaries) do
2290 count=count+1
2291
2292 vRP.getUserIdentity(k, function(identity)
2293 vRP.getProductivityPlayer(k,function(prod_val)
2294 local nametmp = htmlEntities.encode(identity.firstname).." "..htmlEntities.encode(identity.name)
2295 local paych
2296 if v == 7 then
2297 paych = "NULL"
2298 else
2299 paych = paycheck["rank_"..v]
2300 end
2301 table.insert(salary_table, {name = nametmp, prod = prod_val, rank = v, sal_id = k, pay = paych})
2302 -- wait a bit to slow process
2303 Citizen.Wait(20)
2304
2305 count=count-1
2306 --check end to avoid async spam ..
2307 if count == 0 then
2308 TriggerClientEvent("business:updateSalGUI", player, cap, salary_table,business_treasury[busi_id])
2309 end
2310 end)
2311 end)
2312 end
2313 else
2314 vRPclient.notify(player,{"~r~Impossible de déterminer votre entreprise !"})
2315 end
2316 end)
2317end
2318
2319function ch_update_offers_business(player,busi_id)
2320 vRP.getUserBusiness(busi_id, function(business)
2321 if business then
2322 local cap = vRP.comma_value(business.capital)
2323 local user_id = vRP.getUserId(player)
2324 local paycheck = {}
2325 local paycheck_table = {}
2326
2327 if checkIfMedic(user_id) then
2328 local value
2329 for i=1,6 do
2330 -- get salaries value from governor table
2331 value = vRP.getOutgoingValueByCat("emergency_rank_"..i)
2332 table.insert(paycheck_table, {pay = value, name = "rank_"..i})
2333 end
2334 else
2335 paycheck = json.decode(business.paychecks)
2336 end
2337
2338 for k,v in pairs(paycheck) do
2339 table.insert(paycheck_table, {pay = v, name = k})
2340 end
2341
2342 -- get job offers for the current busi
2343 get_busi_job_offers(busi_id, function(offers)
2344 -- get request to job offers related to current busi
2345 get_job_requests(busi_id, function(offers_reqs)
2346
2347 local salary_table = {}
2348 local count = 0
2349 local busi_salaries = json.decode(business.salaries)
2350 for k,v in pairs(busi_salaries) do
2351 count=count+1
2352
2353 vRP.getUserIdentity(k, function(identity)
2354 vRP.getProductivityPlayer(k,function(prod_val)
2355 local nametmp = htmlEntities.encode(identity.firstname).." "..htmlEntities.encode(identity.name)
2356 local paych
2357 if v == 7 then
2358 paych = "NULL"
2359 else
2360 paych = paycheck["rank_"..v]
2361 end
2362 table.insert(salary_table, {name = nametmp, prod = prod_val, rank = v, sal_id = k, pay = paych})
2363 -- wait a bit to slow process
2364 Citizen.Wait(20)
2365
2366 count=count-1
2367 --check end to avoid async spam ..
2368 if count == 0 then
2369 TriggerClientEvent("business:activateMenu", player, cap, business.name, business.activity_sector, business.user_id, business.last_prod_reset_date,
2370 salary_table,business_treasury[busi_id],paycheck_table,offers,offers_reqs,"update_business_offers_menu",nil)
2371 end
2372 end)
2373 end)
2374 end
2375
2376 end)
2377 end)
2378 else
2379 vRPclient.notify(player,{"~r~Impossible de déterminer votre entreprise !"})
2380 end
2381 end)
2382end
2383
2384function ch_busi_offers_tel(Source,user_id,tel,name)
2385 TriggerEvent('gcPhone:addContactBusi',Source, name, tel)
2386 vRPclient.notify(Source,{"~g~Le contact "..name.." a été ajouté à votre répertoire !"})
2387end
2388
2389function ch_busi_employee_tel(Source,target_id)
2390 local _id = tonumber(target_id)
2391 local _source = Source
2392 Citizen.CreateThread(function()
2393 if _source then
2394 if _id then
2395 vRP.getUserIdentity(_id, function(identity)
2396 if identity then
2397 local name = identity.firstname.." "..identity.name
2398 local tel = identity.phone
2399 TriggerEvent('gcPhone:addContactBusi',_source, name, tel)
2400 vRPclient.notify(_source,{"~g~Le contact "..name.." a été ajouté à votre répertoire !"})
2401 TriggerClientEvent("business:disableLoading", _source)
2402 else
2403 vRPclient.notify(_source,{"~r~Une erreur est survenue lors de la récupération de l'identité !"})
2404 TriggerClientEvent("business:disableLoading", _source)
2405 end
2406 end)
2407 else
2408 vRPclient.notify(_source,{"~r~Impossible d'identifier le salarié ! "})
2409 TriggerClientEvent("business:disableLoading", _source)
2410 end
2411 else
2412 vRPclient.notify(_source,{"~r~Une erreur est survenue ! "})
2413 TriggerClientEvent("business:disableLoading", _source)
2414 end
2415 end)
2416end
2417
2418function ch_busi_offers_ok(Source,user_id,req_id,target_id)
2419 Citizen.CreateThread(function()
2420 get_job_offer_by_req(req_id, function(offer)
2421 if offer then
2422 vRP.getBussinessPlayer(user_id, function(business)
2423 if business then
2424 -- we need to check if the target haven't already a business (maybe he was accepted by another busi !)
2425 vRP.getBussinessPlayer(target_id, function(tbusiness)
2426 if tbusiness == nil then
2427 addPlayerToBusinness(Source,target_id,business.busi_id,offer,business.busi_name,false)
2428
2429 ch_update_offers_business(Source,business.busi_id)
2430 vRPclient.notify(Source,{"~g~Le candidat à été embauché !"})
2431 else
2432 vRPclient.notify(Source,{"~r~Le candidat a déjà une entreprise !"})
2433 TriggerClientEvent("business:disableLoading", Source)
2434 end
2435 end)
2436 else
2437 vRPclient.notify(Source,{"~r~Impossible de déterminer l'entreprise !"})
2438 TriggerClientEvent("business:disableLoading", Source)
2439 end
2440 end)
2441 else
2442 vRPclient.notify(Source,{"~r~Une erreur est survenue lors du traitement de la requête !"})
2443 TriggerClientEvent("business:disableLoading", Source)
2444 end
2445 end)
2446 end)
2447end
2448
2449function ch_busi_offers_nok(Source,user_id,req_id,target_id)
2450 Citizen.CreateThread(function()
2451 vRP.getBussinessPlayer(user_id, function(busi)
2452 if busi then
2453 -- set seleted request to REFUSED state
2454 update_related_req(req_id)
2455 Citizen.Wait(3000)
2456
2457 ch_update_offers_business(Source,busi.busi_id)
2458 else
2459 vRPclient.notify(Source,{"~r~Impossible de déterminer votre entreprise !"})
2460 TriggerClientEvent("business:disableLoading", Source)
2461 end
2462 end)
2463 end)
2464end
2465
2466function ch_job_delete_request(Source,user_id,id)
2467 Citizen.CreateThread(function()
2468 if id ~= -1 then
2469 -- delete request in database
2470 del_req_by_id(id)
2471
2472 -- update gui
2473 buildJodRequest(Source,user_id,true)
2474 else
2475 TriggerClientEvent("business:disableLoading", Source)
2476 end
2477 end)
2478end
2479
2480function ch_busi_create_request(Source,user_id,id_offer,msg)
2481 Citizen.CreateThread(function()
2482
2483 vRP.getBussinessPlayer(user_id, function(busi)
2484 if busi or not vRP.checkUnjob(user_id) then
2485 vRPclient.notify(Source,{"~r~Vous avez déjà un travail !"})
2486 TriggerClientEvent("business:disableLoading", Source)
2487 else
2488 vRP.getUserIdentity(user_id, function(identity)
2489 if identity then
2490 local name = identity.firstname.." "..identity.name
2491 local date = os.date("%d/%m/%Y %H:%M:%S")
2492 get_busi_id_offer(id_offer,function(offer)
2493
2494 if offer then
2495 add_job_request(id_offer, user_id, name, date, msg, identity.phone)
2496 Citizen.Wait(2000)
2497 -- this part ins only for sms
2498 local msg = "Le chômeur "..name.." a postulé à l'offre : "..offer.job_reason.."."
2499 local lenght = string.len(msg)
2500 if lenght > 255 then
2501 -- message is too long..
2502 local val_to_reduce = lenght - 255
2503 -- +3 for 3 dots
2504 val_to_reduce = val_to_reduce + 3
2505 msg = string.sub(msg, 1, (lenght - val_to_reduce)).."..."
2506 _____business_debug("Taille Message reduit "..string.len(msg))
2507 _____business_debug("Message reduit "..msg)
2508 end
2509 sendLeaderSMS(offer.busi_id,msg)
2510 TriggerClientEvent("business:closeJobSearchRequest", Source)
2511 vRPclient.notify(Source,{"~g~Votre demande a été envoyé !"})
2512 else
2513 vRPclient.notify(Source,{"~r~L'offre n'existe plus !"})
2514 TriggerClientEvent("business:disableLoading", Source)
2515 end
2516 end)
2517 else
2518 vRPclient.notify(Source,{"~r~Une erreur est survenue lors de la récupération de votre identité !"})
2519 TriggerClientEvent("business:disableLoading", Source)
2520 end
2521 end)
2522 end
2523 end)
2524
2525 end)
2526end
2527
2528function ch_busi_immediat_job(Source,user_id,offer_id,_busi_id)
2529 Citizen.CreateThread(function()
2530 _busi_id = tonumber(_busi_id)
2531 offer_id = tonumber(offer_id)
2532 vRP.getBussinessPlayer(user_id, function(busi)
2533 if not vRP.checkUnjob(user_id) or busi then
2534 vRPclient.notify(Source,{"~r~Vous avez déjà un travail !"})
2535 TriggerClientEvent("business:disableLoading", Source)
2536 else
2537 get_offer_by_id(offer_id, function(offer)
2538 if offer then
2539 _____business_debug("AJOUT UTILISATEUR "..user_id.." AU JOB "..offer.job_reason.." POUR L'ENTREPRISE ".._busi_id)
2540
2541 vRP.getBusinessName(_busi_id, function(business)
2542 if business then
2543 addPlayerToBusinness(Source,user_id,_busi_id,offer,business.name,true)
2544
2545 vRP.getUserIdentity(tonumber(user_id), function(identity)
2546 if identity then
2547 local name = identity.firstname.." "..identity.name
2548 local msg = "Le chômeur "..name.." fait désormais partie de votre entreprise en tant qu'Intérimaire."
2549 local lenght = string.len(msg)
2550 if lenght > 255 then
2551 -- message is too long..
2552 local val_to_reduce = lenght - 255
2553 -- +3 for 3 dots
2554 val_to_reduce = val_to_reduce + 3
2555 msg = string.sub(msg, 1, (lenght - val_to_reduce)).."..."
2556 end
2557 sendLeaderSMS(_busi_id,msg)
2558 end
2559 end)
2560
2561 vRPclient.notify(Source,{"~g~Vous êtes désormais un salarié."})
2562 TriggerClientEvent("business:disableLoading", Source)
2563 else
2564 vRPclient.notify(Source,{"~r~Impossible de déterminer l'entreprise !"})
2565 TriggerClientEvent("business:disableLoading", Source)
2566 end
2567 end)
2568 else
2569 vRPclient.notify(Source,{"~r~Une erreur est survenue lors du traitement de la requête !"})
2570 TriggerClientEvent("business:disableLoading", Source)
2571 end
2572 end)
2573 end
2574 end)
2575 end)
2576end
2577
2578function ch_remove_offer(Source,user_id,offer_id)
2579 Citizen.CreateThread(function()
2580 offer_id = tonumber(offer_id)
2581 get_offer_by_id(offer_id, function(offer)
2582 if offer then
2583 get_req_by_offer_id(offer_id, function(requests)
2584
2585 -- delete offers
2586 del_req_by_offer_id(offer_id)
2587 Citizen.Wait(3000)
2588
2589 -- alert players that offers are deleted
2590 sendDeleteOfferMsg(requests,offer)
2591 Citizen.Wait(1000)
2592
2593 -- delete offer
2594 del_offer_by_id(offer_id)
2595 Citizen.Wait(3000)
2596
2597 vRP.getBussinessPlayer(user_id, function(busi)
2598 ch_update_offers_business(Source,busi.busi_id)
2599 vRPclient.notify(Source,{"~g~Offre supprimée !"})
2600 end)
2601 end)
2602 else
2603 vRPclient.notify(Source,{"~r~Une erreur est survenue lors du traitement de la requête !"})
2604 TriggerClientEvent("business:disableLoading", Source)
2605 end
2606 end)
2607 end)
2608end
2609
2610function ch_set_paycheck(Source,user_id,id_pay,value)
2611 if checkIfMedic(user_id) then
2612 vRPclient.notify(Source,{"~r~Action impossible pour cette entreprise !"})
2613 else
2614 Citizen.CreateThread(function()
2615 value = tonumber(value)
2616 if value then
2617 -- get player business
2618 vRP.getBussinessPlayer(user_id, function(busi)
2619 if busi then
2620 -- get paychecks for database
2621 get_busi_paychecks(busi.busi_id, function(result)
2622 local paychecks = json.decode(result.paychecks)
2623 -- update concernend rank
2624 paychecks["rank_"..id_pay] = value
2625
2626 -- save new paycheks in database
2627 vRP.getUserIdentity(user_id, function(identity)
2628 local name = identity.name.." "..identity.firstname
2629 add_busi_book(busi.busi_id, "MANAGEMENT", "ENTREE", "Changement de salaire par "..name.." nouveau salaire pour le rang "..id_pay.." : "..value, value)
2630 log_discord(user_id,"MANAGEMENT SALAIRE par le joueur : ","CHANGEMENT SALAIRE RANG "..id_pay.." : "..value,name)
2631 set_busi_paychecks(busi.busi_id, json.encode(paychecks))
2632 vRPclient.notify(Source,{"~g~Salaire mis à jour !"})
2633 end)
2634 end)
2635 else
2636 vRPclient.notify(Source,{"~r~Impossible de déterminer l'entreprise !"})
2637 end
2638 end)
2639 else
2640 vRPclient.notify(Source,{"~r~Valeur incorrecte !"})
2641 end
2642 end)
2643 end
2644end
2645
2646function ch_get_busi_book(Source,user_id,tag,_type,date,date2,book_busi_id)
2647 Citizen.CreateThread(function()
2648 try {
2649 function()
2650 if date == "" then
2651 -- date is null so we define it at 0
2652 date = 0
2653 else
2654 -- get time by giving typed date
2655 -- if user do shit then method crash (yeahhhh - but catched !)
2656 date = parse_date(date, false)
2657 end
2658
2659 if date2 == "" then
2660 -- date is null so we define it at current time
2661 date2 = os.time()
2662 else
2663 -- get time by giving typed date
2664 -- if user do shit then method crash (yeahhhh - but catched !)
2665 date2 = parse_date(date2, true)
2666 end
2667
2668 if _type == "TOUS" then
2669 -- get all types
2670 _type = "%"
2671 end
2672
2673 if tag == "TOUS" then
2674 -- get all types
2675 tag = "%"
2676 end
2677
2678 vRP.getBussinessPlayer(user_id, function(busi)
2679 get_busi_book_date(book_busi_id,tag,_type,date,date2, function(values)
2680 TriggerClientEvent("business:updateBook", Source,values)
2681 end)
2682 end)
2683
2684 end,
2685 catch {
2686 function(error)
2687 -- crash -> 99.99% it's due to date convert, stupid player give shit in params ..
2688 vRPclient.notify(Source,{"~r~Date incorrecte"})
2689 TriggerClientEvent("business:disableLoading", Source)
2690 end
2691 }
2692 }
2693 end)
2694end
2695
2696function ch_job_state_switch(Source,choice)
2697 Citizen.CreateThread(function()
2698 local user_id = vRP.getUserId(Source)
2699 if user_id then
2700 if vRP.checkUnjob(user_id) then
2701 -- player want to re-activate his job
2702 -- we will retrieve his respective job with his business
2703 vRP.getBussinessPlayer(user_id, function(busi)
2704 if busi then
2705 vRP.getUserBusiness(busi.busi_id, function(business)
2706 if business then
2707 vRP.toggleService(Source, business.activity_sector)
2708 else
2709 vRPclient.notify(Source,{"~r~Impossible de déterminer votre entreprise"})
2710 end
2711 end)
2712 else
2713 vRPclient.notify(Source,{"~r~Impossible de déterminer l'identifiant de votre entreprise"})
2714 end
2715 end)
2716 else
2717 -- player want to desactivate his job
2718 vRP.toggleService(Source, cfgGroup.no_job_group)
2719 end
2720 else
2721 vRPclient.notify(Source,{"~r~Une erreur est survenue"})
2722 end
2723 end)
2724end
2725
2726function ch_reset_prod(Source,target_id)
2727 local _source = Source
2728 local _target_id = target_id
2729 Citizen.CreateThread(function()
2730
2731 local user_id = vRP.getUserId(Source)
2732 if user_id then
2733 vRP.getBussinessPlayer(user_id, function(busi)
2734 if busi then
2735 vRP.setProductivityPlayer(_target_id,0)
2736 Citizen.Wait(2000)
2737 vRPclient.notify(Source,{"~g~Productivité du salarié réinitialisée"})
2738 ch_update_sal_business(Source,busi.busi_id)
2739 else
2740 vRPclient.notify(Source,{"~r~Impossible de déterminer votre entreprise !"})
2741 TriggerClientEvent("business:disableLoading", Source)
2742 end
2743 end)
2744 else
2745 vRPclient.notify(Source,{"~r~Une erreur est survenue lors du reset de la productivité !"})
2746 TriggerClientEvent("business:disableLoading", Source)
2747 end
2748 end)
2749end
2750
2751function ch_change_leader(Source,target_id)
2752 local _source = Source
2753 local _target_id = target_id
2754
2755 local user_id = vRP.getUserId(Source)
2756 if user_id then
2757 vRP.getBussinessPlayer(user_id, function(busi)
2758 if busi then
2759 vRP.changeBusiLeader(_source,user_id,_target_id,false)
2760 else
2761 vRPclient.notify(Source,{"~r~Impossible de déterminer votre entreprise !"})
2762 end
2763 end)
2764 else
2765 vRPclient.notify(Source,{"~r~Une erreur est survenue lors du reset de la productivité !"})
2766 end
2767
2768end
2769
2770--====================================================================================
2771-- MENU
2772--====================================================================================
2773
2774-- enbale to show manage business GUI
2775function ch_open_business_manage(player,busi_id)
2776 vRP.getUserBusiness(busi_id, function(business)
2777 if business then
2778 -- currently busi_id is = to user_id of leader but of someday this change some parts of this code (and GUI too) will be ok
2779 TriggerClientEvent("business:openManagment", player,business.capital,business.name,busi_id)
2780 else
2781 vRPclient.notify(player,{"~r~Vous n'avez aucune entreprise !"})
2782 end
2783 end)
2784end
2785
2786-- enbale to show creation business GUI
2787function ch_open_business_creator(player)
2788 local job_table = {}
2789 for k,v in pairs(cfgGroup.selectors["Pole emploi"]) do
2790 if type(v) ~= "table" then
2791 _____business_debug("Secteur disponnible "..v)
2792 table.insert(job_table, {name = v})
2793 end
2794 end
2795 TriggerClientEvent("business:openCreator", player,cfg.minimum_capital,job_table)
2796end
2797
2798-- enbale to show job seach GUI
2799function ch_open_job_search(player,user_id)
2800 buildJodRequest(player,user_id,false)
2801end
2802
2803--====================================================================================
2804-- VRP
2805--====================================================================================
2806
2807function vRP.changeBusiLeader(player,busi_id,new_id,is_admin)
2808 local _player = player
2809 local _busi_id = tonumber(busi_id)
2810 local _new_id = tonumber(new_id)
2811 local _is_admin= is_admin
2812 local chestname = "u".._busi_id.."business"
2813 local newchest = "u"..new_id.."business"
2814
2815 if _busi_id ~= _new_id then
2816 Citizen.CreateThread(function()
2817
2818 local tplayer = vRP.getUserSource(_new_id)
2819 if not vRP.checkPlayerMedic(_busi_id) and not vRP.checkPlayerMedic(_new_id) then
2820 if _is_admin then
2821 -- save date before changing id !
2822 local saveDate = os.date("%d/%m/%Y")
2823 update_leader_timer(saveDate,_busi_id)
2824 Citizen.Wait(2000)
2825
2826 changeLeader(_player,_new_id,_busi_id)
2827 vRP.changeChestBusi(chestname,newchest)
2828
2829 vRPclient.notify(_player,{"~g~Leader de l'entreprise changé ! Demandez confirmation au joueur. Sinon attendez un peu plus."})
2830 if tplayer ~= nil then
2831 vRPclient.notify(tplayer,{"~g~Vous êtes désormais le nouveau chef d'entreprise !"})
2832 end
2833
2834 else
2835 vRP.closeMenu(_player)
2836 local runProcess = false
2837
2838 vRP.get_leader_change(busi_id, function(busi_cd)
2839 if busi_cd and busi_cd ~= "" then
2840 local pattern = "(%d+)/(%d+)/(%d+)"
2841 local runday, runmonth, runyear = busi_cd:match(pattern)
2842 local convertedTimestamp = os.time({year = runyear, month = runmonth, day = runday})
2843
2844 -- calculate how many days are passed between the las change
2845 local nbDays = vRP.calculateNdDays(convertedTimestamp)
2846
2847 if nbDays >= cfg.reset_leader_cd then
2848 -- allowed to change leader
2849 runProcess = true
2850 end
2851 else
2852 runProcess = true
2853 end
2854
2855 if runProcess then
2856 local rank = vRP.getRank(_busi_id)
2857 if rank == 7 then
2858 -- save date before changing id !
2859 local saveDate = os.date("%d/%m/%Y")
2860 update_leader_timer(saveDate,_busi_id)
2861 Citizen.Wait(2000)
2862 vRPclient.notify(_player,{"~o~Changement du leader en cours. merci de ne rien faire en attendant le message de fin !!"})
2863
2864 changeLeader(_player,_new_id,_busi_id)
2865 vRP.changeChestBusi(chestname,newchest)
2866 vRPclient.notify(_player,{"~g~Le nouveau chef d'entreprise a été défini !"})
2867 local tplayer = vRP.getUserSource(_new_id)
2868 if tplayer ~= nil then
2869 vRPclient.notify(tplayer,{"~g~Vous êtes désormais le nouveau chef d'entreprise !"})
2870 end
2871 else
2872 vRPclient.notify(_player,{"~r~Vous n'êtes pas de dirigeant de cette entreprise !!"})
2873 end
2874 else
2875 vRPclient.notify(_player,{"~r~Impossible de changer de dirigeant. Dernier changement : "..busi_cd..", attente : "..cfg.reset_leader_cd.." jours"})
2876 end
2877
2878 end)
2879 end
2880 else
2881 vRPclient.notify(tplayer,{"~r~Action impossible pour les médecins !!"})
2882 vRPclient.notify(_player,{"~r~Action impossible pour les médecins !!"})
2883 end
2884
2885 end)
2886 else
2887 vRPclient.notify(tplayer,{"~r~Action impossible sur le même joueur !!"})
2888 end
2889end
2890
2891function vRP.changeChestBusi(old_chest,new_chest)
2892 vRP.getSData("chest:"..old_chest, function(cdata)
2893 -- we need to check if chest exist in DB
2894 chest = json.decode(cdata) or nil
2895 newchest = cdata
2896 if chest then
2897 -- save old chest chest
2898 vRP.setSData("chest:"..old_chest, json.encode({}))
2899 -- save new chest
2900 vRP.setSData("chest:"..new_chest, newchest)
2901 end
2902 end)
2903end
2904
2905function vRP.refreshBusinessSalaries(player,_busi_id)
2906 local stop
2907 local count = 0
2908 local max_val = 3000 -- -> 3000 * 100 ms = 300 seconds to wait (5 mins)
2909 local count_sal = 0
2910 local max_sal = 50 -- -> 300 * 100 ms = 5 seconds to wait
2911 local _id = _busi_id
2912 local _player = player
2913
2914 -- get the concerned business
2915 vRP.getUserBusiness(_id, function(business)
2916 if business then
2917 local salaries = json.decode(business.salaries)
2918 for k,v in pairs(salaries) do
2919 count_sal = 0
2920
2921 _____business_debug("Mise à jour de l'entreprise pour le salarie : "..k.." BUSI_ID ".._id)
2922 can_remove_from_busi[_id] = true
2923 vRP.setBussinessPlayer(_player,k,{busi_id = _id, busi_name = business.name})
2924 vRPclient.notify(_player,{"Changement du leader en cours.."})
2925 while can_remove_from_busi[_id] and count_sal < max_sal do Citizen.Wait(100) count_sal=count_sal+1 end
2926 can_remove_from_busi[_id] = false
2927 end
2928
2929 stop = true
2930 else
2931 vRPclient.notify(_player,{"~r~Une erreur est survenue lors de l'actualisation de l'entreprise pour les salariés !!!"})
2932 end
2933 end)
2934
2935 while stop == nil and count < max_val do Citizen.Wait(100) count=count+1 end
2936end
2937
2938function vRP.getDisplayJobSelector(player,user_id)
2939 ch_open_job_search(player,user_id)
2940end
2941
2942-- get treasury value for business
2943function vRP.getBusiTreasury(busi_id)
2944 return business_treasury[busi_id]
2945end
2946
2947-- set treasury value for business
2948function vRP.setBusiTreasury(busi_id,value)
2949 _____business_debug("nouvelle tresorie pour l'entreprise "..busi_id.." | "..value.."$")
2950 business_treasury[busi_id] = value
2951end
2952
2953-- reduce value to treasury for a given business
2954function vRP.reduceBusiTreasury(busi_id,value)
2955 local final_value = value
2956 if (vRP.getBusiTreasury(busi_id) - final_value) < 0 then
2957 -- if the reduction set treasury under 0 then we set business treasury to 0 !!
2958 -- negative values aren't allowed (ladis + antow)
2959 final_value = vRP.getBusiTreasury(busi_id)
2960 end
2961 return vRP.addBusiTreasury(busi_id,-final_value)
2962end
2963
2964-- add value to treasury for a given business
2965function vRP.addBusiTreasury(busi_id,value)
2966 local busi_treasury = vRP.getBusiTreasury(busi_id)
2967 if busi_treasury then
2968 local new_treasury = busi_treasury + value
2969 vRP.setBusiTreasury(busi_id,new_treasury)
2970 return true
2971 else
2972 -- unknow busi
2973 return false
2974 end
2975end
2976
2977-- add real money banknote to busi chest
2978function vRP.addMoneyBusiChest(busi_id,value)
2979 local moneyItem = "banknote"
2980 local chestName = "u"..busi_id.."business"
2981
2982 vRP.getSData("chest:"..chestName, function(cdata)
2983
2984 local chest_items = json.decode(cdata) or {} -- load items
2985 local citem = chest_items[moneyItem]
2986
2987 if citem ~= nil then
2988 chest_items[moneyItem].amount = citem.amount+value
2989 else -- create item entry
2990 chest_items[moneyItem] = {amount=value}
2991 end
2992
2993 vRP.setSData("chest:"..chestName, json.encode(chest_items))
2994 end)
2995 return true
2996end
2997
2998-- Remove a salary from the salaries table for the given business
2999function vRP.removeSalaryBussiness(busi_id, user_id)
3000 user_id = tostring(user_id)
3001 local stop
3002 local count = 0
3003 local max_val = 300 -- -> 300 * 100 ms = 30 seconds to wait
3004
3005 -- get the concerned business
3006 vRP.getUserBusiness(busi_id, function(business)
3007 local salaries = json.decode(business.salaries)
3008 _____business_debug("Suppression de l'employe d'une l'entreprise : "..tostring(salaries[user_id]).." "..user_id)
3009 salaries[user_id] = nil
3010 -- save in databse
3011 set_busi_salaries(busi_id, json.encode(salaries))
3012 Citizen.Wait(3000)
3013 stop = true
3014 end)
3015
3016 while stop == nil and count < max_val do Citizen.Wait(100) count=count+1 end
3017end
3018
3019function vRP.addSalaryBussiness(busi_id, user_id, rank)
3020 user_id = tostring(user_id)
3021 local stop
3022 local count = 0
3023 local max_val = 300 -- -> 300 * 100 ms = 30 seconds to wait
3024
3025 -- get the concerned business
3026 vRP.getUserBusiness(busi_id, function(business)
3027 local salaries = json.decode(business.salaries)
3028 salaries[user_id] = rank
3029 _____business_debug("Ajout de l'employe dans une l'entreprise : "..busi_id.." rang "..tostring(salaries[user_id]).." user "..user_id)
3030 -- save in databse
3031 set_busi_salaries(busi_id, json.encode(salaries))
3032 Citizen.Wait(3000)
3033 stop = true
3034 end)
3035
3036 while stop == nil and count < max_val do Citizen.Wait(100) count=count+1 end
3037end
3038
3039function vRP.rankSalaryBussiness(busi_id, user_id, rank)
3040 user_id = tostring(user_id)
3041 local stop
3042 local count = 0
3043 local max_val = 300 -- -> 300 * 100 ms = 30 seconds to wait
3044
3045 -- get the concerned business
3046 vRP.getUserBusiness(busi_id, function(business)
3047 if business then
3048 local salaries = json.decode(business.salaries)
3049 salaries[user_id] = rank
3050 _____business_debug("Mise à jour du rang pour le salarie : "..user_id.." "..salaries[user_id])
3051 -- save in databse
3052 set_busi_salaries(busi_id, json.encode(salaries))
3053 Citizen.Wait(3000)
3054 end
3055 stop = true
3056 end)
3057
3058 while stop == nil and count < max_val do Citizen.Wait(100) count=count+1 end
3059end
3060
3061-- Return salarie for user depending his business
3062function vRP.getBusiPaycheck(user_id, cbr)
3063 local task = Task(cbr, {nil})
3064 vRP.getBussinessPlayer(user_id, function(busi)
3065 if busi then
3066 -- we need to check if player is allowed to input money from business
3067 -- if not, user was maybe bad delete so we will reject and delete him again !
3068 if check_busi_salarie(busi.busi_id,user_id) then
3069 local rank = vRP.getRank(user_id)
3070 if rank < 7 then
3071 -- get from mysql (if lag then we need to manage server local paycheks for all business ..)
3072 get_busi_paychecks(busi.busi_id, function(result)
3073 local paycheck = json.decode(result.paychecks) or {}
3074 local amount = paycheck["rank_"..rank]
3075
3076 -- reduce paycheck from business treasury
3077 if amount then
3078 local curr_treas = vRP.getBusiTreasury(busi.busi_id)
3079 -- avoid excessive salary which permit to avoid treasury value and give salary amount
3080 if amount > curr_treas then
3081 amount = curr_treas
3082 end
3083
3084 if not vRP.reduceBusiTreasury(busi.busi_id,amount) then
3085 amount = nil -- no paycheck if business is undefined ! (maybe fresh busi ?)
3086 else
3087 vRP.getProductivityPlayer(user_id, function(prod_val)
3088 -- reduce prodcutivity for paycheck
3089 prod_val = prod_val - amount
3090 vRP.setProductivityPlayer(user_id,prod_val)
3091 end)
3092 log_discord(user_id,"SALAIRE pour le joueur : ","MONTANT : "..amount,nil)
3093 end
3094 end
3095
3096 _____business_debug("Le joueur reçoit un paye de : "..tostring(amount))
3097 task({amount})
3098 end)
3099 else
3100 _____business_debug("Le patron "..user_id.." n'est pas payé car son rang est "..rank)
3101 end
3102 else
3103 -- launch fire method (again)..
3104 ch_fire_salary(nil,user_id,true,false,nil,false,false)
3105 end
3106 else
3107 -- not a salary
3108 task()
3109 end
3110 end)
3111end
3112
3113-- Return productivity number of current player
3114function vRP.getProductivityPlayer(user_id,cbr)
3115 local task = Task(cbr, {nil})
3116 user_id = tonumber(user_id)
3117 local data = vRP.getUserDataTable(user_id)
3118 if data then
3119 if not data.productivity then
3120 data.productivity = 0
3121 end
3122 _____business_debug("Recuperation productivite du joueur (online) "..user_id.." | "..data.productivity)
3123 task({data.productivity})
3124 else
3125 -- player offline then we get value from database
3126 vRP.getUData(user_id,"vRP:datatable", function(offdata)
3127 local finaldata = json.decode(offdata) or nil
3128 if finaldata then
3129 if not finaldata.productivity then
3130 finaldata.productivity = 0
3131 vRP.setUData(user_id,"vRP:datatable",json.encode(finaldata))
3132 end
3133 _____business_debug("Recuperation productivite du joueur (offline) "..user_id.." | "..finaldata.productivity)
3134 task({finaldata.productivity})
3135 else
3136 _____business_debug("une erreur est survenue lors de la recuperation de la productivite pour le joueur "..user_id)
3137 task()
3138 end
3139 end)
3140 end
3141end
3142
3143-- Change productivity number of current player
3144function vRP.setProductivityPlayer(user_id,value)
3145 user_id = tonumber(user_id)
3146 local data = vRP.getUserDataTable(user_id)
3147 if data then
3148 data.productivity = value
3149 _____business_debug("Productivite applique pour le pour le joueur (online) "..user_id.." | "..data.productivity)
3150 else
3151 -- player offline then we change value in database
3152 vRP.getUData(user_id,"vRP:datatable", function(offdata)
3153 local finaldata = json.decode(offdata) or nil
3154 if finaldata then
3155 finaldata.productivity = value
3156 vRP.setUData(user_id,"vRP:datatable",json.encode(finaldata))
3157 _____business_debug("Productivite applique pour le pour le joueur (offline) "..user_id.." | "..finaldata.productivity)
3158 else
3159 _____business_debug("une erreur est survenue lors du reset de la productivite pour le joueur "..user_id)
3160 end
3161 end)
3162 end
3163end
3164
3165-- set player group
3166function vRP.addUserBusinessGroup(player,user_id,group)
3167 user_id = tonumber(user_id)
3168 -- thread for security
3169 Citizen.CreateThread(function()
3170 local count = 1
3171 local security = 300
3172 local isMedic = false
3173 local offline = false
3174 local data = vRP.getUserDataTable(user_id)
3175
3176 if not data then
3177 -- player offline then we change value in database
3178 vRP.getUData(user_id,"vRP:datatable", function(offdata)
3179 local finaldata = json.decode(offdata) or nil
3180 if finaldata then
3181 offline = true
3182 data = finaldata
3183 else
3184 count = 500 -- break wait
3185 vRPclient.notify(player,{"~r~Une erreur est survenue. Essayez plus tard."})
3186 end
3187 end)
3188 end
3189
3190 while data == nil and count <= security do Citizen.Wait(1000) count=count+1 end
3191
3192 if data then
3193 -- init groups if necessary
3194 if data.groups == nil then
3195 data.groups = {} -- init groups
3196 end
3197
3198 -- check if user doesn't already have group
3199 if not data[group] then
3200 local ngroup = groups[group]
3201 if ngroup then
3202 if ngroup._config and ngroup._config.gtype ~= nil then
3203 -- copy group list to prevent iteration while removing
3204 local _user_groups = {}
3205 for k,v in pairs(data.groups) do
3206 _user_groups[k] = v
3207 end
3208
3209 for k,v in pairs(_user_groups) do -- remove all groups with the same gtype
3210 local kgroup = groups[k]
3211 if kgroup and kgroup._config and ngroup._config and kgroup._config.gtype == ngroup._config.gtype then
3212 -- remove group to user
3213
3214 -- manage leave notification
3215 local groupdef = groups[k]
3216 local source = vRP.getUserSource(user_id)
3217 if source then
3218 -- send leave notification only if target is online
3219 if groupdef and groupdef._config and groupdef._config.onleave then
3220 if source ~= nil then
3221 groupdef._config.onleave(source) -- call leave callback
3222 end
3223 end
3224
3225 -- trigger leave event
3226 local gtype = nil
3227 if groupdef._config then
3228 gtype = groupdef._config.gtype
3229 end
3230 TriggerEvent("vRP:playerLeaveGroup", user_id, k, gtype)
3231 end
3232
3233 if k == "Ambulancier" then isMedic = true end
3234 data.groups[k] = nil -- remove reference
3235 _____business_debug("Groupe "..k.." supprimé pour le joueur "..user_id)
3236 end
3237 end
3238
3239 -- if job is medic then save state
3240 if isMedic then
3241 data.groups["ems"] = nil
3242 _____business_debug("Groupe WL ems supprimé pour le joueur "..user_id)
3243 end
3244 end
3245
3246 -- add group
3247 data.groups[group] = true
3248 _____business_debug("Groupe "..group.." ajouté pour le joueur "..user_id)
3249
3250 -- add wl state fo medic
3251 if group == "Ambulancier" then isMedic = true else isMedic = false end
3252 if isMedic then
3253 data.groups["ems"] = true
3254 _____business_debug("Groupe WL ems ajouté pour le joueur "..user_id)
3255 end
3256
3257 -- manage join notification
3258 local playert = vRP.getUserSource(user_id)
3259 if playert then
3260 -- send join notification only if target is online
3261 if ngroup._config and ngroup._config.onjoin and playert ~= nil then
3262 ngroup._config.onjoin(playert) -- call join callback
3263 end
3264
3265 -- trigger join event
3266 local gtype = nil
3267 if ngroup._config then
3268 gtype = ngroup._config.gtype
3269 end
3270 TriggerEvent("vRP:playerJoinGroup", user_id, group, gtype)
3271 build_client_chestbusi(playert)
3272 end
3273 end
3274 end
3275 end
3276
3277 if offline then
3278 vRP.setUData(user_id,"vRP:datatable",json.encode(data))
3279 Citizen.Wait(3000)
3280 business_wait_group[user_id] = false
3281 else
3282 business_wait_group[user_id] = false
3283 end
3284 end)
3285end
3286
3287function vRP.isNotWorking(user_id)
3288 local data = vRP.getUserDataTable(user_id)
3289 if data then
3290 _____business_debug("Recupération de l'état de l'employe "..user_id.." | "..tostring(data.not_working))
3291 return data.not_working
3292 else
3293 _____business_debug("Impossible de récupérer l'état de l'employe "..tostring(user_id))
3294 return nil
3295 end
3296end
3297
3298function vRP.isAllowedToCreateBusi(user_id)
3299 local data = vRP.getUserDataTable(user_id)
3300 if data then
3301 if data.allowed_busi then
3302 _____business_debug("Le joueur "..user_id.." est autorisé à créer un entreprise !")
3303 return true
3304 else
3305 _____business_debug("Le joueur "..user_id.." n'est pas autorisé à créer un entreprise !")
3306 return false
3307 end
3308 else
3309 _____business_debug("Impossible de récupérer le status de creation d'entreprise pour "..tostring(user_id))
3310 return false
3311 end
3312end
3313
3314function vRP.setCreateBusiState(user_id, state)
3315 local data = vRP.getUserDataTable(user_id)
3316 if data then
3317 data.allowed_busi = state
3318 _____business_debug("Mise à jour du status de creation d'entreprise pour "..user_id.." | "..tostring(data.allowed_busi))
3319 end
3320end
3321
3322-- enable to desactivate job
3323function vRP.toggleServiceState(user_id,state)
3324 local data = vRP.getUserDataTable(user_id)
3325 if data then
3326 data.not_working = state
3327 _____business_debug("L'état de l'employe "..user_id.." a ete change pour : "..tostring(data.not_working))
3328 return true
3329 else
3330 _____business_debug("Impossible de changer l'état de l'employe "..tostring(user_id))
3331 return false
3332 end
3333end
3334
3335-- set player rank
3336function vRP.setBusinessRank(player,user_id,rank)
3337 user_id = tonumber(user_id)
3338 local final_rank = rank
3339 if final_rank < 0 then final_rank = nil
3340 elseif final_rank > 7 then final_rank = 7
3341 end
3342
3343 local data = vRP.getUserDataTable(user_id)
3344 if data then
3345 data.rank = final_rank
3346 _____business_debug("Rang applique pour le pour le joueur (online) "..user_id.." | "..tostring(data.rank))
3347 business_wait_rank[user_id] = false
3348 else
3349 -- player offline then we change value in database
3350 vRP.getUData(user_id,"vRP:datatable", function(offdata)
3351 local finaldata = json.decode(offdata) or nil
3352 if finaldata then
3353 finaldata.rank = final_rank
3354 _____business_debug("Rang applique pour le pour le joueur (offline) "..user_id.." | "..tostring(finaldata.rank))
3355 vRP.setUData(user_id,"vRP:datatable",json.encode(finaldata))
3356 Citizen.Wait(3000)
3357 business_wait_rank[user_id] = false
3358 else
3359 vRPclient.notify(player,{"~r~Une erreur est survenue. Essayez plus tard."})
3360 business_wait_rank[user_id] = false
3361 end
3362 end)
3363 end
3364end
3365
3366-- Enable to know if user have a job
3367function vRP.checkUnjob(user_id)
3368 if vRP.hasGroup(user_id,cfgGroup.no_job_group) then
3369 _____business_debug("Le joueur "..user_id.." est sans emploi !!!")
3370 return true
3371 else
3372 return false
3373 end
3374end
3375
3376-- add book trace for sell
3377function vRP.addBookSell(player,amount)
3378 local _amount = amount
3379 local _player = player
3380 Citizen.CreateThread(function()
3381 local user_id = vRP.getUserId(_player)
3382 if user_id ~= nil then
3383 vRP.getBussinessPlayer(user_id, function(busi)
3384 if busi then
3385 vRP.getUserIdentity(user_id, function(identity)
3386 local name = identity.name.." "..identity.firstname
3387 _____business_debug("Enregistrement vente "..user_id.." | "..tostring(_amount))
3388 add_busi_book(busi.busi_id, "VENTE", "ENTREE", "Vente réalisée par : "..name.." (".._amount.." $)", _amount)
3389 end)
3390 else
3391 vRPclient.notify(player,{"~r~Impossible de déterminer ton entreprise, ta vente ne peut donc pas être répertoriée."})
3392 end
3393 end)
3394 end
3395 end)
3396end
3397
3398-- add book pound
3399function vRP.addBookPound(busi_id,amount,name,user_id)
3400 local _amount = amount
3401 local _busi_id = busi_id
3402 local _name = name
3403 Citizen.CreateThread(function()
3404 _____business_debug("Enregistrement fourrière "..user_id.." | "..tostring(_amount).." pour l'entreprise : ".._busi_id)
3405 add_busi_book(_busi_id, "VENTE", "ENTREE", "Mise en fourrière perçue. Réalisée par : ".._name.." (".._amount.." $)", _amount)
3406 end)
3407end
3408
3409-- add mission reward to busi log
3410function vRP.addBookMission(player,amount)
3411 local _amount = amount
3412 local _player = player
3413 Citizen.CreateThread(function()
3414 local user_id = vRP.getUserId(_player)
3415 if user_id ~= nil then
3416 vRP.getBussinessPlayer(user_id, function(busi)
3417 if busi then
3418 vRP.getUserIdentity(user_id, function(identity)
3419 local name = identity.name.." "..identity.firstname
3420 _____business_debug("Enregistrement vente "..user_id.." | "..tostring(_amount))
3421 add_busi_book(busi.busi_id, "VENTE", "ENTREE", "Mission réalisée par : "..name.." (".._amount.." $)", _amount)
3422 end)
3423 else
3424 vRPclient.notify(player,{"~r~Impossible de déterminer ton entreprise, ta vente ne peut donc pas être répertoriée."})
3425 end
3426 end)
3427 end
3428 end)
3429end
3430
3431function vRP.addBookBusiTax(busi_id,amount)
3432 local _amount = amount
3433 local _busi_id = busi_id
3434 Citizen.CreateThread(function()
3435 _____business_debug("Enregistrement taxe business | "..tostring(_amount).." pour l'entreprise : ".._busi_id)
3436 add_busi_book(_busi_id, "RETRAIT", "SORTIE", "Retrait d'argent de la trésorerie par l'administration | Raison : taxe entreprise", _amount)
3437 end)
3438end
3439
3440function vRP.checkPlayerMedic(user_id)
3441 if user_id then
3442 return checkIfMedic(user_id)
3443 else
3444 return true
3445 end
3446end
3447
3448function vRP.ch_create_book_busi(player,target_id)
3449 if target_id then
3450 vRP.getBussinessPlayer(target_id, function(busi)
3451 if busi then
3452 if vRP.getRank(target_id) >= 6 then
3453 TriggerClientEvent("business:openBook", player, busi.busi_name, busi.busi_id)
3454 else
3455 vRPclient.notify(player,{"~r~Le livret est disponible uniquement à partir du rang 6 !!"})
3456 end
3457 else
3458 vRPclient.notify(player,{"~r~Le joueur ne dispose pas d'entreprise !"})
3459 end
3460 end)
3461 end
3462end
3463
3464-- Return business ID where player belong to
3465function vRP.getBussinessPlayer(user_id,cbr)
3466 local task = Task(cbr, {nil})
3467 user_id = tonumber(user_id)
3468 local data = vRP.getUserDataTable(user_id)
3469 if data then
3470 _____business_debug("récupération de l'entreprise pour le joueur (online) "..user_id.." | "..tostring(data.business))
3471 task({data.business})
3472 else
3473 -- player offline then we change value in database
3474 vRP.getUData(user_id,"vRP:datatable", function(offdata)
3475 local finaldata = json.decode(offdata) or nil
3476 if finaldata then
3477 _____business_debug("récupération de l'entreprise pour le joueur (offline) "..user_id.." | "..tostring(finaldata.business))
3478 task({finaldata.business})
3479 else
3480 _____business_debug("une erreur est survenue lors de la récupération de l'entreprise pour le joueur "..user_id)
3481 task()
3482 end
3483 end)
3484 end
3485end
3486
3487-- Change businness ID for player
3488function vRP.setBussinessPlayer(player,user_id,value)
3489 user_id = tonumber(user_id)
3490 local data = vRP.getUserDataTable(user_id)
3491 if data then
3492 data.business = value
3493 _____business_debug("Entreprise applique pour le pour le joueur (online) "..user_id.." | "..tostring(data.business))
3494 -- here we force a save becuase this value is critical !
3495 vRP.setUData(user_id,"vRP:datatable",json.encode(data))
3496 Citizen.Wait(3000)
3497 business_wait_business[user_id] = false
3498 can_remove_from_busi[user_id] = true
3499 else
3500 -- player offline then we change value in database
3501 vRP.getUData(user_id,"vRP:datatable", function(offdata)
3502 local finaldata = json.decode(offdata) or nil
3503 if finaldata then
3504 finaldata.business = value
3505 _____business_debug("Entreprise applique pour le pour le joueur (offline) "..user_id.." | "..tostring(finaldata.business))
3506 vRP.setUData(user_id,"vRP:datatable",json.encode(finaldata))
3507 Citizen.Wait(3000)
3508 can_remove_from_busi[user_id] = true
3509 business_wait_business[user_id] = false
3510 else
3511 vRPclient.notify(player,{"~r~Une erreur est survenue. Essayez plus tard."})
3512 business_wait_business[user_id] = false
3513 end
3514 end)
3515 end
3516end
3517
3518-- Build area for business chest added by serrat
3519
3520function build_client_chestbusi(source)
3521 local source = source
3522 local user_id = vRP.getUserId(source)
3523 if user_id ~= nil then
3524 for k,v in pairs(businesschest) do
3525 local group,x,y,z = table.unpack(v)
3526
3527 if vRP.hasGroup(user_id,group) then
3528
3529 -- enter
3530 local busichest_enter = function(player,area)
3531 local user_id = vRP.getUserId(source)
3532 vRP.getBussinessPlayer(user_id, function(business)
3533 if business then
3534 vRP.getUserBusiness(business.busi_id, function(busi)
3535 local size = busi.size
3536 if vRP.hasGroup(user_id,"Convoyeur") then
3537 size = 1000
3538 end
3539 if busi.chest_rank ~= nil then
3540 vRP.openChest(player, "u"..business.busi_id.."business",size,nil,nil,nil,tonumber(busi.chest_rank))
3541 else
3542 vRP.openChest(player, "u"..business.busi_id.."business",size,nil,nil,nil,cfg.busi_chest_rank_min)
3543 end
3544 end)
3545 else
3546 --No business ? maybe a cop or a douchbag ems
3547 if vRP.hasGroup(user_id,"Police") or vRP.hasGroup(user_id,"Ambulancier") or vRP.hasGroup(user_id,"Fbi") or vRP.hasGroup(user_id,"Sheriff") then
3548 -- utility service get a huge chest
3549 vRP.openChest(player, "u"..group.."business",1000,nil,nil,nil,cfg.busi_chest_rank_min)
3550 end
3551 end
3552 end)
3553 end
3554
3555 -- leave
3556 local busichest_leave = function(player,area)
3557 vRP.closeMenu(player)
3558 end
3559 vRPclient.removeNamedBlip(source,{"vRP:Business"})
3560 vRPclient.removeNamedMarker(source,{"vRP:Business"})
3561 vRPclient.setNamedBlip(source,{"vRP:Business",x,y,z,408,8,"Coffre"})
3562 vRPclient.setNamedMarker(source,{"vRP:Business",x,y,z-1,0.7,0.7,0.5,0,255,125,125,150})
3563 vRP.removeArea(source,"vRP:busichest"..k)
3564 vRP.setArea(source,"vRP:busichest"..k,x,y,z,1,1.5,busichest_enter,busichest_leave)
3565 end
3566 end
3567 end
3568end
3569
3570AddEventHandler("vRP:playerSpawn",function(user_id,source,first_spawn)
3571 if first_spawn then
3572 build_client_chestbusi(source)
3573 end
3574end)
3575
3576--====================================================================================
3577-- EVENTS
3578--====================================================================================
3579
3580AddEventHandler("business:sendPhoneMsg", function(user_id,busi_name,busi_id,tplayer)
3581 local _tplayer = tplayer
3582 local _user_id = user_id
3583 local _busi_name = busi_name
3584
3585 if _user_id then
3586 vRP.getUserIdentity(_user_id, function(identity)
3587 local name = identity.firstname.." "..identity.name
3588 -- send SMS
3589 TriggerEvent('gcPhone:receiveFireMsg', name, _busi_name, identity.phone, _tplayer)
3590 end)
3591 end
3592
3593end)
3594
3595RegisterServerEvent('business:CheckSpawnPlayer')
3596AddEventHandler('business:CheckSpawnPlayer', function()
3597 local _source = source
3598 local user_id = vRP.getUserId(_source)
3599
3600 if user_id then
3601 vRP.getBussinessPlayer(user_id, function(business)
3602 if business == nil then
3603
3604 -- user don't have business so we need to check if he haven't jobs (this is for module intregration into existing database !!)
3605 local user_groups = vRP.getUserGroups(user_id)
3606 for k,v in pairs(user_groups) do
3607 local kgroup = groups[k]
3608 if kgroup then
3609 if kgroup._config and kgroup._config.gtype and kgroup._config.gtype == "job" then
3610 if k ~= "Fbi" and k ~= "Police" and k ~= "Ambulancier" and k ~= "Vice Gouverneur"
3611 and k ~= "Sheriff" and k ~= "Gouverneur" then
3612 _____business_debug("init player suppression groupe "..k.." | "..user_id)
3613 vRP.removeUserGroup(user_id,k)
3614 end
3615 end
3616 end
3617 end
3618
3619 if not checkSpecialJob(user_id) then
3620 -- add group unjob
3621 vRP.addUserGroup(user_id,cfgGroup.no_job_group)
3622 elseif checkIfMedic(user_id) then
3623 -- special treatment for medics (for system integration we must define them busi + rank !!)
3624 -- add rank and business to leader
3625 vRP.setBusinessRank(_source,user_id,0)
3626 vRP.setBussinessPlayer(_source,user_id,{busi_id = allowed_business_bill["Ambulancier"], busi_name = "Ambulancier"})
3627 -- add user in server local array (allow him to valid paycheck verification)
3628 add_busi_salarie(-2,user_id,0)
3629 vRP.addSalaryBussiness(-2, user_id, 0)
3630 end
3631 end
3632 end)
3633 end
3634end)
3635
3636RegisterServerEvent('business:create_business')
3637AddEventHandler('business:create_business', function(name,capital,sector)
3638 local Source = source
3639 local _name = name
3640 local _capital = capital
3641 local _sector = sector
3642 local user_id = vRP.getUserId(Source)
3643
3644 if user_id ~= nil then
3645 if vRP.isAllowedToCreateBusi(user_id) then
3646 -- we need to check if a business already have the same name
3647 check_busi_name(name, function(existing_busi)
3648 if existing_busi == false then
3649 vRP.getBussinessPlayer(user_id, function(business)
3650 if business == nil then
3651 if string.len(_name) >= 2 and string.len(_name) <= 30 then
3652 _name = sanitizeString(_name, sanitizes.business_name[1], sanitizes.business_name[2])
3653 if _capital >= cfg.minimum_capital then
3654 local amountTax = vRP.getEarningValueByCat("busi_create_tax")
3655 if _capital > amountTax then
3656 if vRP.tryPayment(user_id,_capital) then
3657 local salaries = {}
3658 -- add leader in salaries table
3659 salaries[user_id] = 7
3660 -- reduce tax from capital given
3661 _capital = _capital - amountTax
3662 MySQL.query("vRP/create_business", {
3663 user_id = user_id,
3664 name = _name,
3665 capital = _capital,
3666 time = os.time(),
3667 sector = _sector,
3668 sal = json.encode(salaries)
3669 })
3670
3671 -- add rank and business to leader
3672 vRP.setRank(user_id,7)
3673 vRP.setBussinessPlayer(Source,user_id,{busi_id = user_id, busi_name = _name})
3674
3675 -- add job to user
3676 vRP.addUserGroup(user_id, _sector)
3677 vRP.stopMission(Source)
3678
3679 create_busi_salarie(user_id,user_id,7)
3680 vRP.setBusiTreasury(user_id,0)
3681 vRP.setProductivityPlayer(user_id,0)
3682
3683 vRP.updateCityMoney(amountTax)
3684 vRPclient.notify(Source,{lang.business.open.created()})
3685 vRPclient.notify(Source,{lang.business.addcapital.tax({amountTax})})
3686 TriggerClientEvent("business:closeCreator", Source)
3687 build_client_chestbusi(Source)
3688 vRP.setCreateBusiState(user_id, nil)
3689
3690 vRP.closeMenu(Source)
3691 else
3692 vRPclient.notify(Source,{lang.money.not_enough()})
3693 TriggerClientEvent("business:disableLoading", Source)
3694 end
3695 else
3696 vRPclient.notify(Source,{lang.money.not_enough_tax({amountTax})})
3697 TriggerClientEvent("business:disableLoading", Source)
3698 end
3699 else
3700 vRPclient.notify(Source,{lang.common.invalid_value()})
3701 TriggerClientEvent("business:disableLoading", Source)
3702 end
3703 else
3704 vRPclient.notify(Source,{lang.common.invalid_name()})
3705 TriggerClientEvent("business:disableLoading", Source)
3706 end
3707 else
3708 vRPclient.notify(Source,{"~r~Vous ne pouvez pas créer d'entreprise si vous êtes déjà salarié !!"})
3709 TriggerClientEvent("business:disableLoading", Source)
3710 end
3711 end)
3712 else
3713 vRPclient.notify(Source,{"~r~Le nom que vous avez choisit est déjà utilisé !!"})
3714 TriggerClientEvent("business:disableLoading", Source)
3715 end
3716 end)
3717 else
3718 vRPclient.notify(Source,{"~r~Vous n'avez pas reçu l'autorisation du Gouverneur !!"})
3719 TriggerClientEvent("business:disableLoading", Source)
3720 end
3721 end
3722end)
3723
3724RegisterServerEvent('business:commercial_manage_business')
3725AddEventHandler('business:commercial_manage_business', function(type,param)
3726 local Source = source
3727 local _type = type
3728 local _param = param
3729 local user_id = vRP.getUserId(Source)
3730
3731 if user_id ~= nil then
3732 if _type == "delete_busi" then ch_delete_busi(Source,user_id,param,false) end
3733 if _type == "add_capital" then ch_add_capital(Source,user_id,param) end
3734 if _type == "sell_capital" then ch_sell_capital(Source,user_id,param) end
3735 end
3736end)
3737
3738RegisterServerEvent('business:create_offer')
3739AddEventHandler('business:create_offer', function(rank,desc,title)
3740 local Source = source
3741 local _rank = rank
3742 local _desc = desc
3743 local _title = title
3744 local user_id = vRP.getUserId(Source)
3745
3746 if user_id ~= nil then
3747 vRP.getBussinessPlayer(user_id, function(busi)
3748 -- get business
3749 if busi then
3750 vRP.getUserBusiness(busi.busi_id, function(business)
3751 if business then
3752 -- we can now create job offer
3753 local date = os.date("%d/%m/%Y %H:%M:%S")
3754 _rank = tonumber(_rank)
3755
3756 check_job_offers(busi.busi_id,_rank, function(offer)
3757 if not offer then
3758 vRP.getUserIdentity(user_id, function(identity)
3759 -- get sender identity
3760 local offer_creator = identity.firstname.." "..identity.name
3761 add_job_offer(busi.busi_id, business.name, business.activity_sector, offer_creator, _rank, date, _desc, _title)
3762 vRPclient.notify(Source,{"~g~Offre d'emploi créée"})
3763 end)
3764 else
3765 vRPclient.notify(Source,{"~r~Vous disposez déjà d'une offre d'emploi pour ce rang!!"})
3766 end
3767 end)
3768 else
3769 vRPclient.notify(Source,{"~r~Impossible de déterminer votre entreprise !!"})
3770 end
3771 end)
3772 else
3773 vRPclient.notify(Source,{"~r~Impossible de déterminer l'identifiant de votre entreprise !!"})
3774 end
3775 end)
3776 end
3777end)
3778
3779RegisterServerEvent('business:busi_offers_action')
3780AddEventHandler('business:busi_offers_action', function(type,value,param)
3781 local Source = source
3782 local _type = type
3783 local _param = param
3784 local _value = value
3785 local user_id = vRP.getUserId(Source)
3786
3787 if user_id ~= nil then
3788 if _type == "tel" then ch_busi_offers_tel(Source,user_id,_value,param) end
3789 if _type == "ok" then ch_busi_offers_ok(Source,user_id,_value,param) end
3790 if _type == "nok" then ch_busi_offers_nok(Source,user_id,_value,param) end
3791 end
3792end)
3793
3794
3795RegisterServerEvent('business:jobQuick')
3796AddEventHandler('business:jobQuick', function(type,param)
3797 local Source = source
3798 local _type = type
3799 local _param = param
3800 local user_id = vRP.getUserId(Source)
3801
3802 if user_id ~= nil then
3803 if _type == "delete_request" then ch_job_delete_request(Source,user_id,param) end
3804 end
3805end)
3806
3807RegisterServerEvent('business:jobSet')
3808AddEventHandler('business:jobSet', function(type,param,value)
3809 local Source = source
3810 local _type = type
3811 local _param = param
3812 local _value = value
3813 local user_id = vRP.getUserId(Source)
3814
3815 if user_id ~= nil then
3816 if _type == "create_request" then ch_busi_create_request(Source,user_id,_value,_param) end
3817 if _type == "immediat_job" then ch_busi_immediat_job(Source,user_id,_value,_param) end
3818 end
3819end)
3820
3821RegisterServerEvent('business:get_book_bills')
3822AddEventHandler('business:get_book_bills', function(date, date2, type, tag, book_busi_id)
3823 local Source = source
3824 local _date = date
3825 local _date2 = date2
3826 local _type = type
3827 local _tag = tag
3828 local _book_busi_id = book_busi_id
3829 local user_id = vRP.getUserId(Source)
3830
3831 if user_id ~= nil then
3832 ch_get_busi_book(Source,user_id,_tag,_type,_date,_date2,_book_busi_id)
3833 end
3834end)
3835
3836RegisterServerEvent('business:removeDiv')
3837AddEventHandler('business:removeDiv', function()
3838 local _source = source
3839 if busi_notes[_source] then
3840 busi_notes[_source] = nil
3841 vRPclient.removeDiv(_source,{"busi_player_notes"})
3842 end
3843end)
3844
3845AddEventHandler('business:playerLeaveJob', function(user_id)
3846 local _user_id = user_id
3847 -- auto fire
3848 ch_fire_salary(nil,_user_id,true,false,nil,false,true)
3849end)
3850
3851AddEventHandler('admin:cleanJob', function(player,target_id)
3852 local player = player
3853 local target_id = tonumber(target_id)
3854 Citizen.CreateThread(function()
3855 vRPclient.notify(player,{"~o~Nettoyage variables joueur .."})
3856 vRP.getBussinessPlayer(target_id, function(busi)
3857 if busi then
3858 vRPclient.notify(player,{"~o~Entreprise identifiée, reset en cours .."})
3859 if tonumber(busi.busi_id) == tonumber(target_id) then
3860 -- leader
3861 vRP.getUserBusiness(busi.busi_id, function(business)
3862 -- for security we make sure to at least remove player variables
3863 ch_fire_salary(nil,target_id,true,false,nil,false,false)
3864 Citizen.Wait(6000)
3865 vRP.setBussinessPlayer(player,target_id,nil)
3866 vRPclient.notify(player,{"~o~Vérification entreprise .."})
3867
3868 if business then
3869 -- try to reasign him .. (else we need to delete business)
3870 vRPclient.notify(player,{"~o~Le joueur été chef d'entreprise on essaye de lui re-asigner son rang .."})
3871 vRP.addUserBusinessGroup(player,target_id,business.activity_sector)
3872 vRP.setBusinessRank(player,target_id,7)
3873 vRP.setBussinessPlayer(player,target_id,{busi_id = busi.busi_id, busi_name = busi.busi_name})
3874 vRP.setProductivityPlayer(target_id,0)
3875 vRP.toggleServiceState(target_id,nil)
3876 vRP.addSalaryBussiness(busi.busi_id, target_id, 7)
3877 else
3878 vRPclient.notify(player,{"~o~Système en vrac supression entreprise server et base! JOUEUR A REMBOURSER .."})
3879 -- no busi __> system is fucked up delete business
3880 ch_delete_busi(player,target_id,busi.busi_id,true)
3881 end
3882 Citizen.Wait(12000)
3883 vRPclient.notify(player,{"~g~Nettoyage terminé"})
3884 end)
3885 else
3886 -- salary
3887 -- fire
3888 -- launch global method which clean busi side (db & server)
3889 ch_fire_salary(nil,target_id,true,false,nil,false,true)
3890 Citizen.Wait(6000)
3891 vRP.setBussinessPlayer(player,target_id,nil)
3892 vRPclient.notify(player,{"~g~Nettoyage terminé"})
3893 end
3894 else
3895 vRPclient.notify(player,{"~o~Le joueur n'avait aucune entreprise assignée, reset variables joueur en cours .."})
3896 -- launch global method which clean busi side (db & server)
3897 ch_fire_salary(nil,target_id,true,false,nil,false,false)
3898 Citizen.Wait(6000)
3899 -- for security we make sure to at least remove player variables
3900 vRP.addUserBusinessGroup(player,target_id,cfgGroup.no_job_group)
3901 vRP.setBusinessRank(player,target_id,-1)
3902 vRP.setBussinessPlayer(player,target_id,nil)
3903 vRP.setProductivityPlayer(target_id,0)
3904 vRP.toggleServiceState(target_id,nil)
3905 Citizen.Wait(6000)
3906 vRPclient.notify(player,{"~g~Nettoyage terminé"})
3907 end
3908 end)
3909 end)
3910end)