| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527 |
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Globalization;
- using System.Threading;
- using System.Threading.Tasks;
- using LotteryWebApp.Common;
- using LotteryWebApp.Extensions;
- using LotteryWebApp.Languages;
- using LotteryWebApp.Models;
- using LotteryWebApp.Service;
- using Microsoft.AspNetCore.Hosting;
- using Microsoft.AspNetCore.Http;
- using Microsoft.AspNetCore.Mvc;
- using Microsoft.Extensions.Configuration;
- using Newtonsoft.Json;
- using LotteryWebApp.Controllers;
- namespace LotteryWebApp.Areas.Millions.Controllers
- {
- [Area("Millions")]
- [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
- public class HomeController : BaseController
- {
- private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program));
- private const string FreeTicketAutoCheckSessionKey = "Millions.FreeTicket.AutoChecked";
- private const string FreeTicketPromotionCodeSessionKey = "Millions.FreeTicket.PromotionCode";
- private const string FreeTicketTransactionSessionKey = "Millions.FreeTicket.TransactionId";
- private const string PendingTicketTransactionSessionKey = "Millions.PendingTicket.TransactionId";
- private const string OtpVerifiedTransactionSessionKey = "Millions.OTP.VerifiedTransactionId";
- IConfiguration configuration;
- private readonly IWebHostEnvironment webHostEnvironment;
- APIFunctions api = new APIFunctions();
- public HomeController(IConfiguration _configuration, IWebHostEnvironment hostEnvironment)
- {
- configuration = _configuration;
- webHostEnvironment = hostEnvironment;
- }
- public String GetParameter(String key)
- {
- return configuration.GetSection(key).Value;
- }
- public async Task<IActionResult> Index(
- string termType,
- String uuid,
- String mcuid,
- String phonenumber,
- String token
- )
- {
- HomeIndex_ViewModel model = new HomeIndex_ViewModel();
- try
- {
- CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;
- String lang = currentCulture.Name;
- String msisdnAuto = null;
- if (!CheckAuthToken())
- {
- if (token != null)
- {
- AutoLoginRequest autoLoginRequest = new AutoLoginRequest { token = token };
- AutoLoginResponse autoLoginResponse = await api.AutoLoginApiAsync(configuration, autoLoginRequest);
- if (autoLoginResponse.code == Code.SUCCESS_CODE)
- {
- string msisdnReal = validateMsisdn(autoLoginResponse.data.msisdn.Substring(1));
- if (msisdnReal == "") return RedirectToAction("Login", "Account", new { area = "" });
- CheckAccountRequest checkAccountRequest = new CheckAccountRequest
- {
- msisdn = msisdnReal,
- channel = Constants.WEB_CHANNEL,
- language = lang == "en" ? "0" : "1"
- };
- CheckAccountResponse checkAccountResponse = api.CheckAccountApi(configuration, checkAccountRequest);
- if (checkAccountResponse.status == Code.SUCCESS)
- {
- string tokenGetReal = checkAccountResponse.token;
- HttpContext.Session.SetComplexData("msisdn", msisdnReal);
- CreateAuthToken();
- HttpContext.Session.SetComplexData("token", tokenGetReal);
- UserGetProfileRequest userGetProfileRequest = new UserGetProfileRequest { users = msisdnReal, token = tokenGetReal };
- Profile profileGet = api.UserLoadProfileApi(configuration, userGetProfileRequest);
- HttpContext.Session.SetComplexData("profile", profileGet);
- UserStatusRequest userStatusRequest = new UserStatusRequest { users = msisdnReal, token = tokenGetReal };
- UserStatus userStatusGet = api.GetUserStatusApi(configuration, userStatusRequest);
- HttpContext.Session.SetComplexData("userStatus", userStatusGet);
- }
- else
- {
- return RedirectToAction("Login", "Account", new { area = "" });
- }
- }
- }
- else if (uuid != null)
- {
- String res = await CheckAutoLogin(log, uuid);
- if (res != null)
- {
- dynamic json = JsonConvert.DeserializeObject(res);
- if (json["code"] == "200" && json["errorCode"] == "200")
- {
- msisdnAuto = json["data"]["msisdn"];
- }
- }
- String msisdnDetect = validateMsisdn(msisdnAuto.Substring(1));
- if (msisdnDetect != "")
- {
- RegisterRequest request = new RegisterRequest { Msisdn = msisdnDetect };
- RegisterResponse reset = api.UserForgotPasswordApi(configuration, request);
- if (reset.status == Code.SUCCESS)
- {
- HttpContext.Session.Remove("regInfos");
- HttpContext.Session.SetComplexData("msisdn", msisdnDetect);
- return RedirectToAction("Login", "Account", new { area = "", step = 2 });
- }
- }
- return RedirectToAction("Login", "Account", new { area = "" });
- }
- else if (phonenumber != null)
- {
- // simplified or same logic as original
- return RedirectToAction("Login", "Account", new { area = "" });
- }
- else
- {
- // If no token/uuid and not auth, verify existing session token
- var savedToken = HttpContext.Session.GetString("token");
- if (string.IsNullOrEmpty(savedToken))
- {
- return RedirectToAction("Login", "Account", new { area = "" });
- }
- }
- }
- Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
- UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
- model.termType = termType != null ? termType : Constants.Millions_CODE;
- model.userStatus = userStatus;
- model.profile = profile;
- model.listTerm = new List<Term>();
- String tokenGet = HttpContext.Session.GetComplexData<String>("token");
- String fromDate = DateTime.Now.AddDays(-2).ToString("dd/MM/yyyy");
- String toDate = DateTime.Now.ToString("dd/MM/yyyy");
- // Get Top Winner
- GetTopWinnerRequest getTopWinnerRequest = new GetTopWinnerRequest { type = lang == "en" ? "0" : "1", token = tokenGet };
- GetTopWininerResponse getTopWininerResponse = api.GetTopWinnerApi(configuration, getTopWinnerRequest);
- if (getTopWininerResponse.responseCode == Code.SUCCESS)
- {
- model.topWinner = getTopWininerResponse.list;
- HttpContext.Session.SetComplexData("topWinner", model.topWinner);
- }
- // Get Term Results
- //ResultOfTermRequest resultOfTermRequest = new ResultOfTermRequest
- //{
- // gameId = model.termType,
- // token = tokenGet,
- // type = Constants.TERM_HAS_NOT_RESULT_TYPE,
- // order = Constants.DECS,
- // fromDate = fromDate,
- // toDate = toDate,
- // rowsOnPage = Constants.ROW_ON_PAGE,
- // seqPage = "1",
- // id = Constants.ALL_DATA
- //};
- //ResultOfTermResponse result = api.GetResultOfTermApi(configuration, resultOfTermRequest);
- //if (result.responseCode == Code.SESSION_EXPIRED)
- //{
- // return RedirectToAction("Login", "Account", new { area = "" });
- //}
- //else if (result.responseCode == Code.SUCCESS)
- //{
- // model.listTerm = result.listTerm;
- //}
- if (!string.IsNullOrEmpty(termType))
- {
- HttpContext.Session.SetString("termType", termType);
- }
- }
- catch (Exception ex)
- {
- log.Error(ex);
- return RedirectToAction("Login", "Account", new { area = "" });
- }
- return View(model);
- }
- public async Task<IActionResult> GameHome(string termType)
- {
- HomeIndex_ViewModel model = new HomeIndex_ViewModel();
- try
- {
- var token = HttpContext.Session.GetComplexData<string>("token");
- if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
- {
- return RedirectToAction("Login", "Account", new { area = "" });
- }
- Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
- UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
- model.termType = termType != null ? termType : Constants.Millions_CODE;
- model.userStatus = userStatus;
- model.profile = profile;
- model.listTerm = new List<Term>();
- if (!string.IsNullOrEmpty(termType))
- {
- HttpContext.Session.SetString("termType", termType);
- }
- // Get Term Results for Jackpot
- string cachedBolet = HttpContext.Session.GetString("bolet");
- if (!string.IsNullOrEmpty(cachedBolet))
- {
- model.bolet = cachedBolet;
- model.lastResult = HttpContext.Session.GetString("lastResult");
- model.lastResultDate = HttpContext.Session.GetString("lastResultDate");
- model.nextRoundDate = HttpContext.Session.GetString("nextRoundDate");
- }
- else
- {
- String fromDate = DateTime.Now.AddDays(-7).ToString("dd/MM/yyyy");
- String toDate = DateTime.Now.ToString("dd/MM/yyyy");
- string lang = CultureInfo.CurrentCulture.Name;
- string langValue = (lang.StartsWith("en") || lang.StartsWith("fr")) ? "0" : "1";
- // Get Last Result
- ResultOfTermRequest resultOfTermRequest = new ResultOfTermRequest
- {
- gameId = model.termType,
- language = langValue,
- token = token,
- type = Constants.TERM_HAS_RESULT_TYPE,
- order = Constants.DECS,
- fromDate = fromDate,
- toDate = toDate,
- rowsOnPage = Constants.ROW_ON_PAGE,
- seqPage = "1",
- id = Constants.ALL_DATA
- };
- ResultOfTermResponse result = api.GetResultOfTermApi(configuration, resultOfTermRequest);
- if (result.responseCode == Code.SUCCESS && result.listTerm != null && result.listTerm.Count > 0)
- {
- model.bolet = result.listTerm[0].bolet;
- model.lastResult = result.listTerm[0].result;
- model.lastResultDate = result.listTerm[0].date_random;
- model.nextRoundDate = result.listTerm[0].date_end;
- HttpContext.Session.SetString("nextRoundDate", model.nextRoundDate ?? "");
- HttpContext.Session.SetString("bolet", model.bolet ?? "");
- HttpContext.Session.SetString("lastResult", model.lastResult ?? "");
- HttpContext.Session.SetString("lastResultDate", model.lastResultDate ?? "");
- }
- //// Get Next Round
- //ResultOfTermRequest nextRoundRequest = new ResultOfTermRequest
- //{
- // gameId = model.termType,
- // language = langValue,
- // token = token,
- // type = Constants.TERM_HAS_NOT_RESULT_TYPE,
- // order = Constants.ASC,
- // fromDate = DateTime.Now.ToString("dd/MM/yyyy"),
- // toDate = DateTime.Now.AddDays(7).ToString("dd/MM/yyyy"),
- // rowsOnPage = "1",
- // seqPage = "1",
- // id = Constants.ALL_DATA
- //};
- //ResultOfTermResponse nextResult = api.GetResultOfTermApi(configuration, nextRoundRequest);
- //if (nextResult.responseCode == Code.SUCCESS && nextResult.listTerm != null && nextResult.listTerm.Count > 0)
- //{
- // model.nextRoundDate = nextResult.listTerm[0].date_random;
- // HttpContext.Session.SetString("nextRoundDate", model.nextRoundDate ?? "");
- //}
- }
- }
- catch (Exception ex)
- {
- log.Error(ex);
- }
- return View(model);
- }
- public async Task<IActionResult> FAQ()
- {
- HomeIndex_ViewModel model = new HomeIndex_ViewModel();
- try
- {
- var token = HttpContext.Session.GetComplexData<string>("token");
- if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
- {
- return RedirectToAction("Login", "Account", new { area = "" });
- }
- Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
- UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
- model.userStatus = userStatus;
- model.profile = profile;
- }
- catch (Exception ex)
- {
- log.Error(ex);
- }
- return View(model);
- }
- public IActionResult More()
- {
- HomeIndex_ViewModel model = new HomeIndex_ViewModel();
- try
- {
- var token = HttpContext.Session.GetComplexData<string>("token");
- if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
- {
- return RedirectToAction("Login", "Account", new { area = "" });
- }
- Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
- UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
- model.userStatus = userStatus;
- model.profile = profile;
- }
- catch (Exception ex)
- {
- log.Error(ex);
- }
- return View(model);
- }
- public IActionResult Profile()
- {
- HomeIndex_ViewModel model = new HomeIndex_ViewModel();
- try
- {
- var token = HttpContext.Session.GetComplexData<string>("token");
- if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
- {
- return RedirectToAction("Login", "Account", new { area = "" });
- }
- Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
- UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
- model.userStatus = userStatus;
- model.profile = profile;
- }
- catch (Exception ex)
- {
- log.Error(ex);
- }
- return View(model);
- }
- [HttpPost]
- public IActionResult UserUpdateProfile(string fullName, string birthday)
- {
- try
- {
- string msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
- string token = HttpContext.Session.GetComplexData<string>("token");
- if (string.IsNullOrEmpty(msisdn) || string.IsNullOrEmpty(token))
- {
- return Json(new { status = Code.ERROR, message = "Session expired" });
- }
- string birthdayFormat = birthday;
- if (!string.IsNullOrEmpty(birthday) && birthday.Contains("-"))
- {
- try {
- birthdayFormat = DateTime.ParseExact(birthday, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy");
- } catch { }
- }
- UserUpdateProfileRequest request = new UserUpdateProfileRequest
- {
- users = msisdn,
- token = token,
- fullName = fullName,
- birthday = birthdayFormat
- };
- UserUpdateProfileResponse response = api.UserUpdateProfileApi(configuration, request);
-
- if (response.status == Code.SUCCESS)
- {
- // Update session profile
- Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
- if (profile != null)
- {
- profile.fullName = fullName;
- profile.birthday = birthdayFormat;
- HttpContext.Session.SetComplexData("profile", profile);
- }
- }
- return Json(response);
- }
- catch (Exception ex)
- {
- log.Error(ex);
- return Json(new { status = Code.ERROR, message = ex.Message });
- }
- }
- public IActionResult Rule()
- {
- HomeIndex_ViewModel model = new HomeIndex_ViewModel();
- try
- {
- var token = HttpContext.Session.GetComplexData<string>("token");
- if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
- {
- return RedirectToAction("Login", "Account", new { area = "" });
- }
- Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
- UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
- model.userStatus = userStatus;
- model.profile = profile;
- }
- catch (Exception ex)
- {
- log.Error(ex);
- }
- return View(model);
- }
- public IActionResult JackpotResults(string termType, string fromFormatted, string toFormatted)
- {
- HomeIndex_ViewModel model = new HomeIndex_ViewModel();
- try
- {
- var token = HttpContext.Session.GetComplexData<string>("token");
- if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
- {
- return RedirectToAction("Login", "Account", new { area = "" });
- }
- Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
- UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
- model.userStatus = userStatus;
- model.profile = profile;
- model.bolet = HttpContext.Session.GetString("bolet");
- model.lastResult = HttpContext.Session.GetString("lastResult");
- model.lastResultDate = HttpContext.Session.GetString("lastResultDate");
- model.nextRoundDate = HttpContext.Session.GetString("nextRoundDate");
- model.termType = !string.IsNullOrEmpty(termType)
- ? termType
- : (HttpContext.Session.GetString("termType") ?? Constants.Millions_CODE);
- string lang = CultureInfo.CurrentCulture.Name;
- string langValue = (lang.StartsWith("en") || lang.StartsWith("fr")) ? "0" : "1";
- // Default: last 7 days if filter not provided
- if (string.IsNullOrEmpty(fromFormatted))
- {
- fromFormatted = DateTime.Now.AddDays(-365).ToString("yyyy-MM-dd");
- }
- if (string.IsNullOrEmpty(toFormatted))
- {
- toFormatted = DateTime.Now.ToString("yyyy-MM-dd");
- }
- ViewBag.FromFormatted = fromFormatted;
- ViewBag.ToFormatted = toFormatted;
- RpSearchDetailTicketRequest request = new RpSearchDetailTicketRequest
- {
- requestId = DateTime.Now.Ticks.ToString(),
- msisdn = "-1",
- gameId = model.termType,
- fromDate = DateTime.ParseExact(fromFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
- toDate = DateTime.ParseExact(toFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
- prize = "JACKPOT",
- language = langValue,
- token = token
- };
- RpSearchDetailTicketResponse result = api.RpSearchDetailTicketApi(configuration, request);
- log.Debug("RpSearchDetailTicket response: " + JsonConvert.SerializeObject(result));
- model.listTerm = new List<Term>();
- var winnersByDraw = new Dictionary<string, List<JackpotWinnerItem>>();
- if (result != null && result.responseCode == Code.SUCCESS && result.list != null)
- {
- // Group winners by randomId -> one draw card per group
- var grouped = result.list
- .GroupBy(w => w.randomId)
- .OrderByDescending(g => ParseDrawDate(g.First().randomDate));
- foreach (var group in grouped)
- {
- var first = group.First();
- DateTime drawDt = ParseDrawDate(first.randomDate);
- long totalPrize = 0;
- foreach (var w in group)
- {
- long m;
- if (long.TryParse(w.moneyWin, out m)) totalPrize += m;
- }
- Term term = new Term
- {
- id = first.randomId,
- seq = first.randomId,
- date_random = drawDt != DateTime.MinValue ? drawDt.ToString("dd/MM/yyyy HH:mm:ss") : first.randomDate,
- date_start = first.startDate,
- date_end = first.endDate,
- result = first.result,
- money_winner = totalPrize.ToString(),
- bolet = totalPrize.ToString(),
- split = group.Count().ToString(),
- gameId = model.termType
- };
- model.listTerm.Add(term);
- winnersByDraw[first.randomId] = group.ToList();
- }
- }
- // Cache winners by draw id so JackpotDetail can render them
- HttpContext.Session.SetComplexData("jackpotWinners", winnersByDraw);
- }
- catch (Exception ex)
- {
- log.Error(ex);
- model.listTerm = new List<Term>();
- }
- return View(model);
- }
- private static DateTime ParseDrawDate(string raw)
- {
- if (string.IsNullOrEmpty(raw)) return DateTime.MinValue;
- string[] formats = {
- "M/d/yyyy h:mm:ss tt",
- "MM/dd/yyyy h:mm:ss tt",
- "M/d/yyyy hh:mm:ss tt",
- "dd/MM/yyyy HH:mm:ss",
- "yyyy-MM-dd HH:mm:ss"
- };
- DateTime dt;
- if (DateTime.TryParseExact(raw, formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt))
- {
- return dt;
- }
- if (DateTime.TryParse(raw, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt))
- {
- return dt;
- }
- return DateTime.MinValue;
- }
- public IActionResult JackpotDetail(string id, string termType)
- {
- HomeIndex_ViewModel model = new HomeIndex_ViewModel();
- try
- {
- var token = HttpContext.Session.GetComplexData<string>("token");
- if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
- {
- return RedirectToAction("Login", "Account", new { area = "" });
- }
- Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
- UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
- model.userStatus = userStatus;
- model.profile = profile;
- model.bolet = HttpContext.Session.GetString("bolet");
- model.lastResult = HttpContext.Session.GetString("lastResult");
- model.lastResultDate = HttpContext.Session.GetString("lastResultDate");
- model.termType = !string.IsNullOrEmpty(termType)
- ? termType
- : (HttpContext.Session.GetString("termType") ?? Constants.Millions_CODE);
- ViewBag.DrawId = id;
- var cache = HttpContext.Session.GetComplexData<Dictionary<string, List<JackpotWinnerItem>>>("jackpotWinners");
- List<JackpotWinnerItem> winners = null;
- if (cache != null && !string.IsNullOrEmpty(id) && cache.ContainsKey(id))
- {
- winners = cache[id];
- }
- ViewBag.Winners = winners ?? new List<JackpotWinnerItem>();
- }
- catch (Exception ex)
- {
- log.Error(ex);
- ViewBag.Winners = new List<JackpotWinnerItem>();
- }
- return View(model);
- }
- public IActionResult HowToPlay()
- {
- HomeIndex_ViewModel model = new HomeIndex_ViewModel();
- try
- {
- var token = HttpContext.Session.GetComplexData<string>("token");
- if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
- {
- return RedirectToAction("Login", "Account", new { area = "" });
- }
- Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
- UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
- model.userStatus = userStatus;
- model.profile = profile;
- }
- catch (Exception ex)
- {
- log.Error(ex);
- }
- return View(model);
- }
- public IActionResult Results(string termType, string fromDate, string toDate)
- {
- TermResultHistoryModel model = new TermResultHistoryModel();
- try
- {
- var token = HttpContext.Session.GetComplexData<string>("token");
- if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
- {
- return RedirectToAction("Login", "Account", new { area = "" });
- }
- Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
- UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
-
- model.termType = termType != null ? termType : (HttpContext.Session.GetString("termType") ?? Constants.Millions_CODE);
-
- // Set default dates if not provided (same as root implementation)
- string fromFormatted = fromDate != null ? fromDate : DateTime.Now.AddDays(-7).ToString("yyyy-MM-dd");
- string toFormatted = toDate != null ? toDate : DateTime.Now.ToString("yyyy-MM-dd");
- model.fromDate = fromFormatted;
- model.toDate = toFormatted;
- // Load initial results
- ResultOfTermRequest resultOfTermRequest = new ResultOfTermRequest
- {
- gameId = model.termType,
- token = token,
- type = Constants.TERM_HAS_RESULT_TYPE,
- order = Constants.DECS,
- fromDate = DateTime.ParseExact(fromFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
- toDate = DateTime.ParseExact(toFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
- rowsOnPage = Constants.ROW_ON_PAGE,
- seqPage = "1",
- id = Constants.ALL_DATA
- };
- ResultOfTermResponse result = api.GetResultOfTermApi(configuration, resultOfTermRequest);
- if (result.responseCode == Code.SUCCESS)
- {
- model.listTerm = result.listTerm ?? new List<Term>();
- }
- else
- {
- model.listTerm = new List<Term>();
- }
- }
- catch (Exception ex)
- {
- log.Error(ex);
- model.listTerm = new List<Term>();
- }
- return View(model);
- }
- public IActionResult TermResultHistory(string termType, string fromDate, string toDate)
- {
- TermResultHistoryModel model = new TermResultHistoryModel();
- try
- {
- var token = HttpContext.Session.GetComplexData<string>("token");
- if (string.IsNullOrEmpty(token)) return Json(new { status = "error", message = "Session expired" });
- string fromFormatted = fromDate != null ? fromDate : DateTime.Now.AddDays(-2).ToString("yyyy-MM-dd");
- string toFormatted = toDate != null ? toDate : DateTime.Now.ToString("yyyy-MM-dd");
- model.termType = termType;
- model.fromDate = fromFormatted;
- model.toDate = toFormatted;
- ResultOfTermRequest request = new ResultOfTermRequest
- {
- gameId = termType,
- token = token,
- type = Constants.TERM_HAS_RESULT_TYPE,
- order = Constants.DECS,
- fromDate = DateTime.ParseExact(fromFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
- toDate = DateTime.ParseExact(toFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
- rowsOnPage = Constants.ROW_ON_PAGE,
- seqPage = "1",
- id = Constants.ALL_DATA
- };
- ResultOfTermResponse result = api.GetResultOfTermApi(configuration, request);
- if (result.responseCode == Code.SUCCESS)
- {
- model.listTerm = result.listTerm ?? new List<Term>();
- }
- else
- {
- model.listTerm = new List<Term>();
- }
- }
- catch (Exception ex)
- {
- log.Error(ex);
- model.listTerm = new List<Term>();
- }
- return PartialView("_TermResultHistoryV2", model);
- }
- public IActionResult TermResultHistoryGrouped(string fromDate, string toDate)
- {
- try
- {
- var token = HttpContext.Session.GetComplexData<string>("token");
- if (string.IsNullOrEmpty(token)) return Json(new { status = "error", message = "Session expired" });
- string fromFormatted = fromDate != null ? fromDate : DateTime.Now.AddDays(-2).ToString("yyyy-MM-dd");
- string toFormatted = toDate != null ? toDate : DateTime.Now.ToString("yyyy-MM-dd");
- string[] gameIds = { Constants.Millions_CODE };
- var allTerms = new List<Term>();
- foreach (var gid in gameIds)
- {
- ResultOfTermRequest request = new ResultOfTermRequest
- {
- gameId = gid,
- token = token,
- type = Constants.TERM_HAS_RESULT_TYPE,
- order = Constants.DECS,
- fromDate = DateTime.ParseExact(fromFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
- toDate = DateTime.ParseExact(toFormatted, "yyyy-MM-dd", CultureInfo.InvariantCulture).ToString("dd/MM/yyyy"),
- rowsOnPage = "50",
- seqPage = "1",
- id = Constants.ALL_DATA
- };
- ResultOfTermResponse result = api.GetResultOfTermApi(configuration, request);
- if (result.responseCode == Code.SUCCESS && result.listTerm != null)
- {
- allTerms.AddRange(result.listTerm);
- }
- }
- // Group by date part of date_random
- var grouped = allTerms.GroupBy(x => {
- DateTime dt;
- if (DateTime.TryParse(x.date_random, out dt))
- return dt.Date;
- return DateTime.MinValue;
- })
- .Where(g => g.Key != DateTime.MinValue)
- .OrderByDescending(g => g.Key)
- .ToList();
- return PartialView("_TermResultHistoryGrouped", grouped);
- }
- catch (Exception ex)
- {
- log.Error(ex);
- return PartialView("_TermResultHistoryGrouped", new List<IGrouping<DateTime, Term>>());
- }
- }
- public IActionResult History(string termType, string status, string seqPage)
- {
- UserTicketHistoryModel model = new UserTicketHistoryModel();
- try
- {
- var token = HttpContext.Session.GetComplexData<string>("token");
- if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
- {
- return RedirectToAction("Login", "Account", new { area = "" });
- }
- string msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
-
- model.termType = termType ?? Constants.Millions_CODE;
- model.status = status ?? Constants.ALL_DATA; // -1 for all, or 0, 1, 2
- model.seqPage = seqPage ?? "1";
- UserTicketRequest request = new UserTicketRequest
- {
- gameId = model.termType,
- msisdn = msisdn,
- token = token,
- type = model.status,
- order = Constants.DECS,
- rowsOnPage = Constants.ROW_ON_PAGE,
- seqPage = model.seqPage
- };
- UserTicketResponse result = api.GetUserTicketApi(configuration, request);
- if (result.responseCode == Code.SUCCESS)
- {
- model.listTicket = result.listTicket ?? new List<Ticket>();
- model.totalPage = result.totalPage;
- }
- else
- {
- model.listTicket = new List<Ticket>();
- model.totalPage = "0";
- }
- }
- catch (Exception ex)
- {
- log.Error(ex);
- model.listTicket = new List<Ticket>();
- }
- return View(model);
- }
- public IActionResult TermUserTicketHistory(string termType, string status, string seqPage)
- {
- UserTicketHistoryModel model = new UserTicketHistoryModel();
- try
- {
- var token = HttpContext.Session.GetComplexData<string>("token");
- if (string.IsNullOrEmpty(token)) return Json(new { status = "error", message = "Session expired" });
- string msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
- model.termType = termType;
- model.status = status;
- model.seqPage = seqPage ?? "1";
- UserTicketRequest request = new UserTicketRequest
- {
- gameId = termType,
- msisdn = msisdn,
- token = token,
- type = status,
- order = Constants.DECS,
- rowsOnPage = Constants.ROW_ON_PAGE,
- seqPage = model.seqPage
- };
- UserTicketResponse result = api.GetUserTicketApi(configuration, request);
- if (result.responseCode == Code.SUCCESS)
- {
- model.listTicket = result.listTicket ?? new List<Ticket>();
- model.totalPage = result.totalPage;
- }
- else
- {
- model.listTicket = new List<Ticket>();
- model.totalPage = "0";
- }
- }
- catch (Exception ex)
- {
- log.Error(ex);
- model.listTicket = new List<Ticket>();
- }
- return PartialView("_TermUserTicketHistory", model);
- }
- public IActionResult RewardHistory(string seqPage)
- {
- RewardHistoryModel model = BuildRewardHistory(seqPage, fallbackRedirectOnExpired: true, out IActionResult redirect);
- if (redirect != null) return redirect;
- return View(model);
- }
- public IActionResult RewardHistoryPartial(string seqPage)
- {
- var token = HttpContext.Session.GetComplexData<string>("token");
- if (string.IsNullOrEmpty(token))
- return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
- RewardHistoryModel model = BuildRewardHistory(seqPage, fallbackRedirectOnExpired: false, out _);
- return PartialView("_RewardHistoryList", model);
- }
- private RewardHistoryModel BuildRewardHistory(string seqPage, bool fallbackRedirectOnExpired, out IActionResult redirect)
- {
- redirect = null;
- RewardHistoryModel model = new RewardHistoryModel
- {
- seqPage = string.IsNullOrEmpty(seqPage) ? "1" : seqPage
- };
- try
- {
- var token = HttpContext.Session.GetComplexData<string>("token");
- if (string.IsNullOrEmpty(token))
- {
- if (fallbackRedirectOnExpired)
- redirect = RedirectToAction("Login", "Account", new { area = "" });
- return model;
- }
- string msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
- TransactionInfoRequest request = new TransactionInfoRequest
- {
- msisdn = msisdn,
- token = token,
- order = Constants.DECS,
- rowsOnPage = Constants.ROW_ON_PAGE,
- seqPage = model.seqPage
- };
- TransactionInfoResponse result = api.GetTransactionInfoApi(configuration, request);
- if (result != null && result.responseCode == Code.SUCCESS)
- {
- model.list = result.list ?? new List<Transaction>();
- model.totalPage = result.totalPage ?? "0";
- }
- }
- catch (Exception ex)
- {
- log.Error(ex);
- }
-
- return model;
- }
- [HttpPost]
- [ValidateAntiForgeryToken]
- public IActionResult GetFreeTicket(string type)
- {
- try
- {
- var token = HttpContext.Session.GetComplexData<string>("token");
- var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
- log.Info($"[Millions.GetFreeTicket] START - msisdn={msisdn}");
- if (string.IsNullOrEmpty(token) || string.IsNullOrEmpty(msisdn))
- {
- log.Info($"[Millions.GetFreeTicket] Session expired - msisdn={msisdn}");
- return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
- }
- if (type == "1")
- {
- if (HttpContext.Session.GetString(FreeTicketAutoCheckSessionKey) == "1")
- {
- log.Info($"[Millions.GetFreeTicket] Auto-check skipped for current session - msisdn={msisdn}");
- return Json(new { responseCode = "", responseMessage = "Auto-check already completed", skipped = true });
- }
- // Set before the downstream call to prevent concurrent Home requests
- // from triggering multiple automatic checks in the same login session.
- HttpContext.Session.SetString(FreeTicketAutoCheckSessionKey, "1");
- }
- string lang = CultureInfo.CurrentCulture.Name;
- string langValue = (lang.StartsWith("en") || lang.StartsWith("fr")) ? "0" : "1";
- GetFreeTicketRequest request = new GetFreeTicketRequest
- {
- requestId = Guid.NewGuid().ToString(),
- gameId = Constants.Millions_CODE,
- type = type,
- msisdn = msisdn,
- language = langValue,
- token = token
- };
- GetFreeTicketResponse response = api.GetFreeTicketApi(configuration, request);
- HttpContext.Session.Remove(FreeTicketPromotionCodeSessionKey);
- if (!string.IsNullOrWhiteSpace(response?.code))
- {
- HttpContext.Session.SetString(FreeTicketPromotionCodeSessionKey, response.code.Trim());
- }
- log.Info($"[Millions.GetFreeTicket] Response - code={response?.responseCode}, msg={response?.responseMessage}, voucher={response?.code}");
- return Json(response);
- }
- catch (Exception ex)
- {
- log.Error("[Millions.GetFreeTicket] EXCEPTION", ex);
- return Json(new { responseCode = Code.ERROR, responseMessage = ex.Message });
- }
- }
- [HttpPost]
- [ValidateAntiForgeryToken]
- public IActionResult TermResult(string termType)
- {
- try
- {
- var token = HttpContext.Session.GetComplexData<string>("token");
- var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
- log.Info($"[Millions.TermResult] START - termType={termType}, msisdn={msisdn}");
- if (string.IsNullOrEmpty(token))
- {
- log.Info($"[Millions.TermResult] Session expired - termType={termType}, msisdn={msisdn}");
- return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
- }
- string lang = CultureInfo.CurrentCulture.Name;
- string langValue = (lang.StartsWith("en") || lang.StartsWith("fr")) ? "0" : "1";
- ResultOfTermRequest request = new ResultOfTermRequest
- {
- gameId = termType,
- language = langValue,
- token = token,
- type = Constants.TERM_HAS_NOT_RESULT_TYPE,
- order = Constants.DECS,
- rowsOnPage = "5",
- seqPage = "1",
- id = Constants.ALL_DATA
- };
- ResultOfTermResponse result = api.GetResultOfTermApi(configuration, request);
- log.Info($"[Millions.TermResult] Response - termType={termType}, code={result?.responseCode}, msg={result?.responseMessage}, termCount={result?.listTerm?.Count ?? 0}");
- return Json(result);
- }
- catch (Exception ex)
- {
- log.Error($"[Millions.TermResult] EXCEPTION - termType={termType}", ex);
- return Json(new { responseCode = Code.ERROR, responseMessage = ex.Message });
- }
- }
- [HttpPost]
- public IActionResult ConfirmTicketData([FromBody] ConfirmTicketDataRequest request)
- {
- try
- {
- var token = HttpContext.Session.GetComplexData<string>("token");
- var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
- if (string.IsNullOrEmpty(token)) return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
- request.token = token;
- request.msisdn = msisdn;
- request.language = CultureInfo.CurrentCulture.Name.StartsWith("en") ? "0" : "1";
- request.requestId = Guid.NewGuid().ToString();
- var sessionPromotionCode = HttpContext.Session.GetString(FreeTicketPromotionCodeSessionKey);
- var isValidPromotionCode = !string.IsNullOrWhiteSpace(request.promotionCode)
- && string.Equals(request.promotionCode, sessionPromotionCode, StringComparison.Ordinal);
- if (isValidPromotionCode)
- {
- request.gameId = Constants.Millions_CODE;
- request.channelPayment = Constants.BASIC_WALLET_TICKET;
- }
- else
- {
- request.promotionCode = null;
- }
- // DEBUG: Log request data
- var ticketDebug = request.ticket != null ? string.Join("; ", request.ticket.Select(t => $"code={t.code}, money={t.money}")) : "NULL";
- log.Info($"[BuyTicketV2.Prepare] gameId={request.gameId}, msisdn={request.msisdn}, tickets=[{ticketDebug}]");
- ConfirmTicketDataResponse response = api.BuyTicketV2Api(configuration, request);
- if (response.responseCode == Code.SUCCESS && !string.IsNullOrWhiteSpace(response.transId))
- {
- HttpContext.Session.SetString(PendingTicketTransactionSessionKey, response.transId);
- HttpContext.Session.Remove(OtpVerifiedTransactionSessionKey);
- }
- if (isValidPromotionCode && response.responseCode == Code.SUCCESS && !string.IsNullOrWhiteSpace(response.transId))
- {
- HttpContext.Session.SetString(FreeTicketTransactionSessionKey, response.transId);
- }
-
- // DEBUG: Log response
- log.Info($"[BuyTicketV2.Prepare] Response: code={response.responseCode}, msg={response.responseMessage}, transId={response.transId}");
-
- return Json(response);
- }
- catch (Exception ex)
- {
- log.Error(ex);
- return Json(new { responseCode = Code.ERROR, responseMessage = ex.Message });
- }
- }
- [HttpPost]
- public IActionResult PrepareTicketPayment([FromBody] MillionsPaymentRequest paymentRequest)
- {
- try
- {
- if (paymentRequest?.ticketData == null || paymentRequest.ticketData.ticket == null || !paymentRequest.ticketData.ticket.Any())
- {
- return Json(new { responseCode = Code.FAILURE, responseMessage = Lang.ticket_invalid });
- }
- if (paymentRequest.paymentSource != Constants.BASIC_WALLET_TICKET &&
- paymentRequest.paymentSource != Constants.NATCASH_WALLET_TICKET)
- {
- return Json(new { responseCode = Code.FAILURE, responseMessage = Lang.error_happened });
- }
- var token = HttpContext.Session.GetComplexData<string>("token");
- var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
- if (string.IsNullOrEmpty(token))
- {
- return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
- }
- ConfirmTicketDataRequest request = paymentRequest.ticketData;
- request.token = token;
- request.msisdn = msisdn;
- request.language = CultureInfo.CurrentCulture.Name.StartsWith("en") ? "0" : "1";
- request.requestId = Guid.NewGuid().ToString();
- log.Info($"[Millions.PrepareTicketPayment] Confirm ticket request: {JsonConvert.SerializeObject(request)}");
- ConfirmTicketDataResponse response = api.ConfirmTicketDataApi(configuration, request);
- log.Info($"[Millions.PrepareTicketPayment] Confirm ticket response: {JsonConvert.SerializeObject(response)}");
- if (response.responseCode != Code.SUCCESS || paymentRequest.paymentSource != Constants.NATCASH_WALLET_TICKET)
- {
- return Json(response);
- }
- string param = "transactionId=" + response.transId + "&requestId=" + response.requestId + "&money=" + response.totalMoney;
- string privateUrl = CreatePrivateURL(configuration, param, "seconds", "0", "0", GetParameter("rsaPolicy"));
- return Json(new
- {
- responseCode = response.responseCode,
- responseMessage = response.responseMessage,
- transId = response.transId,
- requestId = response.requestId,
- totalMoney = response.totalMoney,
- paymentSource = paymentRequest.paymentSource,
- redirectUrl = GetParameter(Constants.SUB_DOMAIN) + "/BuyTicket/BackToApp?" + privateUrl
- });
- }
- catch (Exception ex)
- {
- log.Error("[Millions.PrepareTicketPayment] EXCEPTION: ", ex);
- return Json(new { responseCode = Code.ERROR, responseMessage = Lang.error_happened });
- }
- }
- [HttpPost]
- public IActionResult ConfirmOTP([FromBody] ConfirmOTPRequest request)
- {
- try
- {
- var token = HttpContext.Session.GetComplexData<string>("token");
- var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
- if (string.IsNullOrEmpty(token)) return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
- request.token = token;
- request.msisdn = msisdn;
- var transactionId = request.transIdByTicket;
- var pendingTransactionId = HttpContext.Session.GetString(PendingTicketTransactionSessionKey);
- if (string.IsNullOrWhiteSpace(transactionId)
- || !string.Equals(transactionId, pendingTransactionId, StringComparison.Ordinal))
- {
- return Json(new { responseCode = "4", responseMessage = GetLangFromCode("4") });
- }
- // This value is only used by the website to bind OTP verification
- // to the prepared transaction; it must not be sent to the OTP API.
- request.transIdByTicket = null;
- ConfirmOTPResponse response = api.ConfirmOTPApi(configuration, request);
- if (response.responseCode == Code.SUCCESS)
- {
- HttpContext.Session.SetString(OtpVerifiedTransactionSessionKey, transactionId);
- }
- return Json(response);
- }
- catch (Exception ex)
- {
- log.Error(ex);
- return Json(new { responseCode = Code.ERROR, responseMessage = ex.Message });
- }
- }
- [HttpPost]
- public IActionResult SendOTP()
- {
- try
- {
- var token = HttpContext.Session.GetComplexData<string>("token");
- var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
- if (string.IsNullOrEmpty(token)) return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
- SendOTPRequest request = new SendOTPRequest
- {
- msisdn = msisdn,
- token = token,
- language = CultureInfo.CurrentCulture.Name.StartsWith("en") ? "0" : "1",
- channel = configuration.GetSection("channel").Value
- };
- SendOTPResponse response = api.SendOTPApi(configuration, request);
- if (response.responseCode == Code.SUCCESS)
- {
- HttpContext.Session.Remove(OtpVerifiedTransactionSessionKey);
- }
- return Json(response);
- }
- catch (Exception ex)
- {
- log.Error(ex);
- return Json(new { responseCode = Code.ERROR, responseMessage = ex.Message });
- }
- }
- [HttpPost]
- public IActionResult ConfirmBuyingTicketV2([FromBody] ConfirmBuyingTicketRequest request)
- {
- try
- {
- var token = HttpContext.Session.GetComplexData<string>("token");
- var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
- if (string.IsNullOrEmpty(token)) return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
- var isWalletPayment = request.channelPayment == Constants.NATCASH_WALLET_TICKET;
- var freeTicketTransactionId = HttpContext.Session.GetString(FreeTicketTransactionSessionKey);
- var isFreeTicketTransaction = !string.IsNullOrWhiteSpace(request.transIdByTicket)
- && string.Equals(request.transIdByTicket, freeTicketTransactionId, StringComparison.Ordinal);
- // Main-account and promotion purchases must have completed the
- // separate ConfirmOTP request for this exact prepared transaction.
- if (!isWalletPayment)
- {
- var otpVerifiedTransactionId = HttpContext.Session.GetString(OtpVerifiedTransactionSessionKey);
- if (string.IsNullOrWhiteSpace(request.transIdByTicket)
- || !string.Equals(request.transIdByTicket, otpVerifiedTransactionId, StringComparison.Ordinal))
- {
- return Json(new { responseCode = "31", responseMessage = GetLangFromCode("31") });
- }
- HttpContext.Session.Remove(OtpVerifiedTransactionSessionKey);
- }
- // Step 2: Proceed to Confirm buying
- request.token = token;
- request.msisdn = msisdn;
- request.requestId = Guid.NewGuid().ToString();
- request.language = CultureInfo.CurrentCulture.Name.StartsWith("en") ? "0" : "1";
- request.channel = configuration.GetSection("channel").Value;
- request.gameId = Constants.Millions_CODE;
- ConfirmBuyingTicketResponse response;
- if (isWalletPayment)
- {
- response = api.ConfirmBuyingTicketV2Api(
- configuration,
- request,
- Constants.WALLET_PAYMENT_CHANNEL,
- request.walletPin);
- }
- else if (isFreeTicketTransaction)
- {
- // Promotion transactions are created by BuyTicketV2 and must
- // be completed by the matching V2 confirmation endpoint.
- response = api.ConfirmBuyingTicketV2Api(configuration, request);
- }
- else
- {
- response = api.ConfirmBuyingTicketApi(configuration, request);
- }
- if (response.responseCode == Code.SUCCESS)
- {
- if (isFreeTicketTransaction)
- {
- HttpContext.Session.Remove(FreeTicketPromotionCodeSessionKey);
- HttpContext.Session.Remove(FreeTicketTransactionSessionKey);
- }
- UpdateUserStatus(msisdn, token);
- }
- return Json(response);
- }
- catch (Exception ex)
- {
- log.Error(ex);
- return Json(new { responseCode = Code.ERROR, responseMessage = ex.Message });
- }
- }
- [HttpPost]
- public IActionResult ConfirmBuyingTicket([FromBody] ConfirmBuyingTicketRequest request)
- {
- try
- {
- var token = HttpContext.Session.GetComplexData<string>("token");
- var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
- if (string.IsNullOrEmpty(token)) return Json(new { responseCode = Code.SESSION_EXPIRED, responseMessage = "Session expired" });
- request.token = token;
- request.msisdn = msisdn;
- request.requestId = Guid.NewGuid().ToString();
- request.language = CultureInfo.CurrentCulture.Name.StartsWith("en") ? "0" : "1";
- request.channel = configuration.GetSection("channel").Value;
- ConfirmBuyingTicketResponse response = api.ConfirmBuyingTicketApi(configuration, request);
- if (response.responseCode == Code.SUCCESS)
- {
- UpdateUserStatus(msisdn, token);
- }
- return Json(new {
- responseCode = response.responseCode,
- responseMessage = response.responseMessage,
- transId = response.transId,
- orderId = response.orderId,
- userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus")
- });
- }
- catch (Exception ex)
- {
- log.Error(ex);
- return Json(new { responseCode = Code.ERROR, responseMessage = ex.Message });
- }
- }
- public IActionResult BuyTicket(string termType)
- {
- try
- {
- var token = HttpContext.Session.GetComplexData<string>("token");
- var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
- log.Info($"[Millions.BuyTicket] START - termType={termType}, msisdn={msisdn}");
- if (string.IsNullOrEmpty(token) && !User.Identity.IsAuthenticated)
- {
- log.Info($"[Millions.BuyTicket] Redirect login - missing token, termType={termType}, msisdn={msisdn}");
- return RedirectToAction("Login", "Account", new { area = "" });
- }
-
- HomeIndex_ViewModel model = new HomeIndex_ViewModel();
- model.termType = termType ?? Constants.Millions_CODE;
- log.Info($"[Millions.BuyTicket] Check active term - gameId={model.termType}, msisdn={msisdn}");
- Profile profile = HttpContext.Session.GetComplexData<Profile>("profile");
- UserStatus userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
- model.userStatus = userStatus;
- model.profile = profile;
-
- // Get active term
- ResultOfTermRequest request = new ResultOfTermRequest
- {
- gameId = model.termType,
- token = token,
- type = Constants.TERM_HAS_NOT_RESULT_TYPE,
- order = Constants.DECS,
- rowsOnPage = "1",
- seqPage = "1",
- id = Constants.ALL_DATA
- };
- ResultOfTermResponse result = api.GetResultOfTermApi(configuration, request);
- log.Info($"[Millions.BuyTicket] Active term response - gameId={model.termType}, code={result?.responseCode}, msg={result?.responseMessage}, termCount={result?.listTerm?.Count ?? 0}");
- if (result.responseCode == Code.SUCCESS && result.listTerm != null && result.listTerm.Count > 0)
- {
- model.listTerm = result.listTerm;
- }
- else
- {
- model.listTerm = new List<Term>();
- }
- if (model.termType == Constants.PIC10_BIGSMALL_CODE || model.termType == Constants.PIC10_ODDEVEN_CODE)
- {
- log.Info($"[Millions.BuyTicket] Check past terms - gameId={model.termType}, msisdn={msisdn}");
- ResultOfTermRequest pastRequest = new ResultOfTermRequest
- {
- gameId = model.termType,
- token = token,
- type = Constants.TERM_HAS_RESULT_TYPE,
- order = Constants.DECS,
- fromDate = DateTime.Now.AddDays(-10).ToString("dd/MM/yyyy"),
- toDate = DateTime.Now.ToString("dd/MM/yyyy"),
- rowsOnPage = "5",
- seqPage = "1",
- id = Constants.ALL_DATA
- };
- ResultOfTermResponse pastResult = api.GetResultOfTermApi(configuration, pastRequest);
- log.Info($"[Millions.BuyTicket] Past term response - gameId={model.termType}, code={pastResult?.responseCode}, msg={pastResult?.responseMessage}, termCount={pastResult?.listTerm?.Count ?? 0}");
- if (pastResult.responseCode == Code.SUCCESS && pastResult.listTerm != null)
- {
- var pastTerms = pastResult.listTerm.Take(5).ToList();
- pastTerms.Reverse(); // Display chronological order
- ViewBag.PastTerms = pastTerms;
- }
- else
- {
- ViewBag.PastTerms = new List<Term>();
- }
- }
- log.Info($"[Millions.BuyTicket] END - gameId={model.termType}, activeTermCount={model.listTerm?.Count ?? 0}, msisdn={msisdn}");
- return View(model);
- }
- catch (Exception ex)
- {
- log.Error($"[Millions.BuyTicket] EXCEPTION - termType={termType}", ex);
- return RedirectToAction("GameHome", new { termType = termType });
- }
- }
- public IActionResult TransferWinMoney()
- {
- if (!CheckAuthToken())
- {
- return RedirectToAction("Login", "Account", new { area = "" });
- }
- HomeIndex_ViewModel model = new HomeIndex_ViewModel();
- model.profile = HttpContext.Session.GetComplexData<Profile>("profile");
- model.userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
- return View(model);
- }
- [HttpPost]
- public IActionResult ConfirmTransfer(string otp, string phone, string amount, int channelPayment = 1)
- {
- try
- {
- var token = HttpContext.Session.GetComplexData<string>("token");
- var msisdn = HttpContext.Session.GetComplexData<string>("msisdn");
- if (string.IsNullOrEmpty(token)) return Json(new { status = Code.SESSION_EXPIRED, message = "Session expired" });
- var transferChannel = channelPayment == 2
- ? Constants.NATCASH_WALLET_TRANSFER
- : Constants.BASIC_WALLET_TRANSFER;
- // Step 1: Verify OTP
- ConfirmOTPRequest otpRequest = new ConfirmOTPRequest
- {
- otp = otp,
- msisdn = msisdn,
- token = token,
- language = CultureInfo.CurrentCulture.Name.StartsWith("en") ? "0" : "1",
- channel = configuration.GetSection("channel").Value
- };
- ConfirmOTPResponse otpResponse = api.ConfirmOTPApi(configuration, otpRequest);
- if (otpResponse.responseCode != Code.SUCCESS)
- {
- return Json(new { status = otpResponse.responseCode, message = otpResponse.responseMessage });
- }
- // Step 2: If OTP success, call Transfer Money Api
- TransferMoneyRequest xferRequest = new TransferMoneyRequest
- {
- msisdn = msisdn,
- msisdnReceive = phone,
- money = amount,
- otp = otp,
- token = token,
- channelPayment = transferChannel,
- language = CultureInfo.CurrentCulture.Name.StartsWith("en") ? "0" : "1",
- channel = configuration.GetSection("channel").Value
- };
- TransferMoneyResponse xferResponse = api.TransferMoneyApi(configuration, xferRequest);
- if (xferResponse.responseCode == Code.SUCCESS)
- {
- UpdateUserStatus(msisdn, token);
- }
- return Json(new {
- status = xferResponse.responseCode,
- message = xferResponse.responseMessage,
- paymentCode = xferResponse.paymentCode,
- responseCode = xferResponse.responseCode,
- userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus")
- });
- }
- catch (Exception ex)
- {
- log.Error(ex);
- return Json(new { status = Code.ERROR, message = ex.Message });
- }
- }
- private void UpdateUserStatus(string msisdn, string token)
- {
- try
- {
- UserStatusRequest userStatusRequest = new UserStatusRequest { users = msisdn, token = token };
- UserStatus userStatusGet = api.GetUserStatusApi(configuration, userStatusRequest);
- if (userStatusGet != null)
- {
- HttpContext.Session.SetComplexData("userStatus", userStatusGet);
- }
- }
- catch (Exception ex)
- {
- log.Error("UpdateUserStatus Error: " + ex.Message);
- }
- }
- public IActionResult Logout()
- {
- ClearCache();
- return Redirect(GetParameter(Constants.SUB_DOMAIN) + "/Account/Login");
- }
- }
- public class MillionsPaymentRequest
- {
- public string paymentSource { get; set; }
- public ConfirmTicketDataRequest ticketData { get; set; }
- }
- }
|