student před 7 hodinami
rodič
revize
b7db72eac2

+ 12 - 10
website/Areas/LotteryV2/Controllers/HomeController.cs

@@ -185,7 +185,7 @@ namespace LotteryWebApp.Areas.LotteryV2.Controllers
 
                 if (!string.IsNullOrEmpty(termType))
                 {
-                     HttpContext.Session.SetString("termType", termType);
+                    HttpContext.Session.SetString("termType", termType);
                 }
             }
             catch (Exception ex)
@@ -194,6 +194,7 @@ namespace LotteryWebApp.Areas.LotteryV2.Controllers
                 return RedirectToAction("Login", "Account", new { area = "" });
             }
 
+            model.serverTime = DateTime.Now;
             return View(model);
         }
 
@@ -225,7 +226,7 @@ namespace LotteryWebApp.Areas.LotteryV2.Controllers
             {
                 log.Error(ex);
             }
-            return View(model);
+            model.serverTime = DateTime.Now; return View(model);
         }
 
         public async Task<IActionResult> FAQ()
@@ -248,7 +249,7 @@ namespace LotteryWebApp.Areas.LotteryV2.Controllers
             {
                 log.Error(ex);
             }
-            return View(model);
+            model.serverTime = DateTime.Now; return View(model);
         }
 
         public IActionResult More()
@@ -271,7 +272,7 @@ namespace LotteryWebApp.Areas.LotteryV2.Controllers
             {
                 log.Error(ex);
             }
-            return View(model);
+            model.serverTime = DateTime.Now; return View(model);
         }
 
         public IActionResult Profile()
@@ -294,7 +295,7 @@ namespace LotteryWebApp.Areas.LotteryV2.Controllers
             {
                 log.Error(ex);
             }
-            return View(model);
+            model.serverTime = DateTime.Now; return View(model);
         }
 
         [HttpPost]
@@ -369,7 +370,7 @@ namespace LotteryWebApp.Areas.LotteryV2.Controllers
             {
                 log.Error(ex);
             }
-            return View(model);
+            model.serverTime = DateTime.Now; return View(model);
         }
 
         public IActionResult HowToPlay()
@@ -392,7 +393,7 @@ namespace LotteryWebApp.Areas.LotteryV2.Controllers
             {
                 log.Error(ex);
             }
-            return View(model);
+            model.serverTime = DateTime.Now; return View(model);
         }
 
         public IActionResult Results(string termType, string fromDate, string toDate)
@@ -447,7 +448,7 @@ namespace LotteryWebApp.Areas.LotteryV2.Controllers
                 log.Error(ex);
                 model.listTerm = new List<Term>();
             }
-            return View(model);
+            model.serverTime = DateTime.Now; return View(model);
         }
 
         public IActionResult TermResultHistory(string termType, string fromDate, string toDate)
@@ -596,6 +597,7 @@ namespace LotteryWebApp.Areas.LotteryV2.Controllers
                 log.Error(ex);
                 model.listTicket = new List<Ticket>();
             }
+            model.serverTime = DateTime.Now;
             return View(model);
         }
 
@@ -936,7 +938,7 @@ namespace LotteryWebApp.Areas.LotteryV2.Controllers
                     }
                 }
 
-                return View(model);
+                model.serverTime = DateTime.Now; return View(model);
             }
             catch (Exception ex)
             {
@@ -954,7 +956,7 @@ namespace LotteryWebApp.Areas.LotteryV2.Controllers
             HomeIndex_ViewModel model = new HomeIndex_ViewModel();
             model.profile = HttpContext.Session.GetComplexData<Profile>("profile");
             model.userStatus = HttpContext.Session.GetComplexData<UserStatus>("userStatus");
-            return View(model);
+            model.serverTime = DateTime.Now; return View(model);
         }
 
         [HttpPost]

+ 1 - 1
website/Areas/LotteryV2/Views/Home/FAQ.cshtml

@@ -60,7 +60,7 @@
         <div class="flex justify-end mt-2">
              <div class="rounded-xl rounded-tr-sm px-5 py-4 shadow-md w-[90%] bg-white text-[#212121] border border-gray-100">
                  <span class="text-[13px] font-medium leading-relaxed block mb-3">@Lang.faq_a2</span>
-                 <span class="text-[13px] font-medium leading-relaxed block">@Lang.faq_a3</span>
+                 @* <span class="text-[13px] font-medium leading-relaxed block">@Lang.faq_a3</span> *@
              </div>
         </div>
 

+ 32 - 32
website/Areas/LotteryV2/Views/Home/GameHome.cshtml

