HomeController.cs 42 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Globalization;
  5. using System.Threading;
  6. using System.Threading.Tasks;
  7. using LotteryWebApp.Common;
  8. using LotteryWebApp.Extensions;
  9. using LotteryWebApp.Languages;
  10. using LotteryWebApp.Models;
  11. using LotteryWebApp.Service;
  12. using Microsoft.AspNetCore.Hosting;
  13. using Microsoft.AspNetCore.Http;
  14. using Microsoft.AspNetCore.Mvc;
  15. using Microsoft.Extensions.Configuration;
  16. using Newtonsoft.Json;
  17. using LotteryWebApp.Controllers;
  18. namespace LotteryWebApp.Areas.Millions.Controllers
  19. {
  20. [Area("Millions")]
  21. [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
  22. public class HomeController : BaseController
  23. {
  24. private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));
  25. IConfiguration configuration;
  26. private readonly IWebHostEnvironment webHostEnvironment;
  27. APIFunctions api = new APIFunctions();
  28. public HomeController(IConfiguration _configuration, IWebHostEnvironment hostEnvironment)
  29. {
  30. configuration = _configuration;
  31. webHostEnvironment = hostEnvironment;
  32. }
  33. public String GetParameter(String key)
  34. {
  35. return configuration.GetSection(key).Value;
  36. }
  37. public async Task<IActionResult> Index(
  38. string termType,
  39. String uuid,
  40. String mcuid,
  41. String phonenumber,
  42. String token
  43. )
  44. {
  45. HomeIndex_ViewModel model = new HomeIndex_ViewModel();
  46. try
  47. {
  48. CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;
  49. String lang = currentCulture.Name;
  50. String msisdnAuto = null;
  51. if (!CheckAuthToken())
  52. {
  53. if (token != null)
  54. {
  55. AutoLoginRequest autoLoginRequest = new AutoLoginRequest { token = token };
  56. AutoLoginResponse autoLoginResponse = await api.AutoLoginApiAsync(configuration, autoLoginRequest);
  57. if (autoLoginResponse.code == Code.SUCCESS_CODE)
  58. {
  59. string msisdnReal = validateMsisdn(autoLoginResponse.data.msisdn.Substring(1));
  60. if (msisdnReal == "") return RedirectToAction("Login", "Account", new { area = "" });
  61. CheckAccountRequest checkAccountRequest = new CheckAccountRequest
  62. {
  63. msisdn = msisdnReal,
  64. channel = Constants.WEB_CHANNEL,
  65. language = lang == "en" ? "0" : "1"
  66. };
  67. CheckAccountResponse checkAccountResponse = api.CheckAccountApi(configuration, checkAccountRequest);
  68. if (checkAccountResponse.status == Code.SUCCESS)
  69. {
  70. string tokenGetReal = checkAccountResponse.token;
  71. HttpContext.Session.SetComplexData("msisdn", msisdnReal);
  72. CreateAuthToken();
  73. HttpContext.Session.SetComplexData("token", tokenGetReal);
  74. UserGetProfileRequest userGetProfileRequest = new UserGetProfileRequest { users = msisdnReal, token = tokenGetReal };
  75. Profile profileGet = api.UserLoadProfileApi(configuration, userGetProfileRequest);
  76. HttpContext.Session.SetComplexData("profile", profileGet);
  77. UserStatusRequest userStatusRequest = new UserStatusRequest { users = msisdnReal, token = tokenGetReal };
  78. UserStatus userStatusGet = api.GetUserStatusApi(configuration, userStatusRequest);
  79. HttpContext.Session.SetComplexData("userStatus", userStatusGet);
  80. }
  81. else
  82. {
  83. return RedirectToAction("Login", "Account", new { area = "" });
  84. }
  85. }
  86. }
  87. else if (uuid != null)
  88. {
  89. String res = await CheckAutoLogin(log, uuid);
  90. if (res != null)
  91. {
  92. dynamic json = JsonConvert.DeserializeObject(res);
  93. if (json["code"] == "200" && json["errorCode"] == "200")
  94. {
  95. msisdnAuto = json["data"]["msisdn"];
  96. }
  97. }
  98. String msisdnDetect = validateMsisdn(msisdnAuto.Substring(1));
  99. if (msisdnDetect != "")
  100. {
  101. RegisterRequest request = new RegisterRequest { Msisdn = msisdnDetect };
  102. RegisterResponse reset = api.UserForgotPasswordApi(configuration, request);
  103. if (reset.status == Code.SUCCESS)
  104. {
  105. HttpContext.Session.Remove("regInfos");
  106. HttpContext.Session.SetComplexData("msisdn", msisdnDetect);
  107. return RedirectToAction("Login", "Account", new { area = "", step = 2 });
  108. }
  109. }
  110. return RedirectToAction("Login", "Account", new { area = "" });
  111. }
  112. else if (phonenumber != null)
  113. {
  114. // simplified or same logic as original
  115. return RedirectToAction("Login", "Account", new { area = "" });
  116. }
  117. else
  118. {
  119. // If no token/uuid and not auth, verify existing session token
  120. var savedToken = HttpContext.Session.GetString("token");
  121. if (string.IsNullOrEmpty(savedToken))
  122. {
  123. return RedirectToAction("Login", "Account", new { area = "" });
  124. }
  125. }
  126. }
  127. Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
  128. UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
  129. model.termType = termType != null ? termType : Constants.Millions_CODE;
  130. model.userStatus = userStatus;
  131. model.profile = profile;
  132. model.listTerm = new List<Term>();
  133. String tokenGet = HttpContext.Session.GetComplexData<String>("token");
  134. String fromDate = DateTime.Now.AddDays(-2).ToString("dd/MM/yyyy");
  135. String toDate = DateTime.Now.ToString("dd/MM/yyyy");
  136. // Get Top Winner
  137. GetTopWinnerRequest getTopWinnerRequest = new GetTopWinnerRequest { type = lang == "en" ? "0" : "1", token = tokenGet };
  138. GetTopWininerResponse getTopWininerResponse = api.GetTopWinnerApi(configuration, getTopWinnerRequest);
  139. if (getTopWininerResponse.responseCode == Code.SUCCESS)
  140. {
  141. model.topWinner = getTopWininerResponse.list;
  142. HttpContext.Session.SetComplexData("topWinner", model.topWinner);
  143. }
  144. // Get Term Results
  145. //ResultOfTermRequest resultOfTermRequest = new ResultOfTermRequest
  146. //{
  147. // gameId = model.termType,
  148. // token = tokenGet,
  149. // type = Constants.TERM_HAS_NOT_RESULT_TYPE,
  150. // order = Constants.DECS,
  151. // fromDate = fromDate,
  152. // toDate = toDate,
  153. // rowsOnPage = Constants.ROW_ON_PAGE,
  154. // seqPage = "1",
  155. // id = Constants.ALL_DATA
  156. //};
  157. //ResultOfTermResponse result = api.GetResultOfTermApi(configuration, resultOfTermRequest);
  158. //if (result.responseCode == Code.SESSION_EXPIRED)
  159. //{
  160. // return RedirectToAction("Login", "Account", new { area = "" });
  161. //}
  162. //else if (result.responseCode == Code.SUCCESS)
  163. //{
  164. // model.listTerm = result.listTerm;
  165. //}
  166. if (!string.IsNullOrEmpty(termType))
  167. {
  168. HttpContext.Session.SetString("termType", termType);
  169. }
  170. }
  171. catch (Exception ex)
  172. {
  173. log.Error(ex);
  174. return RedirectToAction("Login", "Account", new { area = "" });
  175. }
  176. return View(model);
  177. }
  178. public async Task<IActionResult> GameHome(string termType)
  179. {
  180. HomeIndex_ViewModel model = new HomeIndex_ViewModel();
  181. try
  182. {
  183. var token = HttpContext.Session.GetComplexData<string>("token");
  184. if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
  185. {
  186. return RedirectToAction("Login", "Account", new { area = "" });
  187. }
  188. Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
  189. UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
  190. model.termType = termType != null ? termType : Constants.Millions_CODE;
  191. model.userStatus = userStatus;
  192. model.profile = profile;
  193. model.listTerm = new List<Term>();
  194. if (!string.IsNullOrEmpty(termType))
  195. {
  196. HttpContext.Session.SetString("termType", termType);
  197. }
  198. }
  199. catch (Exception ex)
  200. {
  201. log.Error(ex);
  202. }
  203. return View(model);
  204. }
  205. public async Task<IActionResult> FAQ()
  206. {
  207. HomeIndex_ViewModel model = new HomeIndex_ViewModel();
  208. try
  209. {
  210. var token = HttpContext.Session.GetComplexData<string>("token");
  211. if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
  212. {
  213. return RedirectToAction("Login", "Account", new { area = "" });
  214. }
  215. Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
  216. UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
  217. model.userStatus = userStatus;
  218. model.profile = profile;
  219. }
  220. catch (Exception ex)
  221. {
  222. log.Error(ex);
  223. }
  224. return View(model);
  225. }
  226. public IActionResult More()
  227. {
  228. HomeIndex_ViewModel model = new HomeIndex_ViewModel();
  229. try
  230. {
  231. var token = HttpContext.Session.GetComplexData<string>("token");
  232. if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
  233. {
  234. return RedirectToAction("Login", "Account", new { area = "" });
  235. }
  236. Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
  237. UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
  238. model.userStatus = userStatus;
  239. model.profile = profile;
  240. }
  241. catch (Exception ex)
  242. {
  243. log.Error(ex);
  244. }
  245. return View(model);
  246. }
  247. public IActionResult Profile()
  248. {
  249. HomeIndex_ViewModel model = new HomeIndex_ViewModel();
  250. try
  251. {
  252. var token = HttpContext.Session.GetComplexData<string>("token");
  253. if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
  254. {
  255. return RedirectToAction("Login", "Account", new { area = "" });
  256. }
  257. Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
  258. UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
  259. model.userStatus = userStatus;
  260. model.profile = profile;
  261. }
  262. catch (Exception ex)
  263. {
  264. log.Error(ex);
  265. }
  266. return View(model);
  267. }
  268. [HttpPost]
  269. public IActionResult UserUpdateProfile(string fullName, string birthday)
  270. {
  271. try
  272. {
  273. string msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
  274. string token = HttpContext.Session.GetComplexData<string>("token");
  275. if (string.IsNullOrEmpty(msisdn) || string.IsNullOrEmpty(token))
  276. {
  277. return Json(new { status = Code.ERROR, message = "Session expired" });
  278. }
  279. string birthdayFormat = birthday;
  280. if (!string.IsNullOrEmpty(birthday) && birthday.Contains("-"))
  281. {
  282. try {
  283. birthdayFormat = DateTime.ParseExact(birthday, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy");
  284. } catch { }
  285. }
  286. UserUpdateProfileRequest request = new UserUpdateProfileRequest
  287. {
  288. users = msisdn,
  289. token = token,
  290. fullName = fullName,
  291. birthday = birthdayFormat
  292. };
  293. UserUpdateProfileResponse response = api.UserUpdateProfileApi(configuration, request);
  294. if (response.status == Code.SUCCESS)
  295. {
  296. // Update session profile
  297. Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
  298. if (profile != null)
  299. {
  300. profile.fullName = fullName;
  301. profile.birthday = birthdayFormat;
  302. HttpContext.Session.SetComplexData("profile", profile);
  303. }
  304. }
  305. return Json(response);
  306. }
  307. catch (Exception ex)
  308. {
  309. log.Error(ex);
  310. return Json(new { status = Code.ERROR, message = ex.Message });
  311. }
  312. }
  313. public IActionResult Rule()
  314. {
  315. HomeIndex_ViewModel model = new HomeIndex_ViewModel();
  316. try
  317. {
  318. var token = HttpContext.Session.GetComplexData<string>("token");
  319. if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
  320. {
  321. return RedirectToAction("Login", "Account", new { area = "" });
  322. }
  323. Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
  324. UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
  325. model.userStatus = userStatus;
  326. model.profile = profile;
  327. }
  328. catch (Exception ex)
  329. {
  330. log.Error(ex);
  331. }
  332. return View(model);
  333. }
  334. public IActionResult HowToPlay()
  335. {
  336. HomeIndex_ViewModel model = new HomeIndex_ViewModel();
  337. try
  338. {
  339. var token = HttpContext.Session.GetComplexData<string>("token");
  340. if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
  341. {
  342. return RedirectToAction("Login", "Account", new { area = "" });
  343. }
  344. Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
  345. UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
  346. model.userStatus = userStatus;
  347. model.profile = profile;
  348. }
  349. catch (Exception ex)
  350. {
  351. log.Error(ex);
  352. }
  353. return View(model);
  354. }
  355. public IActionResult Results(string termType, string fromDate, string toDate)
  356. {
  357. TermResultHistoryModel model = new TermResultHistoryModel();
  358. try
  359. {
  360. var token = HttpContext.Session.GetComplexData<string>("token");
  361. if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
  362. {
  363. return RedirectToAction("Login", "Account", new { area = "" });
  364. }
  365. Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
  366. UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
  367. model.termType = termType != null ? termType : (HttpContext.Session.GetString("termType") ?? Constants.Millions_CODE);
  368. // Set default dates if not provided (same as root implementation)
  369. string fromFormatted = fromDate != null ? fromDate : DateTime.Now.AddDays(-2).ToString("yyyy-MM-dd");
  370. string toFormatted = toDate != null ? toDate : DateTime.Now.ToString("yyyy-MM-dd");
  371. model.fromDate = fromFormatted;
  372. model.toDate = toFormatted;
  373. // Load initial results
  374. ResultOfTermRequest resultOfTermRequest = new ResultOfTermRequest
  375. {
  376. gameId = model.termType,
  377. token = token,
  378. type = Constants.TERM_HAS_RESULT_TYPE,
  379. order = Constants.DECS,
  380. fromDate = DateTime.ParseExact(fromFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
  381. toDate = DateTime.ParseExact(toFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
  382. rowsOnPage = Constants.ROW_ON_PAGE,
  383. seqPage = "1",
  384. id = Constants.ALL_DATA
  385. };
  386. ResultOfTermResponse result = api.GetResultOfTermApi(configuration, resultOfTermRequest);
  387. if (result.responseCode == Code.SUCCESS)
  388. {
  389. model.listTerm = result.listTerm ?? new List<Term>();
  390. }
  391. else
  392. {
  393. model.listTerm = new List<Term>();
  394. }
  395. }
  396. catch (Exception ex)
  397. {
  398. log.Error(ex);
  399. model.listTerm = new List<Term>();
  400. }
  401. return View(model);
  402. }
  403. public IActionResult TermResultHistory(string termType, string fromDate, string toDate)
  404. {
  405. TermResultHistoryModel model = new TermResultHistoryModel();
  406. try
  407. {
  408. var token = HttpContext.Session.GetComplexData<string>("token");
  409. if (string.IsNullOrEmpty(token)) return Json(new { status = "error", message = "Session expired" });
  410. string fromFormatted = fromDate != null ? fromDate : DateTime.Now.AddDays(-2).ToString("yyyy-MM-dd");
  411. string toFormatted = toDate != null ? toDate : DateTime.Now.ToString("yyyy-MM-dd");
  412. model.termType = termType;
  413. model.fromDate = fromFormatted;
  414. model.toDate = toFormatted;
  415. ResultOfTermRequest request = new ResultOfTermRequest
  416. {
  417. gameId = termType,
  418. token = token,
  419. type = Constants.TERM_HAS_RESULT_TYPE,
  420. order = Constants.DECS,
  421. fromDate = DateTime.ParseExact(fromFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
  422. toDate = DateTime.ParseExact(toFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
  423. rowsOnPage = Constants.ROW_ON_PAGE,
  424. seqPage = "1",
  425. id = Constants.ALL_DATA
  426. };
  427. ResultOfTermResponse result = api.GetResultOfTermApi(configuration, request);
  428. if (result.responseCode == Code.SUCCESS)
  429. {
  430. model.listTerm = result.listTerm ?? new List<Term>();
  431. }
  432. else
  433. {
  434. model.listTerm = new List<Term>();
  435. }
  436. }
  437. catch (Exception ex)
  438. {
  439. log.Error(ex);
  440. model.listTerm = new List<Term>();
  441. }
  442. return PartialView("_TermResultHistoryV2", model);
  443. }
  444. public IActionResult TermResultHistoryGrouped(string fromDate, string toDate)
  445. {
  446. try
  447. {
  448. var token = HttpContext.Session.GetComplexData<string>("token");
  449. if (string.IsNullOrEmpty(token)) return Json(new { status = "error", message = "Session expired" });
  450. string fromFormatted = fromDate != null ? fromDate : DateTime.Now.AddDays(-2).ToString("yyyy-MM-dd");
  451. string toFormatted = toDate != null ? toDate : DateTime.Now.ToString("yyyy-MM-dd");
  452. string[] gameIds = { Constants.Millions_CODE };
  453. var allTerms = new List<Term>();
  454. foreach (var gid in gameIds)
  455. {
  456. ResultOfTermRequest request = new ResultOfTermRequest
  457. {
  458. gameId = gid,
  459. token = token,
  460. type = Constants.TERM_HAS_RESULT_TYPE,
  461. order = Constants.DECS,
  462. fromDate = DateTime.ParseExact(fromFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
  463. toDate = DateTime.ParseExact(toFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
  464. rowsOnPage = "50",
  465. seqPage = "1",
  466. id = Constants.ALL_DATA
  467. };
  468. ResultOfTermResponse result = api.GetResultOfTermApi(configuration, request);
  469. if (result.responseCode == Code.SUCCESS && result.listTerm != null)
  470. {
  471. allTerms.AddRange(result.listTerm);
  472. }
  473. }
  474. // Group by date part of date_random
  475. var grouped = allTerms.GroupBy(x => {
  476. DateTime dt;
  477. if (DateTime.TryParse(x.date_random, out dt))
  478. return dt.Date;
  479. return DateTime.MinValue;
  480. })
  481. .Where(g => g.Key != DateTime.MinValue)
  482. .OrderByDescending(g => g.Key)
  483. .ToList();
  484. return PartialView("_TermResultHistoryGrouped", grouped);
  485. }
  486. catch (Exception ex)
  487. {
  488. log.Error(ex);
  489. return PartialView("_TermResultHistoryGrouped", new List<IGrouping<DateTime, Term>>());
  490. }
  491. }
  492. public IActionResult History(string termType, string status, string seqPage)
  493. {
  494. UserTicketHistoryModel model = new UserTicketHistoryModel();
  495. try
  496. {
  497. var token = HttpContext.Session.GetComplexData<string>("token");
  498. if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
  499. {
  500. return RedirectToAction("Login", "Account", new { area = "" });
  501. }
  502. string msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
  503. model.termType = termType ?? Constants.Millions_CODE;
  504. model.status = status ?? Constants.ALL_DATA; // -1 for all, or 0, 1, 2
  505. model.seqPage = seqPage ?? "1";
  506. UserTicketRequest request = new UserTicketRequest
  507. {
  508. gameId = model.termType,
  509. msisdn = msisdn,
  510. token = token,
  511. type = model.status,
  512. order = Constants.DECS,
  513. rowsOnPage = Constants.ROW_ON_PAGE,
  514. seqPage = model.seqPage
  515. };
  516. UserTicketResponse result = api.GetUserTicketApi(configuration, request);
  517. if (result.responseCode == Code.SUCCESS)
  518. {
  519. model.listTicket = result.listTicket ?? new List<Ticket>();
  520. model.totalPage = result.totalPage;
  521. }
  522. else
  523. {
  524. model.listTicket = new List<Ticket>();
  525. model.totalPage = "0";
  526. }
  527. }
  528. catch (Exception ex)
  529. {
  530. log.Error(ex);
  531. model.listTicket = new List<Ticket>();
  532. }
  533. return View(model);
  534. }
  535. public IActionResult TermUserTicketHistory(string termType, string status, string seqPage)
  536. {
  537. UserTicketHistoryModel model = new UserTicketHistoryModel();
  538. try
  539. {
  540. var token = HttpContext.Session.GetComplexData<string>("token");
  541. if (string.IsNullOrEmpty(token)) return Json(new { status = "error", message = "Session expired" });
  542. string msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
  543. model.termType = termType;
  544. model.status = status;
  545. model.seqPage = seqPage ?? "1";
  546. UserTicketRequest request = new UserTicketRequest
  547. {
  548. gameId = termType,
  549. msisdn = msisdn,
  550. token = token,
  551. type = status,
  552. order = Constants.DECS,
  553. rowsOnPage = Constants.ROW_ON_PAGE,
  554. seqPage = model.seqPage
  555. };
  556. UserTicketResponse result = api.GetUserTicketApi(configuration, request);
  557. if (result.responseCode == Code.SUCCESS)
  558. {
  559. model.listTicket = result.listTicket ?? new List<Ticket>();
  560. model.totalPage = result.totalPage;
  561. }
  562. else
  563. {
  564. model.listTicket = new List<Ticket>();
  565. model.totalPage = "0";
  566. }
  567. }
  568. catch (Exception ex)
  569. {
  570. log.Error(ex);
  571. model.listTicket = new List<Ticket>();
  572. }
  573. return PartialView("_TermUserTicketHistory", model);
  574. }
  575. [HttpPost]
  576. [ValidateAntiForgeryToken]
  577. public IActionResult TermResult(string termType)
  578. {
  579. try
  580. {
  581. var token = HttpContext.Session.GetComplexData<string>("token");
  582. if (string.IsNullOrEmpty(token)) return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
  583. string lang = CultureInfo.CurrentCulture.Name;
  584. string langValue = (lang.StartsWith("en") || lang.StartsWith("fr")) ? "0" : "1";
  585. ResultOfTermRequest request = new ResultOfTermRequest
  586. {
  587. gameId = termType,
  588. language = langValue,
  589. token = token,
  590. type = Constants.TERM_HAS_NOT_RESULT_TYPE,
  591. order = Constants.DECS,
  592. rowsOnPage = "5",
  593. seqPage = "1",
  594. id = Constants.ALL_DATA
  595. };
  596. ResultOfTermResponse result = api.GetResultOfTermApi(configuration, request);
  597. return Json(result);
  598. }
  599. catch (Exception ex)
  600. {
  601. log.Error(ex);
  602. return Json(new { responseCode = Code.ERROR, responseMessage = ex.Message });
  603. }
  604. }
  605. [HttpPost]
  606. public IActionResult ConfirmTicketData([FromBody] ConfirmTicketDataRequest request)
  607. {
  608. try
  609. {
  610. var token = HttpContext.Session.GetComplexData<string>("token");
  611. var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
  612. if (string.IsNullOrEmpty(token)) return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
  613. request.token = token;
  614. request.msisdn = msisdn;
  615. request.language = CultureInfo.CurrentCulture.Name.StartsWith("en") ? "0" : "1";
  616. request.requestId = Guid.NewGuid().ToString();
  617. // DEBUG: Log request data
  618. var ticketDebug = request.ticket != null ? string.Join("; ", request.ticket.Select(t => $"code={t.code}, money={t.money}")) : "NULL";
  619. log.Info($"[ConfirmTicketData] gameId={request.gameId}, msisdn={request.msisdn}, tickets=[{ticketDebug}]");
  620. ConfirmTicketDataResponse response = api.ConfirmTicketDataApi(configuration, request);
  621. // DEBUG: Log response
  622. log.Info($"[ConfirmTicketData] Response: code={response.responseCode}, msg={response.responseMessage}, transId={response.transId}");
  623. return Json(response);
  624. }
  625. catch (Exception ex)
  626. {
  627. log.Error(ex);
  628. return Json(new { responseCode = Code.ERROR, responseMessage = ex.Message });
  629. }
  630. }
  631. [HttpPost]
  632. public IActionResult ConfirmOTP([FromBody] ConfirmOTPRequest request)
  633. {
  634. try
  635. {
  636. var token = HttpContext.Session.GetComplexData<string>("token");
  637. var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
  638. if (string.IsNullOrEmpty(token)) return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
  639. request.token = token;
  640. request.msisdn = msisdn;
  641. ConfirmOTPResponse response = api.ConfirmOTPApi(configuration, request);
  642. return Json(response);
  643. }
  644. catch (Exception ex)
  645. {
  646. log.Error(ex);
  647. return Json(new { responseCode = Code.ERROR, responseMessage = ex.Message });
  648. }
  649. }
  650. [HttpPost]
  651. public IActionResult SendOTP()
  652. {
  653. try
  654. {
  655. var token = HttpContext.Session.GetComplexData<string>("token");
  656. var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
  657. if (string.IsNullOrEmpty(token)) return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
  658. SendOTPRequest request = new SendOTPRequest
  659. {
  660. msisdn = msisdn,
  661. token = token,
  662. language = CultureInfo.CurrentCulture.Name.StartsWith("en") ? "0" : "1",
  663. channel = configuration.GetSection("channel").Value
  664. };
  665. SendOTPResponse response = api.SendOTPApi(configuration, request);
  666. return Json(response);
  667. }
  668. catch (Exception ex)
  669. {
  670. log.Error(ex);
  671. return Json(new { responseCode = Code.ERROR, responseMessage = ex.Message });
  672. }
  673. }
  674. [HttpPost]
  675. public IActionResult ConfirmBuyingTicketV2([FromBody] ConfirmBuyingTicketRequest request)
  676. {
  677. try
  678. {
  679. var token = HttpContext.Session.GetComplexData<string>("token");
  680. var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
  681. if (string.IsNullOrEmpty(token)) return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
  682. // Step 1: Verify OTP first
  683. ConfirmOTPRequest otpRequest = new ConfirmOTPRequest
  684. {
  685. otp = request.paymentCode,
  686. msisdn = msisdn,
  687. token = token,
  688. language = CultureInfo.CurrentCulture.Name.StartsWith("en") ? "0" : "1",
  689. channel = configuration.GetSection("channel").Value
  690. };
  691. ConfirmOTPResponse otpResponse = api.ConfirmOTPApi(configuration, otpRequest);
  692. if (otpResponse.responseCode != Code.SUCCESS)
  693. {
  694. return Json(new { responseCode = otpResponse.responseCode, responseMessage = otpResponse.responseMessage });
  695. }
  696. // Step 2: Proceed to Confirm buying
  697. request.token = token;
  698. request.msisdn = msisdn;
  699. request.requestId = Guid.NewGuid().ToString();
  700. request.language = CultureInfo.CurrentCulture.Name.StartsWith("en") ? "0" : "1";
  701. request.channel = configuration.GetSection("channel").Value;
  702. ConfirmBuyingTicketResponse response = api.ConfirmBuyingTicketApi(configuration, request);
  703. if (response.responseCode == Code.SUCCESS)
  704. {
  705. UpdateUserStatus(msisdn, token);
  706. }
  707. return Json(response);
  708. }
  709. catch (Exception ex)
  710. {
  711. log.Error(ex);
  712. return Json(new { responseCode = Code.ERROR, responseMessage = ex.Message });
  713. }
  714. }
  715. [HttpPost]
  716. public IActionResult ConfirmBuyingTicket([FromBody] ConfirmBuyingTicketRequest request)
  717. {
  718. try
  719. {
  720. var token = HttpContext.Session.GetComplexData<string>("token");
  721. var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
  722. if (string.IsNullOrEmpty(token)) return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
  723. request.token = token;
  724. request.msisdn = msisdn;
  725. request.requestId = Guid.NewGuid().ToString();
  726. request.language = CultureInfo.CurrentCulture.Name.StartsWith("en") ? "0" : "1";
  727. request.channel = configuration.GetSection("channel").Value;
  728. ConfirmBuyingTicketResponse response = api.ConfirmBuyingTicketApi(configuration, request);
  729. if (response.responseCode == Code.SUCCESS)
  730. {
  731. UpdateUserStatus(msisdn, token);
  732. }
  733. return Json(new {
  734. responseCode = response.responseCode,
  735. responseMessage = response.responseMessage,
  736. transId = response.transId,
  737. orderId = response.orderId,
  738. userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus")
  739. });
  740. }
  741. catch (Exception ex)
  742. {
  743. log.Error(ex);
  744. return Json(new { responseCode = Code.ERROR, responseMessage = ex.Message });
  745. }
  746. }
  747. public IActionResult BuyTicket(string termType)
  748. {
  749. try
  750. {
  751. var token = HttpContext.Session.GetComplexData<string>("token");
  752. if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
  753. {
  754. return RedirectToAction("Login", "Account", new { area = "" });
  755. }
  756. HomeIndex_ViewModel model = new HomeIndex_ViewModel();
  757. model.termType = termType ?? Constants.Millions_CODE;
  758. Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
  759. UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
  760. model.userStatus = userStatus;
  761. model.profile = profile;
  762. // Get active term
  763. ResultOfTermRequest request = new ResultOfTermRequest
  764. {
  765. gameId = model.termType,
  766. token = token,
  767. type = Constants.TERM_HAS_NOT_RESULT_TYPE,
  768. order = Constants.DECS,
  769. rowsOnPage = "1",
  770. seqPage = "1",
  771. id = Constants.ALL_DATA
  772. };
  773. ResultOfTermResponse result = api.GetResultOfTermApi(configuration, request);
  774. if (result.responseCode == Code.SUCCESS && result.listTerm != null && result.listTerm.Count > 0)
  775. {
  776. model.listTerm = result.listTerm;
  777. }
  778. else
  779. {
  780. model.listTerm = new List<Term>();
  781. }
  782. if (model.termType == Constants.PIC10_BIGSMALL_CODE || model.termType == Constants.PIC10_ODDEVEN_CODE)
  783. {
  784. ResultOfTermRequest pastRequest = new ResultOfTermRequest
  785. {
  786. gameId = model.termType,
  787. token = token,
  788. type = Constants.TERM_HAS_RESULT_TYPE,
  789. order = Constants.DECS,
  790. fromDate = DateTime.Now.AddDays(-10).ToString("dd/MM/yyyy"),
  791. toDate = DateTime.Now.ToString("dd/MM/yyyy"),
  792. rowsOnPage = "5",
  793. seqPage = "1",
  794. id = Constants.ALL_DATA
  795. };
  796. ResultOfTermResponse pastResult = api.GetResultOfTermApi(configuration, pastRequest);
  797. if (pastResult.responseCode == Code.SUCCESS && pastResult.listTerm != null)
  798. {
  799. var pastTerms = pastResult.listTerm.Take(5).ToList();
  800. pastTerms.Reverse(); // Display chronological order
  801. ViewBag.PastTerms = pastTerms;
  802. }
  803. else
  804. {
  805. ViewBag.PastTerms = new List<Term>();
  806. }
  807. }
  808. return View(model);
  809. }
  810. catch (Exception ex)
  811. {
  812. log.Error(ex);
  813. return RedirectToAction("GameHome", new { termType = termType });
  814. }
  815. }
  816. public IActionResult TransferWinMoney()
  817. {
  818. if (!CheckAuthToken())
  819. {
  820. return RedirectToAction("Login", "Account", new { area = "" });
  821. }
  822. HomeIndex_ViewModel model = new HomeIndex_ViewModel();
  823. model.profile = HttpContext.Session.GetComplexData<Profile>("profile");
  824. model.userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
  825. return View(model);
  826. }
  827. [HttpPost]
  828. public IActionResult ConfirmTransfer(string otp, string phone, string amount)
  829. {
  830. try
  831. {
  832. var token = HttpContext.Session.GetComplexData<string>("token");
  833. var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
  834. if (string.IsNullOrEmpty(token)) return Json(new { status = Code.SESSION_EXPIRED, message = "Session expired" });
  835. // Step 1: Verify OTP
  836. ConfirmOTPRequest otpRequest = new ConfirmOTPRequest
  837. {
  838. otp = otp,
  839. msisdn = msisdn,
  840. token = token,
  841. language = CultureInfo.CurrentCulture.Name.StartsWith("en") ? "0" : "1",
  842. channel = configuration.GetSection("channel").Value
  843. };
  844. ConfirmOTPResponse otpResponse = api.ConfirmOTPApi(configuration, otpRequest);
  845. if (otpResponse.responseCode != Code.SUCCESS)
  846. {
  847. return Json(new { status = otpResponse.responseCode, message = otpResponse.responseMessage });
  848. }
  849. // Step 2: If OTP success, call Transfer Money Api
  850. TransferMoneyRequest xferRequest = new TransferMoneyRequest
  851. {
  852. msisdn = msisdn,
  853. msisdnReceive = phone,
  854. money = amount,
  855. otp = otp,
  856. token = token,
  857. channelPayment = Constants.BASIC_WALLET_TRANSFER,
  858. language = CultureInfo.CurrentCulture.Name.StartsWith("en") ? "0" : "1",
  859. channel = configuration.GetSection("channel").Value
  860. };
  861. TransferMoneyResponse xferResponse = api.TransferMoneyApi(configuration, xferRequest);
  862. if (xferResponse.responseCode == Code.SUCCESS)
  863. {
  864. UpdateUserStatus(msisdn, token);
  865. }
  866. return Json(new {
  867. status = xferResponse.responseCode,
  868. message = xferResponse.responseMessage,
  869. paymentCode = xferResponse.paymentCode,
  870. responseCode = xferResponse.responseCode,
  871. userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus")
  872. });
  873. }
  874. catch (Exception ex)
  875. {
  876. log.Error(ex);
  877. return Json(new { status = Code.ERROR, message = ex.Message });
  878. }
  879. }
  880. private void UpdateUserStatus(string msisdn, string token)
  881. {
  882. try
  883. {
  884. UserStatusRequest userStatusRequest = new UserStatusRequest { users = msisdn, token = token };
  885. UserStatus userStatusGet = api.GetUserStatusApi(configuration, userStatusRequest);
  886. if (userStatusGet != null)
  887. {
  888. HttpContext.Session.SetComplexData("userStatus", userStatusGet);
  889. }
  890. }
  891. catch (Exception ex)
  892. {
  893. log.Error("UpdateUserStatus Error: " + ex.Message);
  894. }
  895. }
  896. public IActionResult Logout()
  897. {
  898. ClearCache();
  899. return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
  900. }
  901. }
  902. }