HomeController.cs 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062
  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.LotteryV2.Controllers
  19. {
  20. [Area("LotteryV2")]
  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.MEGA_LOTO;
  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. model.serverTime = DateTime.Now;
  177. return View(model);
  178. }
  179. public async Task<IActionResult> GameHome(string termType)
  180. {
  181. HomeIndex_ViewModel model = new HomeIndex_ViewModel();
  182. try
  183. {
  184. var token = HttpContext.Session.GetComplexData<string>("token");
  185. if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
  186. {
  187. return RedirectToAction("Login", "Account", new { area = "" });
  188. }
  189. Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
  190. UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
  191. model.termType = termType != null ? termType : Constants.FLORIDA_BOLET_CODE;
  192. model.userStatus = userStatus;
  193. model.profile = profile;
  194. model.listTerm = new List<Term>();
  195. if (!string.IsNullOrEmpty(termType))
  196. {
  197. HttpContext.Session.SetString("termType", termType);
  198. }
  199. }
  200. catch (Exception ex)
  201. {
  202. log.Error(ex);
  203. }
  204. model.serverTime = DateTime.Now; return View(model);
  205. }
  206. public async Task<IActionResult> FAQ()
  207. {
  208. HomeIndex_ViewModel model = new HomeIndex_ViewModel();
  209. try
  210. {
  211. var token = HttpContext.Session.GetComplexData<string>("token");
  212. if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
  213. {
  214. return RedirectToAction("Login", "Account", new { area = "" });
  215. }
  216. Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
  217. UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
  218. model.userStatus = userStatus;
  219. model.profile = profile;
  220. }
  221. catch (Exception ex)
  222. {
  223. log.Error(ex);
  224. }
  225. model.serverTime = DateTime.Now; return View(model);
  226. }
  227. public IActionResult More()
  228. {
  229. HomeIndex_ViewModel model = new HomeIndex_ViewModel();
  230. try
  231. {
  232. var token = HttpContext.Session.GetComplexData<string>("token");
  233. if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
  234. {
  235. return RedirectToAction("Login", "Account", new { area = "" });
  236. }
  237. Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
  238. UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
  239. model.userStatus = userStatus;
  240. model.profile = profile;
  241. }
  242. catch (Exception ex)
  243. {
  244. log.Error(ex);
  245. }
  246. model.serverTime = DateTime.Now; return View(model);
  247. }
  248. public IActionResult Profile()
  249. {
  250. HomeIndex_ViewModel model = new HomeIndex_ViewModel();
  251. try
  252. {
  253. var token = HttpContext.Session.GetComplexData<string>("token");
  254. if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
  255. {
  256. return RedirectToAction("Login", "Account", new { area = "" });
  257. }
  258. Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
  259. UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
  260. model.userStatus = userStatus;
  261. model.profile = profile;
  262. }
  263. catch (Exception ex)
  264. {
  265. log.Error(ex);
  266. }
  267. model.serverTime = DateTime.Now; return View(model);
  268. }
  269. [HttpPost]
  270. public IActionResult UserUpdateProfile(string fullName, string birthday)
  271. {
  272. try
  273. {
  274. string msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
  275. string token = HttpContext.Session.GetComplexData<string>("token");
  276. if (string.IsNullOrEmpty(msisdn) || string.IsNullOrEmpty(token))
  277. {
  278. return Json(new { status = Code.ERROR, message = "Session expired" });
  279. }
  280. string birthdayFormat = birthday;
  281. if (!string.IsNullOrEmpty(birthday) && birthday.Contains("-"))
  282. {
  283. try
  284. {
  285. birthdayFormat = DateTime.ParseExact(birthday, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy");
  286. }
  287. catch { }
  288. }
  289. UserUpdateProfileRequest request = new UserUpdateProfileRequest
  290. {
  291. users = msisdn,
  292. token = token,
  293. fullName = fullName,
  294. birthday = birthdayFormat
  295. };
  296. UserUpdateProfileResponse response = api.UserUpdateProfileApi(configuration, request);
  297. if (response.status == Code.SUCCESS)
  298. {
  299. // Update session profile
  300. Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
  301. if (profile != null)
  302. {
  303. profile.fullName = fullName;
  304. profile.birthday = birthdayFormat;
  305. HttpContext.Session.SetComplexData("profile", profile);
  306. }
  307. }
  308. return Json(response);
  309. }
  310. catch (Exception ex)
  311. {
  312. log.Error(ex);
  313. return Json(new { status = Code.ERROR, message = ex.Message });
  314. }
  315. }
  316. public IActionResult Rule()
  317. {
  318. HomeIndex_ViewModel model = new HomeIndex_ViewModel();
  319. try
  320. {
  321. var token = HttpContext.Session.GetComplexData<string>("token");
  322. if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
  323. {
  324. return RedirectToAction("Login", "Account", new { area = "" });
  325. }
  326. Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
  327. UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
  328. model.userStatus = userStatus;
  329. model.profile = profile;
  330. }
  331. catch (Exception ex)
  332. {
  333. log.Error(ex);
  334. }
  335. model.serverTime = DateTime.Now; return View(model);
  336. }
  337. public IActionResult HowToPlay()
  338. {
  339. HomeIndex_ViewModel model = new HomeIndex_ViewModel();
  340. try
  341. {
  342. var token = HttpContext.Session.GetComplexData<string>("token");
  343. if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
  344. {
  345. return RedirectToAction("Login", "Account", new { area = "" });
  346. }
  347. Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
  348. UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
  349. model.userStatus = userStatus;
  350. model.profile = profile;
  351. }
  352. catch (Exception ex)
  353. {
  354. log.Error(ex);
  355. }
  356. model.serverTime = DateTime.Now; return View(model);
  357. }
  358. public IActionResult Results(string termType, string fromDate, string toDate)
  359. {
  360. TermResultHistoryModel model = new TermResultHistoryModel();
  361. try
  362. {
  363. var token = HttpContext.Session.GetComplexData<string>("token");
  364. if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
  365. {
  366. return RedirectToAction("Login", "Account", new { area = "" });
  367. }
  368. Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
  369. UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
  370. model.termType = termType != null ? termType : (HttpContext.Session.GetString("termType") ?? Constants.PIC10_BASIC_CODE);
  371. // Set default dates if not provided (same as root implementation)
  372. string fromFormatted = fromDate != null ? fromDate : DateTime.Now.AddDays(-2).ToString("yyyy-MM-dd");
  373. string toFormatted = toDate != null ? toDate : DateTime.Now.ToString("yyyy-MM-dd");
  374. model.fromDate = fromFormatted;
  375. model.toDate = toFormatted;
  376. // Load initial results
  377. ResultOfTermRequest resultOfTermRequest = new ResultOfTermRequest
  378. {
  379. gameId = model.termType,
  380. token = token,
  381. type = Constants.TERM_HAS_RESULT_TYPE,
  382. order = Constants.DECS,
  383. fromDate = DateTime.ParseExact(fromFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
  384. toDate = DateTime.ParseExact(toFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
  385. rowsOnPage = Constants.ROW_ON_PAGE,
  386. seqPage = "1",
  387. id = Constants.ALL_DATA
  388. };
  389. ResultOfTermResponse result = api.GetResultOfTermApi(configuration, resultOfTermRequest);
  390. if (result.responseCode == Code.SUCCESS)
  391. {
  392. model.listTerm = result.listTerm ?? new List<Term>();
  393. }
  394. else
  395. {
  396. model.listTerm = new List<Term>();
  397. }
  398. }
  399. catch (Exception ex)
  400. {
  401. log.Error(ex);
  402. model.listTerm = new List<Term>();
  403. }
  404. model.serverTime = DateTime.Now; return View(model);
  405. }
  406. public IActionResult TermResultHistory(string termType, string fromDate, string toDate)
  407. {
  408. TermResultHistoryModel model = new TermResultHistoryModel();
  409. try
  410. {
  411. var token = HttpContext.Session.GetComplexData<string>("token");
  412. if (string.IsNullOrEmpty(token)) return Json(new { status = "error", message = "Session expired" });
  413. string fromFormatted = fromDate != null ? fromDate : DateTime.Now.AddDays(-2).ToString("yyyy-MM-dd");
  414. string toFormatted = toDate != null ? toDate : DateTime.Now.ToString("yyyy-MM-dd");
  415. model.termType = termType;
  416. model.fromDate = fromFormatted;
  417. model.toDate = toFormatted;
  418. ResultOfTermRequest request = new ResultOfTermRequest
  419. {
  420. gameId = termType,
  421. token = token,
  422. type = Constants.TERM_HAS_RESULT_TYPE,
  423. order = Constants.DECS,
  424. fromDate = DateTime.ParseExact(fromFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
  425. toDate = DateTime.ParseExact(toFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
  426. rowsOnPage = Constants.ROW_ON_PAGE,
  427. seqPage = "1",
  428. id = Constants.ALL_DATA
  429. };
  430. ResultOfTermResponse result = api.GetResultOfTermApi(configuration, request);
  431. if (result.responseCode == Code.SUCCESS)
  432. {
  433. model.listTerm = result.listTerm ?? new List<Term>();
  434. }
  435. else
  436. {
  437. model.listTerm = new List<Term>();
  438. }
  439. }
  440. catch (Exception ex)
  441. {
  442. log.Error(ex);
  443. model.listTerm = new List<Term>();
  444. }
  445. return PartialView("_TermResultHistoryV2", model);
  446. }
  447. public IActionResult TermResultHistoryGrouped(string fromDate, string toDate)
  448. {
  449. try
  450. {
  451. var token = HttpContext.Session.GetComplexData<string>("token");
  452. if (string.IsNullOrEmpty(token)) return Json(new { status = "error", message = "Session expired" });
  453. string fromFormatted = fromDate != null ? fromDate : DateTime.Now.AddDays(-2).ToString("yyyy-MM-dd");
  454. string toFormatted = toDate != null ? toDate : DateTime.Now.ToString("yyyy-MM-dd");
  455. string[] gameIds = { Constants.PIC10_BASIC_CODE, Constants.PIC10_BIGSMALL_CODE, Constants.PIC10_ODDEVEN_CODE };
  456. var allTerms = new List<Term>();
  457. foreach (var gid in gameIds)
  458. {
  459. ResultOfTermRequest request = new ResultOfTermRequest
  460. {
  461. gameId = gid,
  462. token = token,
  463. type = Constants.TERM_HAS_RESULT_TYPE,
  464. order = Constants.DECS,
  465. fromDate = DateTime.ParseExact(fromFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
  466. toDate = DateTime.ParseExact(toFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
  467. rowsOnPage = "50",
  468. seqPage = "1",
  469. id = Constants.ALL_DATA
  470. };
  471. ResultOfTermResponse result = api.GetResultOfTermApi(configuration, request);
  472. if (result.responseCode == Code.SUCCESS && result.listTerm != null)
  473. {
  474. allTerms.AddRange(result.listTerm);
  475. }
  476. }
  477. // Group by date part of date_random
  478. var grouped = allTerms.GroupBy(x => {
  479. DateTime dt;
  480. if (DateTime.TryParse(x.date_random, out dt))
  481. return dt.Date;
  482. return DateTime.MinValue;
  483. })
  484. .Where(g => g.Key != DateTime.MinValue)
  485. .OrderByDescending(g => g.Key)
  486. .ToList();
  487. return PartialView("_TermResultHistoryGrouped", grouped);
  488. }
  489. catch (Exception ex)
  490. {
  491. log.Error(ex);
  492. return PartialView("_TermResultHistoryGrouped", new List<IGrouping<DateTime, Term>>());
  493. }
  494. }
  495. public IActionResult History(string termType, string status, string seqPage)
  496. {
  497. UserTicketHistoryModel model = new UserTicketHistoryModel();
  498. try
  499. {
  500. var token = HttpContext.Session.GetComplexData<string>("token");
  501. if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
  502. {
  503. return RedirectToAction("Login", "Account", new { area = "" });
  504. }
  505. string msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
  506. model.termType = termType ?? Constants.PIC10_BASIC_CODE;
  507. model.status = status ?? Constants.ALL_DATA; // -1 for all, or 0, 1, 2
  508. model.seqPage = seqPage ?? "1";
  509. UserTicketRequest request = new UserTicketRequest
  510. {
  511. gameId = model.termType,
  512. msisdn = msisdn,
  513. token = token,
  514. type = model.status,
  515. order = Constants.DECS,
  516. rowsOnPage = Constants.ROW_ON_PAGE,
  517. seqPage = model.seqPage
  518. };
  519. UserTicketResponse result = api.GetUserTicketApi(configuration, request);
  520. if (result.responseCode == Code.SUCCESS)
  521. {
  522. model.listTicket = result.listTicket ?? new List<Ticket>();
  523. model.totalPage = result.totalPage;
  524. }
  525. else
  526. {
  527. model.listTicket = new List<Ticket>();
  528. model.totalPage = "0";
  529. }
  530. }
  531. catch (Exception ex)
  532. {
  533. log.Error(ex);
  534. model.listTicket = new List<Ticket>();
  535. }
  536. model.serverTime = DateTime.Now;
  537. return View(model);
  538. }
  539. public IActionResult TermUserTicketHistory(string termType, string status, string seqPage)
  540. {
  541. UserTicketHistoryModel model = new UserTicketHistoryModel();
  542. try
  543. {
  544. var token = HttpContext.Session.GetComplexData<string>("token");
  545. if (string.IsNullOrEmpty(token)) return Json(new { status = "error", message = "Session expired" });
  546. string msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
  547. model.termType = termType;
  548. model.status = status;
  549. model.seqPage = seqPage ?? "1";
  550. UserTicketRequest request = new UserTicketRequest
  551. {
  552. gameId = termType,
  553. msisdn = msisdn,
  554. token = token,
  555. type = status,
  556. order = Constants.DECS,
  557. rowsOnPage = Constants.ROW_ON_PAGE,
  558. seqPage = model.seqPage
  559. };
  560. UserTicketResponse result = api.GetUserTicketApi(configuration, request);
  561. if (result.responseCode == Code.SUCCESS)
  562. {
  563. model.listTicket = result.listTicket ?? new List<Ticket>();
  564. model.totalPage = result.totalPage;
  565. }
  566. else
  567. {
  568. model.listTicket = new List<Ticket>();
  569. model.totalPage = "0";
  570. }
  571. }
  572. catch (Exception ex)
  573. {
  574. log.Error(ex);
  575. model.listTicket = new List<Ticket>();
  576. }
  577. return PartialView("_TermUserTicketHistory", model);
  578. }
  579. [HttpPost]
  580. [ValidateAntiForgeryToken]
  581. public IActionResult TermResult(string termType)
  582. {
  583. try
  584. {
  585. var token = HttpContext.Session.GetComplexData<string>("token");
  586. if (string.IsNullOrEmpty(token)) return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
  587. string lang = CultureInfo.CurrentCulture.Name;
  588. string langValue = (lang.StartsWith("en") || lang.StartsWith("fr")) ? "0" : "1";
  589. ResultOfTermRequest request = new ResultOfTermRequest
  590. {
  591. gameId = termType,
  592. language = langValue,
  593. token = token,
  594. type = Constants.TERM_HAS_NOT_RESULT_TYPE,
  595. order = Constants.DECS,
  596. rowsOnPage = "5",
  597. seqPage = "1",
  598. id = Constants.ALL_DATA
  599. };
  600. ResultOfTermResponse result = api.GetResultOfTermApi(configuration, request);
  601. return Json(result);
  602. }
  603. catch (Exception ex)
  604. {
  605. log.Error(ex);
  606. return Json(new { responseCode = Code.ERROR, responseMessage = ex.Message });
  607. }
  608. }
  609. [HttpPost]
  610. public IActionResult ConfirmTicketData([FromBody] ConfirmTicketDataRequest request)
  611. {
  612. try
  613. {
  614. log.Info($"[ConfirmTicketData] START - Request: {JsonConvert.SerializeObject(request)}");
  615. var token = HttpContext.Session.GetComplexData<string>("token");
  616. var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
  617. if (string.IsNullOrEmpty(token))
  618. {
  619. log.Info("[ConfirmTicketData] Session expired");
  620. return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
  621. }
  622. request.token = token;
  623. request.msisdn = msisdn;
  624. request.language = CultureInfo.CurrentCulture.Name.StartsWith("en") ? "0" : "1";
  625. request.requestId = Guid.NewGuid().ToString();
  626. ConfirmTicketDataResponse response = api.BuyTicketV2Api(configuration, request);
  627. log.Info($"[ConfirmTicketData] Call BuyTicketV2Api Response: {JsonConvert.SerializeObject(response)}");
  628. return Json(response);
  629. }
  630. catch (Exception ex)
  631. {
  632. log.Error("[ConfirmTicketData] EXCEPTION: ", ex);
  633. return Json(new { responseCode = Code.ERROR, responseMessage = ex.Message });
  634. }
  635. }
  636. [HttpPost]
  637. public IActionResult ConfirmOTP([FromBody] ConfirmOTPRequest request)
  638. {
  639. try
  640. {
  641. log.Info($"[ConfirmOTP] START - Request: {JsonConvert.SerializeObject(request)}");
  642. var token = HttpContext.Session.GetComplexData<string>("token");
  643. var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
  644. if (string.IsNullOrEmpty(token))
  645. {
  646. log.Info("[ConfirmOTP] Session expired");
  647. return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
  648. }
  649. request.token = token;
  650. request.msisdn = msisdn;
  651. ConfirmOTPResponse response = api.ConfirmOTPApi(configuration, request);
  652. log.Info($"[ConfirmOTP] Call ConfirmOTPApi Response: {JsonConvert.SerializeObject(response)}");
  653. return Json(response);
  654. }
  655. catch (Exception ex)
  656. {
  657. log.Error("[ConfirmOTP] EXCEPTION: ", ex);
  658. return Json(new { responseCode = Code.ERROR, responseMessage = ex.Message });
  659. }
  660. }
  661. [HttpPost]
  662. public IActionResult SendOTP()
  663. {
  664. try
  665. {
  666. log.Info("[SendOTP] START");
  667. var token = HttpContext.Session.GetComplexData<string>("token");
  668. var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
  669. if (string.IsNullOrEmpty(token))
  670. {
  671. log.Info("[SendOTP] Session expired");
  672. return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
  673. }
  674. SendOTPRequest request = new SendOTPRequest
  675. {
  676. msisdn = msisdn,
  677. token = token,
  678. language = CultureInfo.CurrentCulture.Name.StartsWith("en") ? "0" : "1",
  679. channel = configuration.GetSection("channel").Value
  680. };
  681. log.Info($"[SendOTP] Call SendOTPApi Request: {JsonConvert.SerializeObject(request)}");
  682. SendOTPResponse response = api.SendOTPApi(configuration, request);
  683. log.Info($"[SendOTP] Call SendOTPApi Response: {JsonConvert.SerializeObject(response)}");
  684. return Json(response);
  685. }
  686. catch (Exception ex)
  687. {
  688. log.Error("[SendOTP] EXCEPTION: ", ex);
  689. return Json(new { responseCode = Code.ERROR, responseMessage = ex.Message });
  690. }
  691. }
  692. [HttpPost]
  693. public IActionResult ConfirmBuyingTicketV2([FromBody] ConfirmBuyingTicketRequest request)
  694. {
  695. try
  696. {
  697. log.Info($"[ConfirmBuyingTicketV2] START - Request: {JsonConvert.SerializeObject(request)}");
  698. var token = HttpContext.Session.GetComplexData<string>("token");
  699. var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
  700. if (string.IsNullOrEmpty(token))
  701. {
  702. log.Info("[ConfirmBuyingTicketV2] Session expired");
  703. return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
  704. }
  705. var isWalletPayment = request.channelPayment == Constants.NATCASH_WALLET_TICKET;
  706. // The main-account flow keeps the existing OTP verification.
  707. if (!isWalletPayment)
  708. {
  709. ConfirmOTPRequest otpRequest = new ConfirmOTPRequest
  710. {
  711. otp = request.paymentCode,
  712. msisdn = msisdn,
  713. token = token,
  714. language = CultureInfo.CurrentCulture.Name.StartsWith("en") ? "0" : "1",
  715. channel = configuration.GetSection("channel").Value
  716. };
  717. ConfirmOTPResponse otpResponse = api.ConfirmOTPApi(configuration, otpRequest);
  718. if (otpResponse.responseCode != Code.SUCCESS)
  719. {
  720. return Json(new { responseCode = otpResponse.responseCode, responseMessage = otpResponse.responseMessage });
  721. }
  722. }
  723. // Step 2: Proceed to Confirm buying
  724. request.token = token;
  725. request.msisdn = msisdn;
  726. request.requestId = Guid.NewGuid().ToString();
  727. request.language = CultureInfo.CurrentCulture.Name.StartsWith("en") ? "0" : "1";
  728. request.channel = configuration.GetSection("channel").Value;
  729. log.Info($"[ConfirmBuyingTicketV2] Call ConfirmBuyingTicketApi Request: {JsonConvert.SerializeObject(request)}");
  730. ConfirmBuyingTicketResponse response = isWalletPayment
  731. ? api.ConfirmBuyingTicketV2Api(configuration, request, Constants.WALLET_PAYMENT_CHANNEL, request.walletPin)
  732. : api.ConfirmBuyingTicketApi(configuration, request);
  733. log.Info($"[ConfirmBuyingTicketV2] Call ConfirmBuyingTicketApi Response: {JsonConvert.SerializeObject(response)}");
  734. if (response.responseCode == Code.SUCCESS)
  735. {
  736. log.Info($"[ConfirmBuyingTicketV2] Payment Success. Updating user status for {msisdn}");
  737. UpdateUserStatus(msisdn, token);
  738. }
  739. log.Info($"[ConfirmBuyingTicketV2] END - Result: {JsonConvert.SerializeObject(response)}");
  740. return Json(response);
  741. }
  742. catch (Exception ex)
  743. {
  744. log.Error("[ConfirmBuyingTicketV2] EXCEPTION: ", ex);
  745. return Json(new { responseCode = Code.ERROR, responseMessage = ex.Message });
  746. }
  747. }
  748. [HttpPost]
  749. public IActionResult ConfirmBuyingTicket([FromBody] ConfirmBuyingTicketRequest request)
  750. {
  751. try
  752. {
  753. var token = HttpContext.Session.GetComplexData<string>("token");
  754. var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
  755. if (string.IsNullOrEmpty(token)) return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
  756. request.token = token;
  757. request.msisdn = msisdn;
  758. request.requestId = Guid.NewGuid().ToString();
  759. request.language = CultureInfo.CurrentCulture.Name.StartsWith("en") ? "0" : "1";
  760. request.channel = configuration.GetSection("channel").Value;
  761. ConfirmBuyingTicketResponse response = api.ConfirmBuyingTicketApi(configuration, request);
  762. if (response.responseCode == Code.SUCCESS)
  763. {
  764. UpdateUserStatus(msisdn, token);
  765. }
  766. return Json(new
  767. {
  768. responseCode = response.responseCode,
  769. responseMessage = response.responseMessage,
  770. transId = response.transId,
  771. orderId = response.orderId,
  772. userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus")
  773. });
  774. }
  775. catch (Exception ex)
  776. {
  777. log.Error(ex);
  778. return Json(new { responseCode = Code.ERROR, responseMessage = ex.Message });
  779. }
  780. }
  781. public IActionResult BuyTicket(string termType)
  782. {
  783. try
  784. {
  785. var token = HttpContext.Session.GetComplexData<string>("token");
  786. if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
  787. {
  788. return RedirectToAction("Login", "Account", new { area = "" });
  789. }
  790. HomeIndex_ViewModel model = new HomeIndex_ViewModel();
  791. model.termType = termType ?? Constants.PIC10_BASIC_CODE;
  792. Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
  793. UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
  794. model.userStatus = userStatus;
  795. model.profile = profile;
  796. // Get active term
  797. ResultOfTermRequest request = new ResultOfTermRequest
  798. {
  799. gameId = model.termType,
  800. token = token,
  801. type = Constants.TERM_HAS_NOT_RESULT_TYPE,
  802. order = Constants.DECS,
  803. rowsOnPage = "1",
  804. seqPage = "1",
  805. id = Constants.ALL_DATA
  806. };
  807. ResultOfTermResponse result = api.GetResultOfTermApi(configuration, request);
  808. if (result.responseCode == Code.SUCCESS && result.listTerm != null && result.listTerm.Count > 0)
  809. {
  810. model.listTerm = result.listTerm;
  811. }
  812. else
  813. {
  814. model.listTerm = new List<Term>();
  815. }
  816. if (model.termType == Constants.PIC10_BIGSMALL_CODE || model.termType == Constants.PIC10_ODDEVEN_CODE)
  817. {
  818. ResultOfTermRequest pastRequest = new ResultOfTermRequest
  819. {
  820. gameId = model.termType,
  821. token = token,
  822. type = Constants.TERM_HAS_RESULT_TYPE,
  823. order = Constants.DECS,
  824. fromDate = DateTime.Now.AddDays(-10).ToString("dd/MM/yyyy"),
  825. toDate = DateTime.Now.ToString("dd/MM/yyyy"),
  826. rowsOnPage = "5",
  827. seqPage = "1",
  828. id = Constants.ALL_DATA
  829. };
  830. ResultOfTermResponse pastResult = api.GetResultOfTermApi(configuration, pastRequest);
  831. if (pastResult.responseCode == Code.SUCCESS && pastResult.listTerm != null)
  832. {
  833. var pastTerms = pastResult.listTerm.Take(5).ToList();
  834. pastTerms.Reverse(); // Display chronological order
  835. ViewBag.PastTerms = pastTerms;
  836. }
  837. else
  838. {
  839. ViewBag.PastTerms = new List<Term>();
  840. }
  841. }
  842. model.serverTime = DateTime.Now; return View(model);
  843. }
  844. catch (Exception ex)
  845. {
  846. log.Error(ex);
  847. return RedirectToAction("GameHome", new { termType = termType });
  848. }
  849. }
  850. public IActionResult TransferWinMoney()
  851. {
  852. if (!CheckAuthToken())
  853. {
  854. return RedirectToAction("Login", "Account", new { area = "" });
  855. }
  856. HomeIndex_ViewModel model = new HomeIndex_ViewModel();
  857. model.profile = HttpContext.Session.GetComplexData<Profile>("profile");
  858. model.userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
  859. model.serverTime = DateTime.Now; return View(model);
  860. }
  861. [HttpPost]
  862. public IActionResult ConfirmTransfer(string otp, string phone, string amount, string channelPayment)
  863. {
  864. try
  865. {
  866. log.Info($"[ConfirmTransfer] START - otp: {otp}, phone: {phone}, amount: {amount}, channelPayment: {channelPayment}");
  867. var token = HttpContext.Session.GetComplexData<string>("token");
  868. var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
  869. if (string.IsNullOrEmpty(token)) return Json(new { status = Code.SESSION_EXPIRED, message = "Session expired" });
  870. // Step 1: Verify OTP
  871. ConfirmOTPRequest otpRequest = new ConfirmOTPRequest
  872. {
  873. otp = otp,
  874. msisdn = msisdn,
  875. token = token,
  876. language = CultureInfo.CurrentCulture.Name.StartsWith("en") ? "0" : "1",
  877. channel = configuration.GetSection("channel").Value
  878. };
  879. log.Info($"[ConfirmTransfer] Call ConfirmOTPApi Request: {JsonConvert.SerializeObject(otpRequest)}");
  880. ConfirmOTPResponse otpResponse = api.ConfirmOTPApi(configuration, otpRequest);
  881. log.Info($"[ConfirmTransfer] Call ConfirmOTPApi Response: {JsonConvert.SerializeObject(otpResponse)}");
  882. if (otpResponse.responseCode != Code.SUCCESS)
  883. {
  884. return Json(new { status = otpResponse.responseCode, message = otpResponse.responseMessage });
  885. }
  886. // Step 2: If OTP success, call Transfer Money Api
  887. TransferMoneyRequest xferRequest = new TransferMoneyRequest
  888. {
  889. msisdn = msisdn,
  890. msisdnReceive = phone,
  891. money = amount,
  892. otp = otp,
  893. token = token,
  894. channelPayment = channelPayment ?? Constants.BASIC_WALLET_TRANSFER,
  895. language = CultureInfo.CurrentCulture.Name.StartsWith("en") ? "0" : "1",
  896. channel = configuration.GetSection("channel").Value
  897. };
  898. log.Info($"[ConfirmTransfer] Call TransferMoneyApi Request: {JsonConvert.SerializeObject(xferRequest)}");
  899. TransferMoneyResponse xferResponse = api.TransferMoneyApi(configuration, xferRequest);
  900. log.Info($"[ConfirmTransfer] Call TransferMoneyApi Response: {JsonConvert.SerializeObject(xferResponse)}");
  901. if (xferResponse.responseCode == Code.SUCCESS)
  902. {
  903. UpdateUserStatus(msisdn, token);
  904. }
  905. return Json(new
  906. {
  907. status = xferResponse.responseCode,
  908. message = xferResponse.responseMessage,
  909. paymentCode = xferResponse.paymentCode,
  910. responseCode = xferResponse.responseCode,
  911. userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus")
  912. });
  913. }
  914. catch (Exception ex)
  915. {
  916. log.Error(ex);
  917. return Json(new { status = Code.ERROR, message = ex.Message });
  918. }
  919. }
  920. private void UpdateUserStatus(string msisdn, string token)
  921. {
  922. try
  923. {
  924. log.Info($"[UpdateUserStatus] START - msisdn: {msisdn}");
  925. UserStatusRequest userStatusRequest = new UserStatusRequest { users = msisdn, token = token };
  926. log.Info($"[UpdateUserStatus] Call GetUserStatusApi Request: {JsonConvert.SerializeObject(userStatusRequest)}");
  927. UserStatus userStatusGet = api.GetUserStatusApi(configuration, userStatusRequest);
  928. log.Info($"[UpdateUserStatus] Call GetUserStatusApi Response: {JsonConvert.SerializeObject(userStatusGet)}");
  929. if (userStatusGet != null)
  930. {
  931. HttpContext.Session.SetComplexData("userStatus", userStatusGet);
  932. }
  933. log.Info("[UpdateUserStatus] END");
  934. }
  935. catch (Exception ex)
  936. {
  937. log.Error("[UpdateUserStatus] EXCEPTION: ", ex);
  938. }
  939. }
  940. public IActionResult Logout()
  941. {
  942. ClearCache();
  943. return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
  944. }
  945. }
  946. }