@@ -378,43 +378,43 @@
         }
 
         function startCountdown() {
-            const targetHour = 20; // 20:00 (8h tối)
-            const now = new Date();
-            let target = new Date();
-            target.setHours(targetHour, 0, 0, 0);
-
-            if (now >= target) {
-                target.setDate(target.getDate() + 1);
-            }
-
-            // Định dạng ngày hiển thị (VD: Friday, Mar 20, 2026)
-            const options = { weekday: 'long', month: 'short', day: 'numeric', year: 'numeric' };
-            const dateText = target.toLocaleDateString('en-US', options);
-            document.getElementById('draw-date').innerText = dateText;
+            const targetHour = 20; // 20:00 (8 PM) Haiti time
+            const timeZone = 'America/Port-au-Prince';
+            const timers = document.querySelectorAll('.countdown-timer');
+            
+            // Server time string has no offset => must be interpreted in Haiti timezone
+            const serverTimeStr = '@Model.serverTime.ToString("yyyy-MM-ddTHH:mm:ss")';
+            const startBrowser = moment();
+            const baseServer = moment.tz(serverTimeStr, 'YYYY-MM-DDTHH:mm:ss', timeZone);
 
             function updateTime() {
-                const current = new Date();
-                const diff = target - current;
-
-                if (diff <= 0) {
-                    target.setDate(target.getDate() + 1);
-                    const updatedDateText = target.toLocaleDateString('en-US', options);
-                    document.getElementById('draw-date').innerText = updatedDateText;
-                    updateTime();
-                    return;
-                }
-
-                const hours = Math.floor((diff / (1000 * 60 * 60)));
-                const minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));
-                const seconds = Math.floor((diff % (1000 * 60)) / 1000);
-
-                document.getElementById('countdown-hours').innerText = hours.toString().padStart(2, '0');
-                document.getElementById('countdown-minutes').innerText = minutes.toString().padStart(2, '0');
-                document.getElementById('countdown-seconds').innerText = seconds.toString().padStart(2, '0');
+                const elapsedMs = moment().diff(startBrowser);
+                const now = baseServer.clone().add(elapsedMs, 'milliseconds'); // Haiti time
+
+                let target = now.clone().hour(targetHour).minute(0).second(0).millisecond(0);
+                if (now.isSameOrAfter(target)) target.add(1, 'day');
+
+                // Draw date display (e.g. Friday, Mar 20, 2026) in Haiti time
+                const dateText = target.clone().locale('en').format('dddd, MMM D, YYYY');
+                const drawDateEl = document.getElementById('draw-date');
+                if (drawDateEl) drawDateEl.innerText = dateText;
+
+                const dur = moment.duration(target.diff(now));
+                const hours = Math.max(0, Math.floor(dur.asHours()));
+                const minutes = Math.max(0, dur.minutes());
+                const seconds = Math.max(0, dur.seconds());
+
+                const hhEl = document.getElementById('countdown-hours');
+                const mmEl = document.getElementById('countdown-minutes');
+                const ssEl = document.getElementById('countdown-seconds');
+                
+                if (hhEl) hhEl.innerText = hours.toString().padStart(2, '0');
+                if (mmEl) mmEl.innerText = minutes.toString().padStart(2, '0');
+                if (ssEl) ssEl.innerText = seconds.toString().padStart(2, '0');
 
                 // Update all card timers
                 const timeStr = `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;
-                document.querySelectorAll('.countdown-timer').forEach(t => t.innerText = timeStr);
+                timers.forEach(t => t.innerText = timeStr);
             }
 
             updateTime();

+ 17 - 13
website/Areas/LotteryV2/Views/Home/Index.cshtml

@@ -152,22 +152,26 @@
     }
 
     function startCountdown() {
-        const targetHour = 20; // 20:00 (8 PM)
+        const targetHour = 20; // 20:00 (8 PM) Haiti time
+        const timeZone = 'America/Port-au-Prince';
         const timers = document.querySelectorAll('.countdown-timer');
         
+        // Server time string has no offset => must be interpreted in Haiti timezone
+        const serverTimeStr = '@Model.serverTime.ToString("yyyy-MM-ddTHH:mm:ss")';
+        const startBrowser = moment();
+        const baseServer = moment.tz(serverTimeStr, 'YYYY-MM-DDTHH:mm:ss', timeZone);
+        
         function update() {
-            const now = new Date();
-            let target = new Date();
-            target.setHours(targetHour, 0, 0, 0);
-            
-            if (now >= target) {
-                target.setDate(target.getDate() + 1);
-            }
-            
-            const diff = target - now;
-            const h = Math.floor(diff / (1000 * 60 * 60));
-            const m = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));
-            const s = Math.floor((diff % (1000 * 60)) / 1000);
+            const elapsedMs = moment().diff(startBrowser);
+            const now = baseServer.clone().add(elapsedMs, 'milliseconds'); // Haiti time
+
+            let target = now.clone().hour(targetHour).minute(0).second(0).millisecond(0);
+            if (now.isSameOrAfter(target)) target.add(1, 'day');
+
+            const dur = moment.duration(target.diff(now));
+            const h = Math.max(0, Math.floor(dur.asHours()));
+            const m = Math.max(0, dur.minutes());
+            const s = Math.max(0, dur.seconds());
             
             const timeStr = `${h.toString().padStart(2, '0')}:${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`;
             timers.forEach(t => t.innerText = timeStr);

+ 4 - 0
website/Areas/LotteryV2/Views/Shared/_Layout.cshtml

@@ -37,6 +37,10 @@
     <!-- Original jquery or similar -->
     <script src="/lib/jquery/jquery.min.js"></script>
     <script src="/lib/bootstrap/js/bootstrap.bundle.min.js"></script>
+
+    <!-- Moment (timezone-safe countdown) -->
+    <script src="/js/vendors/moment-with-locales.min.js"></script>
+    <script src="/js/vendors/moment-timezone-with-data.min.js"></script>
     
     <!-- Isolated JS just for LotteryV2 -->
     <script src="/LotteryV2/js/site.js"></script>

+ 1 - 1
website/Languages/Lang.Designer.cs

@@ -1243,7 +1243,7 @@ namespace LotteryWebApp.Languages {
         }
         
         /// <summary>
-        ///   Looks up a localized string similar to 1000.000 HTG jodia  !.
+        ///   Looks up a localized string similar to 1.000.000 HTG jodia  !.
         /// </summary>
         public static string jackpot_today_htg {
             get {

+ 1 - 1
website/Languages/Lang.fr.resx

@@ -1185,7 +1185,7 @@ We’ll help you create an account in a few easy steps.</value>
     <value>Une erreur est survenue lors de la mise à jour de votre profil.</value>
   </data>
   <data name="jackpot_today_htg" xml:space="preserve">
-    <value>1000.000 HTG today !</value>
+    <value>1.000.000 HTG today !</value>
   </data>
   <data name="no_results_found" xml:space="preserve">
     <value>No results found</value>

+ 1 - 1
website/Languages/Lang.resx

@@ -1187,7 +1187,7 @@ Rezilta ofisyel la se &lt;span class="text-[#A236C8]"&gt;ODD&lt;/span&gt;.</valu
     <value>Gen yon ere. Nan mizajou pwofil la</value>
   </data>
   <data name="jackpot_today_htg" xml:space="preserve">
-    <value>1000.000 HTG jodia  !</value>
+    <value>1.000.000 HTG jodia  !</value>
   </data>
   <data name="no_results_found" xml:space="preserve">
     <value>Pagen rezilta</value>

+ 9 - 3
website/Models/HomeViewModel.cs

@@ -13,6 +13,8 @@ namespace LotteryWebApp.Models
         public String uuid { get; set; }
         public String subDomain { get; set; }
         public String topWinner { get; set; }
+        public DateTime serverTime { get; set; }
+        public double secondsUntilDraw { get; set; }
     }
 
     public class HomeTransfer_ViewModel
@@ -24,15 +26,17 @@ namespace LotteryWebApp.Models
         public UserStatus userStatus { get; set; }
         public Transaction transaction { get; set; }
         public TransferMoneyRequest transferData { get; set; }
-
+        public DateTime serverTime { get; set; }
     }
 
     public class HomeRules_ViewModel
     {
         public string termType { get; set; }
+        public DateTime serverTime { get; set; }
     }
     public class HomeFAQ_ViewModel
     {
+        public DateTime serverTime { get; set; }
     }
 
     public class HomeResults_ViewModel
@@ -40,12 +44,13 @@ namespace LotteryWebApp.Models
         public string termType { get; set; }
         public string fromDate { get; set; }
         public string toDate { get; set; }
+        public DateTime serverTime { get; set; }
     }
     public class TermResultModel
     {
         public List<Term> listTerm { get; set; }
         public string termType { get; set; }
-
+        public DateTime serverTime { get; set; }
     }
 
     public class TermResultHistoryModel
@@ -54,7 +59,7 @@ namespace LotteryWebApp.Models
         public string termType { get; set; }
         public string fromDate { get; set; }
         public string toDate { get; set; }
-
+        public DateTime serverTime { get; set; }
     }
 
     public class UserTicketHistoryModel
@@ -64,6 +69,7 @@ namespace LotteryWebApp.Models
         public string status { get; set; }
         public string totalPage { get; set; }
         public string seqPage { get; set; }
+        public DateTime serverTime { get; set; }
     }
 
 }