vuDUng 2 هفته پیش
والد
کامیت
ea827f985c
90فایلهای تغییر یافته به همراه4575 افزوده شده و 38 حذف شده
  1. 1 0
      .gitignore
  2. 18 0
      SicboSub/Database/Database.csproj
  3. 69 0
      SicboSub/Database/Database/AccountUser.cs
  4. 15 0
      SicboSub/Database/Database/AppConfig.cs
  5. 19 0
      SicboSub/Database/Database/BettingHistory.cs
  6. 11 0
      SicboSub/Database/Database/Blacklist.cs
  7. 23 0
      SicboSub/Database/Database/ChargeLog.cs
  8. 11 0
      SicboSub/Database/Database/ChatToolMessage.cs
  9. 11 0
      SicboSub/Database/Database/ChatToolUser.cs
  10. 19 0
      SicboSub/Database/Database/Config.cs
  11. 21 0
      SicboSub/Database/Database/ExchangeConfig.cs
  12. 21 0
      SicboSub/Database/Database/ExchangeHistory.cs
  13. 15 0
      SicboSub/Database/Database/LogChat.cs
  14. 1396 0
      SicboSub/Database/Database/ModelContext.cs
  15. 23 0
      SicboSub/Database/Database/MpsConfig.cs
  16. 21 0
      SicboSub/Database/Database/Mt.cs
  17. 27 0
      SicboSub/Database/Database/MtHi.cs
  18. 23 0
      SicboSub/Database/Database/Packg.cs
  19. 31 0
      SicboSub/Database/Database/PaymentChannel.cs
  20. 27 0
      SicboSub/Database/Database/PaymentTransaction.cs
  21. 21 0
      SicboSub/Database/Database/PaymentTransactionLog.cs
  22. 17 0
      SicboSub/Database/Database/PotInfo.cs
  23. 25 0
      SicboSub/Database/Database/RankingConfig.cs
  24. 21 0
      SicboSub/Database/Database/RankingHistory.cs
  25. 25 0
      SicboSub/Database/Database/RankingRewardLog.cs
  26. 39 0
      SicboSub/Database/Database/RegInfo.cs
  27. 19 0
      SicboSub/Database/Database/Room.cs
  28. 21 0
      SicboSub/Database/Database/RoomPrize.cs
  29. 39 0
      SicboSub/Database/Database/RoomResult.cs
  30. 15 0
      SicboSub/Database/Database/ToolConfig.cs
  31. 23 0
      SicboSub/Database/Database/ToolPayment.cs
  32. 21 0
      SicboSub/Database/Database/ToolPlayHistory.cs
  33. 31 0
      SicboSub/Database/Database/ToolReport.cs
  34. 19 0
      SicboSub/Database/Database/ToolScheduler.cs
  35. 27 0
      SicboSub/Database/Database/ToolSim.cs
  36. 27 0
      SicboSub/Database/Database/UserTransaction.cs
  37. 23 0
      SicboSub/Database/Database/Webservice.cs
  38. 15 0
      SicboSub/Database/Database/WsUser.cs
  39. 0 33
      SicboSub/SicboSub.Api/Controllers/WeatherForecastController.cs
  40. 4 0
      SicboSub/SicboSub.Api/SicboSub.Api.csproj
  41. 15 0
      SicboSub/SicboSub.Api/appsettings.json
  42. 66 0
      SicboSub/SicboSub.StartProcedure/Program.cs
  43. 149 0
      SicboSub/SicboSub.StartProcedure/RankingService.cs
  44. 17 0
      SicboSub/SicboSub.StartProcedure/SicboSub.StartProcedure.csproj
  45. 5 0
      SicboSub/SicboSub.StartProcedure/appsettings.json
  46. 25 0
      SicboSub/SicboSub.Web/Controllers/HomeController.cs
  47. 62 0
      SicboSub/SicboSub.Web/Views/Home/Account.cshtml
  48. 93 0
      SicboSub/SicboSub.Web/Views/Home/DailyRanking.cshtml
  49. 147 0
      SicboSub/SicboSub.Web/Views/Home/History.cshtml
  50. 83 5
      SicboSub/SicboSub.Web/Views/Home/Index.cshtml
  51. 93 0
      SicboSub/SicboSub.Web/Views/Home/MonthlyRanking.cshtml
  52. 73 0
      SicboSub/SicboSub.Web/Views/Home/Winner.cshtml
  53. 15 0
      SicboSub/SicboSub.Web/Views/Shared/_GameLayout.cshtml
  54. 37 0
      SicboSub/SicboSub.Web/Views/Shared/_GameMenu.cshtml
  55. 137 0
      SicboSub/SicboSub.Web/wwwroot/css/sicbo-account.css
  56. 496 0
      SicboSub/SicboSub.Web/wwwroot/css/sicbo-game.css
  57. 194 0
      SicboSub/SicboSub.Web/wwwroot/css/sicbo-history.css
  58. 195 0
      SicboSub/SicboSub.Web/wwwroot/css/sicbo-ranking.css
  59. 190 0
      SicboSub/SicboSub.Web/wwwroot/css/sicbo-winner.css
  60. 21 0
      SicboSub/SicboSub.Web/wwwroot/img/003-sword.svg
  61. BIN
      SicboSub/SicboSub.Web/wwwroot/img/017-strategy.png
  62. 21 0
      SicboSub/SicboSub.Web/wwwroot/img/021-medal-2.svg
  63. 10 0
      SicboSub/SicboSub.Web/wwwroot/img/021-medal.svg
  64. 18 0
      SicboSub/SicboSub.Web/wwwroot/img/023-hourglass.svg
  65. 13 0
      SicboSub/SicboSub.Web/wwwroot/img/032-ranking.svg
  66. 20 0
      SicboSub/SicboSub.Web/wwwroot/img/037-inventory.svg
  67. BIN
      SicboSub/SicboSub.Web/wwwroot/img/042-settings.png
  68. 21 0
      SicboSub/SicboSub.Web/wwwroot/img/046-esports.svg
  69. 15 0
      SicboSub/SicboSub.Web/wwwroot/img/Frame 1244831299.svg
  70. 15 0
      SicboSub/SicboSub.Web/wwwroot/img/Frame 1244831300.svg
  71. 15 0
      SicboSub/SicboSub.Web/wwwroot/img/Frame 1244831301.svg
  72. 15 0
      SicboSub/SicboSub.Web/wwwroot/img/Frame 1244831302.svg
  73. BIN
      SicboSub/SicboSub.Web/wwwroot/img/Group.png
  74. BIN
      SicboSub/SicboSub.Web/wwwroot/img/Group1.png
  75. BIN
      SicboSub/SicboSub.Web/wwwroot/img/GroupN.png
  76. BIN
      SicboSub/SicboSub.Web/wwwroot/img/Rectangle_Blue.png
  77. BIN
      SicboSub/SicboSub.Web/wwwroot/img/Rectangle_Blue_T.png
  78. BIN
      SicboSub/SicboSub.Web/wwwroot/img/Rectangle_Red.png
  79. BIN
      SicboSub/SicboSub.Web/wwwroot/img/Rectangle_red_T.png
  80. 17 0
      SicboSub/SicboSub.Web/wwwroot/img/Vector.svg
  81. BIN
      SicboSub/SicboSub.Web/wwwroot/img/avatar.png
  82. BIN
      SicboSub/SicboSub.Web/wwwroot/img/daily-ranking.png
  83. BIN
      SicboSub/SicboSub.Web/wwwroot/img/image-1.png
  84. BIN
      SicboSub/SicboSub.Web/wwwroot/img/image-2.png
  85. BIN
      SicboSub/SicboSub.Web/wwwroot/img/monthly-ranking.png
  86. 3 0
      SicboSub/SicboSub.Web/wwwroot/img/rectangle-314.svg
  87. 3 0
      SicboSub/SicboSub.Web/wwwroot/img/rectangle-315.svg
  88. 3 0
      SicboSub/SicboSub.Web/wwwroot/img/rectangle-316.svg
  89. 3 0
      SicboSub/SicboSub.Web/wwwroot/img/rectangle-317.svg
  90. 36 0
      SicboSub/SicboSub.sln

+ 1 - 0
.gitignore

@@ -74,3 +74,4 @@ $RECYCLE.BIN/
 
 # Common Logs
 *.log
+/SicboSubWs/SicboSubWs/nbproject/private/

+ 18 - 0
SicboSub/Database/Database.csproj

@@ -5,5 +5,23 @@
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
   </PropertyGroup>
+	<ItemGroup>
+		<PackageReference Include="Oracle.ManagedDataAccess.Core" Version="3.21.120" />
+		<PackageReference Include="Oracle.EntityFrameworkCore" Version="7.21.12" />
+		<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.12" />
+		<PackageReference Include="Microsoft.EntityFrameworkCore.Abstractions" Version="7.0.12" />
+		<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="7.0.12" />
+		<PackageReference Include="Microsoft.EntityFrameworkCore.Analyzers" Version="7.0.12" />
+		<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.12">
+			<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
+			<PrivateAssets>all</PrivateAssets>
+		</PackageReference>
+		<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.12">
+			<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
+			<PrivateAssets>all</PrivateAssets>
+		</PackageReference>
+		<PackageReference Include="Quartz" Version="3.7.0" />
+		<PackageReference Include="Quartz.Extensions.Hosting" Version="3.7.0" />
+	</ItemGroup>
 
 </Project>

+ 69 - 0
SicboSub/Database/Database/AccountUser.cs

@@ -0,0 +1,69 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class AccountUser
+{
+    public decimal Id { get; set; }
+
+    public string Msisdn { get; set; } = null!;
+
+    public string Username { get; set; } = null!;
+
+    public string Password { get; set; } = null!;
+
+    public string? Token { get; set; }
+
+    public DateTime? Birthday { get; set; }
+
+    public string? Email { get; set; }
+
+    public DateTime CreatedDate { get; set; }
+
+    public DateTime? UpdatedDate { get; set; }
+
+    public decimal? Gender { get; set; }
+
+    public string? Address { get; set; }
+
+    public decimal WinCoin { get; set; }
+
+    public decimal BetCoin { get; set; }
+
+    public decimal ResetpassCount { get; set; }
+
+    public DateTime? ResetpassTime { get; set; }
+
+    public string? ServiceId { get; set; }
+
+    public string? Channel { get; set; }
+
+    public string? Fullname { get; set; }
+
+    public string? Picture { get; set; }
+
+    public byte? Language { get; set; }
+
+    public string? Role { get; set; }
+
+    public byte? Status { get; set; }
+
+    public byte? IsActive { get; set; }
+
+    public byte? IsLock { get; set; }
+
+    public short? TotalFalse { get; set; }
+
+    public DateTime? TimeLock { get; set; }
+
+    public DateTime? LastLogin { get; set; }
+
+    public DateTime? LastUpdate { get; set; }
+
+    public int? Point { get; set; }
+
+    public int? FreeSpin { get; set; }
+
+    public int? TotalSpin { get; set; }
+}

+ 15 - 0
SicboSub/Database/Database/AppConfig.cs

@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class AppConfig
+{
+    public decimal Id { get; set; }
+
+    public string Name { get; set; } = null!;
+
+    public string Value { get; set; } = null!;
+
+    public string? Description { get; set; }
+}

+ 19 - 0
SicboSub/Database/Database/BettingHistory.cs

@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class BettingHistory
+{
+    public decimal Id { get; set; }
+
+    public string Msisdn { get; set; } = null!;
+
+    public decimal RoomId { get; set; }
+
+    public decimal BettingType { get; set; }
+
+    public decimal BettingValue { get; set; }
+
+    public DateTime BettingTime { get; set; }
+}

+ 11 - 0
SicboSub/Database/Database/Blacklist.cs

@@ -0,0 +1,11 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class Blacklist
+{
+    public decimal Id { get; set; }
+
+    public string Msisdn { get; set; } = null!;
+}

+ 23 - 0
SicboSub/Database/Database/ChargeLog.cs

@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class ChargeLog
+{
+    public decimal? Id { get; set; }
+
+    public string? Msisdn { get; set; }
+
+    public string? AccountId { get; set; }
+
+    public decimal? Fee { get; set; }
+
+    public string? Description { get; set; }
+
+    public DateTime? ChargeTime { get; set; }
+
+    public DateTime? InsertTime { get; set; }
+
+    public decimal? Status { get; set; }
+}

+ 11 - 0
SicboSub/Database/Database/ChatToolMessage.cs

@@ -0,0 +1,11 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class ChatToolMessage
+{
+    public decimal Id { get; set; }
+
+    public string Message { get; set; } = null!;
+}

+ 11 - 0
SicboSub/Database/Database/ChatToolUser.cs

@@ -0,0 +1,11 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class ChatToolUser
+{
+    public decimal Id { get; set; }
+
+    public string Msisdn { get; set; } = null!;
+}

+ 19 - 0
SicboSub/Database/Database/Config.cs

@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class Config
+{
+    public string? Module { get; set; }
+
+    public string? ParamName { get; set; }
+
+    public string? ParamValue { get; set; }
+
+    public string? ParamValueFr { get; set; }
+
+    public string? Note { get; set; }
+
+    public string? DefaultValue { get; set; }
+}

+ 21 - 0
SicboSub/Database/Database/ExchangeConfig.cs

@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class ExchangeConfig
+{
+    public decimal Id { get; set; }
+
+    public string? ProductName { get; set; }
+
+    public decimal? CoinCost { get; set; }
+
+    public decimal? MoneyReceived { get; set; }
+
+    public decimal? FeeCoin { get; set; }
+
+    public string? Description { get; set; }
+
+    public bool? IsActive { get; set; }
+}

+ 21 - 0
SicboSub/Database/Database/ExchangeHistory.cs

@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class ExchangeHistory
+{
+    public decimal? Id { get; set; }
+
+    public string? Msisdn { get; set; }
+
+    public decimal? ConfigId { get; set; }
+
+    public decimal? CoinDeducted { get; set; }
+
+    public decimal? MoneyAdded { get; set; }
+
+    public DateTime? ExchangeTime { get; set; }
+
+    public byte? Status { get; set; }
+}

+ 15 - 0
SicboSub/Database/Database/LogChat.cs

@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class LogChat
+{
+    public decimal Id { get; set; }
+
+    public string Msisdn { get; set; } = null!;
+
+    public string Message { get; set; } = null!;
+
+    public DateTime ChatTime { get; set; }
+}

+ 1396 - 0
SicboSub/Database/Database/ModelContext.cs

@@ -0,0 +1,1396 @@
+using System;
+using System.Collections.Generic;
+using Microsoft.EntityFrameworkCore;
+
+namespace Database.Database;
+
+public partial class ModelContext : DbContext
+{
+    public ModelContext()
+    {
+    }
+
+    public ModelContext(DbContextOptions<ModelContext> options)
+        : base(options)
+    {
+    }
+
+    public virtual DbSet<AccountUser> AccountUsers { get; set; }
+
+    public virtual DbSet<AppConfig> AppConfigs { get; set; }
+
+    public virtual DbSet<BettingHistory> BettingHistories { get; set; }
+
+    public virtual DbSet<Blacklist> Blacklists { get; set; }
+
+    public virtual DbSet<ChargeLog> ChargeLogs { get; set; }
+
+    public virtual DbSet<ChatToolMessage> ChatToolMessages { get; set; }
+
+    public virtual DbSet<ChatToolUser> ChatToolUsers { get; set; }
+
+    public virtual DbSet<Config> Configs { get; set; }
+
+    public virtual DbSet<ExchangeConfig> ExchangeConfigs { get; set; }
+
+    public virtual DbSet<ExchangeHistory> ExchangeHistories { get; set; }
+
+    public virtual DbSet<LogChat> LogChats { get; set; }
+
+    public virtual DbSet<MpsConfig> MpsConfigs { get; set; }
+
+    public virtual DbSet<Mt> Mts { get; set; }
+
+    public virtual DbSet<MtHi> MtHis { get; set; }
+
+    public virtual DbSet<Packg> Packgs { get; set; }
+
+    public virtual DbSet<PaymentChannel> PaymentChannels { get; set; }
+
+    public virtual DbSet<PaymentTransaction> PaymentTransactions { get; set; }
+
+    public virtual DbSet<PaymentTransactionLog> PaymentTransactionLogs { get; set; }
+
+    public virtual DbSet<PotInfo> PotInfos { get; set; }
+
+    public virtual DbSet<RankingConfig> RankingConfigs { get; set; }
+
+    public virtual DbSet<RankingHistory> RankingHistories { get; set; }
+
+    public virtual DbSet<RankingRewardLog> RankingRewardLogs { get; set; }
+
+    public virtual DbSet<RegInfo> RegInfos { get; set; }
+
+    public virtual DbSet<Room> Rooms { get; set; }
+
+    public virtual DbSet<RoomPrize> RoomPrizes { get; set; }
+
+    public virtual DbSet<RoomResult> RoomResults { get; set; }
+
+    public virtual DbSet<ToolConfig> ToolConfigs { get; set; }
+
+    public virtual DbSet<ToolPayment> ToolPayments { get; set; }
+
+    public virtual DbSet<ToolPlayHistory> ToolPlayHistories { get; set; }
+
+    public virtual DbSet<ToolReport> ToolReports { get; set; }
+
+    public virtual DbSet<ToolScheduler> ToolSchedulers { get; set; }
+
+    public virtual DbSet<ToolSim> ToolSims { get; set; }
+
+    public virtual DbSet<UserTransaction> UserTransactions { get; set; }
+
+    public virtual DbSet<Webservice> Webservices { get; set; }
+
+    public virtual DbSet<WsUser> WsUsers { get; set; }
+
+   
+    protected override void OnModelCreating(ModelBuilder modelBuilder)
+    {
+        modelBuilder
+            .HasDefaultSchema("SICBO")
+            .UseCollation("USING_NLS_COMP");
+
+        modelBuilder.Entity<AccountUser>(entity =>
+        {
+            entity.HasKey(e => e.Id).HasName("ACCOUNT_USER_PK");
+
+            entity.ToTable("ACCOUNT_USER");
+
+            entity.Property(e => e.Id)
+                .HasColumnType("NUMBER")
+                .HasColumnName("ID");
+            entity.Property(e => e.Address)
+                .HasMaxLength(1000)
+                .IsUnicode(false)
+                .HasColumnName("ADDRESS");
+            entity.Property(e => e.BetCoin)
+                .HasDefaultValueSql("0 ")
+                .HasColumnType("NUMBER")
+                .HasColumnName("BET_COIN");
+            entity.Property(e => e.Birthday)
+                .HasColumnType("DATE")
+                .HasColumnName("BIRTHDAY");
+            entity.Property(e => e.Channel)
+                .HasMaxLength(1000)
+                .IsUnicode(false)
+                .HasDefaultValueSql("'USSD'")
+                .HasColumnName("CHANNEL");
+            entity.Property(e => e.CreatedDate)
+                .HasDefaultValueSql("sysdate ")
+                .HasColumnType("DATE")
+                .HasColumnName("CREATED_DATE");
+            entity.Property(e => e.Email)
+                .HasMaxLength(200)
+                .IsUnicode(false)
+                .HasColumnName("EMAIL");
+            entity.Property(e => e.FreeSpin)
+                .HasPrecision(10)
+                .HasDefaultValueSql("0")
+                .HasColumnName("FREE_SPIN");
+            entity.Property(e => e.Fullname)
+                .HasMaxLength(255)
+                .IsUnicode(false)
+                .HasDefaultValueSql("'default'")
+                .HasColumnName("FULLNAME");
+            entity.Property(e => e.Gender)
+                .HasColumnType("NUMBER")
+                .HasColumnName("GENDER");
+            entity.Property(e => e.IsActive)
+                .HasPrecision(2)
+                .HasDefaultValueSql("1")
+                .HasColumnName("IS_ACTIVE");
+            entity.Property(e => e.IsLock)
+                .HasPrecision(2)
+                .HasDefaultValueSql("0")
+                .HasColumnName("IS_LOCK");
+            entity.Property(e => e.Language)
+                .HasPrecision(2)
+                .HasDefaultValueSql("1")
+                .HasColumnName("LANGUAGE");
+            entity.Property(e => e.LastLogin)
+                .HasDefaultValueSql("sysdate")
+                .HasColumnType("DATE")
+                .HasColumnName("LAST_LOGIN");
+            entity.Property(e => e.LastUpdate)
+                .HasDefaultValueSql("sysdate")
+                .HasColumnType("DATE")
+                .HasColumnName("LAST_UPDATE");
+            entity.Property(e => e.Msisdn)
+                .HasMaxLength(20)
+                .IsUnicode(false)
+                .HasColumnName("MSISDN");
+            entity.Property(e => e.Password)
+                .HasMaxLength(200)
+                .IsUnicode(false)
+                .HasColumnName("PASSWORD");
+            entity.Property(e => e.Picture)
+                .HasMaxLength(500)
+                .IsUnicode(false)
+                .HasDefaultValueSql("'default.png'")
+                .HasColumnName("PICTURE");
+            entity.Property(e => e.Point)
+                .HasPrecision(10)
+                .HasDefaultValueSql("0")
+                .HasColumnName("POINT");
+            entity.Property(e => e.ResetpassCount)
+                .HasDefaultValueSql("0 ")
+                .HasColumnType("NUMBER")
+                .HasColumnName("RESETPASS_COUNT");
+            entity.Property(e => e.ResetpassTime)
+                .HasColumnType("DATE")
+                .HasColumnName("RESETPASS_TIME");
+            entity.Property(e => e.Role)
+                .HasMaxLength(100)
+                .IsUnicode(false)
+                .HasDefaultValueSql("'USER'")
+                .HasColumnName("ROLE");
+            entity.Property(e => e.ServiceId)
+                .HasMaxLength(255)
+                .IsUnicode(false)
+                .HasColumnName("SERVICE_ID");
+            entity.Property(e => e.Status)
+                .HasPrecision(2)
+                .HasDefaultValueSql("1")
+                .HasColumnName("STATUS");
+            entity.Property(e => e.TimeLock)
+                .HasColumnType("DATE")
+                .HasColumnName("TIME_LOCK");
+            entity.Property(e => e.Token)
+                .HasMaxLength(2000)
+                .IsUnicode(false)
+                .HasColumnName("TOKEN");
+            entity.Property(e => e.TotalFalse)
+                .HasPrecision(5)
+                .HasDefaultValueSql("0")
+                .HasColumnName("TOTAL_FALSE");
+            entity.Property(e => e.TotalSpin)
+                .HasPrecision(10)
+                .HasDefaultValueSql("0\n")
+                .HasColumnName("TOTAL_SPIN");
+            entity.Property(e => e.UpdatedDate)
+                .HasColumnType("DATE")
+                .HasColumnName("UPDATED_DATE");
+            entity.Property(e => e.Username)
+                .HasMaxLength(200)
+                .IsUnicode(false)
+                .HasColumnName("USERNAME");
+            entity.Property(e => e.WinCoin)
+                .HasDefaultValueSql("0 ")
+                .HasColumnType("NUMBER")
+                .HasColumnName("WIN_COIN");
+        });
+
+        modelBuilder.Entity<AppConfig>(entity =>
+        {
+            entity.HasKey(e => e.Id).HasName("APP_CONFIG_PK");
+
+            entity.ToTable("APP_CONFIG");
+
+            entity.Property(e => e.Id)
+                .HasColumnType("NUMBER")
+                .HasColumnName("ID");
+            entity.Property(e => e.Description)
+                .HasMaxLength(2000)
+                .IsUnicode(false)
+                .HasColumnName("DESCRIPTION");
+            entity.Property(e => e.Name)
+                .HasMaxLength(200)
+                .IsUnicode(false)
+                .HasColumnName("NAME");
+            entity.Property(e => e.Value)
+                .HasMaxLength(2000)
+                .IsUnicode(false)
+                .HasColumnName("VALUE");
+        });
+
+        modelBuilder.Entity<BettingHistory>(entity =>
+        {
+            entity.HasKey(e => e.Id).HasName("BETTING_HISTORY_PK");
+
+            entity.ToTable("BETTING_HISTORY");
+
+            entity.Property(e => e.Id)
+                .HasColumnType("NUMBER")
+                .HasColumnName("ID");
+            entity.Property(e => e.BettingTime)
+                .HasDefaultValueSql("sysdate ")
+                .HasColumnType("DATE")
+                .HasColumnName("BETTING_TIME");
+            entity.Property(e => e.BettingType)
+                .HasColumnType("NUMBER")
+                .HasColumnName("BETTING_TYPE");
+            entity.Property(e => e.BettingValue)
+                .HasColumnType("NUMBER")
+                .HasColumnName("BETTING_VALUE");
+            entity.Property(e => e.Msisdn)
+                .HasMaxLength(20)
+                .IsUnicode(false)
+                .HasColumnName("MSISDN");
+            entity.Property(e => e.RoomId)
+                .HasColumnType("NUMBER")
+                .HasColumnName("ROOM_ID");
+        });
+
+        modelBuilder.Entity<Blacklist>(entity =>
+        {
+            entity.HasKey(e => e.Id).HasName("BLACKLIST_PK");
+
+            entity.ToTable("BLACKLIST");
+
+            entity.Property(e => e.Id)
+                .HasColumnType("NUMBER")
+                .HasColumnName("ID");
+            entity.Property(e => e.Msisdn)
+                .HasMaxLength(20)
+                .IsUnicode(false)
+                .HasColumnName("MSISDN");
+        });
+
+        modelBuilder.Entity<ChargeLog>(entity =>
+        {
+            entity
+                .HasNoKey()
+                .ToTable("CHARGE_LOG");
+
+            entity.Property(e => e.AccountId)
+                .HasMaxLength(255)
+                .IsUnicode(false)
+                .HasColumnName("ACCOUNT_ID");
+            entity.Property(e => e.ChargeTime)
+                .HasDefaultValueSql("sysdate")
+                .HasColumnType("DATE")
+                .HasColumnName("CHARGE_TIME");
+            entity.Property(e => e.Description)
+                .HasColumnType("CLOB")
+                .HasColumnName("DESCRIPTION");
+            entity.Property(e => e.Fee)
+                .HasColumnType("NUMBER(12,2)")
+                .HasColumnName("FEE");
+            entity.Property(e => e.Id)
+                .HasColumnType("NUMBER")
+                .HasColumnName("ID");
+            entity.Property(e => e.InsertTime)
+                .HasDefaultValueSql("sysdate")
+                .HasColumnType("DATE")
+                .HasColumnName("INSERT_TIME");
+            entity.Property(e => e.Msisdn)
+                .HasMaxLength(255)
+                .IsUnicode(false)
+                .HasColumnName("MSISDN");
+            entity.Property(e => e.Status)
+                .HasColumnType("NUMBER")
+                .HasColumnName("STATUS");
+        });
+
+        modelBuilder.Entity<ChatToolMessage>(entity =>
+        {
+            entity.HasKey(e => e.Id).HasName("CHAT_TOOL_MESSAGE_PK");
+
+            entity.ToTable("CHAT_TOOL_MESSAGE");
+
+            entity.Property(e => e.Id)
+                .HasColumnType("NUMBER")
+                .HasColumnName("ID");
+            entity.Property(e => e.Message)
+                .HasMaxLength(2000)
+                .IsUnicode(false)
+                .HasColumnName("MESSAGE");
+        });
+
+        modelBuilder.Entity<ChatToolUser>(entity =>
+        {
+            entity.HasKey(e => e.Id).HasName("CHAT_TOOL_USER_PK");
+
+            entity.ToTable("CHAT_TOOL_USER");
+
+            entity.Property(e => e.Id)
+                .HasColumnType("NUMBER")
+                .HasColumnName("ID");
+            entity.Property(e => e.Msisdn)
+                .HasMaxLength(20)
+                .IsUnicode(false)
+                .HasColumnName("MSISDN");
+        });
+
+        modelBuilder.Entity<Config>(entity =>
+        {
+            entity
+                .HasNoKey()
+                .ToTable("CONFIG");
+
+            entity.Property(e => e.DefaultValue)
+                .IsUnicode(false)
+                .HasColumnName("DEFAULT_VALUE");
+            entity.Property(e => e.Module)
+                .HasMaxLength(100)
+                .HasColumnName("MODULE");
+            entity.Property(e => e.Note)
+                .HasMaxLength(1024)
+                .HasColumnName("NOTE");
+            entity.Property(e => e.ParamName)
+                .HasMaxLength(50)
+                .HasColumnName("PARAM_NAME");
+            entity.Property(e => e.ParamValue)
+                .HasMaxLength(1024)
+                .HasColumnName("PARAM_VALUE");
+            entity.Property(e => e.ParamValueFr)
+                .HasMaxLength(1024)
+                .HasColumnName("PARAM_VALUE_FR");
+        });
+
+        modelBuilder.Entity<ExchangeConfig>(entity =>
+        {
+            entity.HasKey(e => e.Id).HasName("EXCHANGE_CONFIG_PK");
+
+            entity.ToTable("EXCHANGE_CONFIG");
+
+            entity.Property(e => e.Id)
+                .HasColumnType("NUMBER")
+                .HasColumnName("ID");
+            entity.Property(e => e.CoinCost)
+                .HasColumnType("NUMBER")
+                .HasColumnName("COIN_COST");
+            entity.Property(e => e.Description)
+                .HasMaxLength(500)
+                .IsUnicode(false)
+                .HasColumnName("DESCRIPTION");
+            entity.Property(e => e.FeeCoin)
+                .HasDefaultValueSql("0")
+                .HasColumnType("NUMBER")
+                .HasColumnName("FEE_COIN");
+            entity.Property(e => e.IsActive)
+                .HasPrecision(1)
+                .HasDefaultValueSql("1\n   ")
+                .HasColumnName("IS_ACTIVE");
+            entity.Property(e => e.MoneyReceived)
+                .HasColumnType("NUMBER")
+                .HasColumnName("MONEY_RECEIVED");
+            entity.Property(e => e.ProductName)
+                .HasMaxLength(100)
+                .IsUnicode(false)
+                .HasColumnName("PRODUCT_NAME");
+        });
+
+        modelBuilder.Entity<ExchangeHistory>(entity =>
+        {
+            entity
+                .HasNoKey()
+                .ToTable("EXCHANGE_HISTORY");
+
+            entity.HasIndex(e => new { e.Msisdn, e.ExchangeTime }, "EXCHANGE_HISTORY_IDX_DATE");
+
+            entity.Property(e => e.CoinDeducted)
+                .HasColumnType("NUMBER")
+                .HasColumnName("COIN_DEDUCTED");
+            entity.Property(e => e.ConfigId)
+                .HasColumnType("NUMBER")
+                .HasColumnName("CONFIG_ID");
+            entity.Property(e => e.ExchangeTime)
+                .HasDefaultValueSql("sysdate")
+                .HasColumnType("DATE")
+                .HasColumnName("EXCHANGE_TIME");
+            entity.Property(e => e.Id)
+                .HasColumnType("NUMBER")
+                .HasColumnName("ID");
+            entity.Property(e => e.MoneyAdded)
+                .HasColumnType("NUMBER")
+                .HasColumnName("MONEY_ADDED");
+            entity.Property(e => e.Msisdn)
+                .HasMaxLength(20)
+                .IsUnicode(false)
+                .HasColumnName("MSISDN");
+            entity.Property(e => e.Status)
+                .HasPrecision(2)
+                .HasDefaultValueSql("1  -- 1: Success\n   ")
+                .HasColumnName("STATUS");
+        });
+
+        modelBuilder.Entity<LogChat>(entity =>
+        {
+            entity.HasKey(e => e.Id).HasName("LOG_CHAT_PK");
+
+            entity.ToTable("LOG_CHAT");
+
+            entity.Property(e => e.Id)
+                .HasColumnType("NUMBER")
+                .HasColumnName("ID");
+            entity.Property(e => e.ChatTime)
+                .HasDefaultValueSql("sysdate ")
+                .HasColumnType("DATE")
+                .HasColumnName("CHAT_TIME");
+            entity.Property(e => e.Message)
+                .HasMaxLength(2000)
+                .IsUnicode(false)
+                .HasColumnName("MESSAGE");
+            entity.Property(e => e.Msisdn)
+                .HasMaxLength(20)
+                .IsUnicode(false)
+                .HasColumnName("MSISDN");
+        });
+
+        modelBuilder.Entity<MpsConfig>(entity =>
+        {
+            entity
+                .HasNoKey()
+                .ToTable("MPS_CONFIG");
+
+            entity.Property(e => e.ActionCode)
+                .HasMaxLength(200)
+                .IsUnicode(false)
+                .HasColumnName("ACTION_CODE");
+            entity.Property(e => e.Category)
+                .HasMaxLength(100)
+                .IsUnicode(false)
+                .HasColumnName("CATEGORY");
+            entity.Property(e => e.Command)
+                .HasMaxLength(100)
+                .IsUnicode(false)
+                .HasColumnName("COMMAND");
+            entity.Property(e => e.CpName)
+                .HasMaxLength(100)
+                .IsUnicode(false)
+                .HasColumnName("CP_NAME");
+            entity.Property(e => e.KeyPath)
+                .HasMaxLength(200)
+                .IsUnicode(false)
+                .HasColumnName("KEY_PATH");
+            entity.Property(e => e.Price)
+                .HasMaxLength(100)
+                .IsUnicode(false)
+                .HasColumnName("PRICE");
+            entity.Property(e => e.Service)
+                .HasMaxLength(100)
+                .IsUnicode(false)
+                .HasColumnName("SERVICE");
+            entity.Property(e => e.SubService)
+                .HasMaxLength(100)
+                .IsUnicode(false)
+                .HasColumnName("SUB_SERVICE");
+        });
+
+        modelBuilder.Entity<Mt>(entity =>
+        {
+            entity.HasKey(e => e.MtId).HasName("MT_PK");
+
+            entity.ToTable("MT");
+
+            entity.Property(e => e.MtId)
+                .HasColumnType("NUMBER")
+                .HasColumnName("MT_ID");
+            entity.Property(e => e.Channel)
+                .HasMaxLength(10)
+                .IsUnicode(false)
+                .HasColumnName("CHANNEL");
+            entity.Property(e => e.Message).HasColumnName("MESSAGE");
+            entity.Property(e => e.MoHisId)
+                .HasColumnType("NUMBER")
+                .HasColumnName("MO_HIS_ID");
+            entity.Property(e => e.Msisdn)
+                .HasMaxLength(20)
+                .IsUnicode(false)
+                .HasColumnName("MSISDN");
+            entity.Property(e => e.ReceiveTime)
+                .HasColumnType("DATE")
+                .HasColumnName("RECEIVE_TIME");
+            entity.Property(e => e.RetryNum)
+                .HasPrecision(2)
+                .HasDefaultValueSql("0")
+                .HasColumnName("RETRY_NUM");
+        });
+
+        modelBuilder.Entity<MtHi>(entity =>
+        {
+            entity
+                .HasNoKey()
+                .ToTable("MT_HIS");
+
+            entity.Property(e => e.Channel)
+                .HasMaxLength(20)
+                .IsUnicode(false)
+                .HasColumnName("CHANNEL");
+            entity.Property(e => e.ClusterName)
+                .HasMaxLength(80)
+                .IsUnicode(false)
+                .HasColumnName("CLUSTER_NAME");
+            entity.Property(e => e.Message)
+                .IsUnicode(false)
+                .HasColumnName("MESSAGE");
+            entity.Property(e => e.MoHisId)
+                .HasPrecision(10)
+                .HasColumnName("MO_HIS_ID");
+            entity.Property(e => e.Msisdn)
+                .HasMaxLength(15)
+                .IsUnicode(false)
+                .HasColumnName("MSISDN");
+            entity.Property(e => e.MtHisId)
+                .HasPrecision(10)
+                .HasColumnName("MT_HIS_ID");
+            entity.Property(e => e.NodeName)
+                .HasMaxLength(80)
+                .IsUnicode(false)
+                .HasColumnName("NODE_NAME");
+            entity.Property(e => e.ReceiveTime)
+                .HasColumnType("DATE")
+                .HasColumnName("RECEIVE_TIME");
+            entity.Property(e => e.SentTime)
+                .HasColumnType("DATE")
+                .HasColumnName("SENT_TIME");
+            entity.Property(e => e.Status)
+                .HasPrecision(1)
+                .HasColumnName("STATUS");
+        });
+
+        modelBuilder.Entity<Packg>(entity =>
+        {
+            entity
+                .HasNoKey()
+                .ToTable("PACKG");
+
+            entity.Property(e => e.BizId)
+                .HasPrecision(5)
+                .HasColumnName("BIZ_ID");
+            entity.Property(e => e.ExpireDays)
+                .HasPrecision(5)
+                .HasColumnName("EXPIRE_DAYS");
+            entity.Property(e => e.Fee)
+                .HasColumnType("NUMBER(12,2)")
+                .HasColumnName("FEE");
+            entity.Property(e => e.NumberSpin)
+                .HasPrecision(5)
+                .HasColumnName("NUMBER_SPIN");
+            entity.Property(e => e.ProductId)
+                .HasPrecision(10)
+                .HasColumnName("PRODUCT_ID");
+            entity.Property(e => e.ProductName)
+                .HasMaxLength(100)
+                .IsUnicode(false)
+                .HasColumnName("PRODUCT_NAME");
+            entity.Property(e => e.Renew)
+                .HasPrecision(2)
+                .HasDefaultValueSql("0\n   ")
+                .HasColumnName("RENEW");
+            entity.Property(e => e.SmsSyntax)
+                .HasMaxLength(100)
+                .IsUnicode(false)
+                .HasColumnName("SMS_SYNTAX");
+        });
+
+        modelBuilder.Entity<PaymentChannel>(entity =>
+        {
+            entity.HasKey(e => e.Id).HasName("PAYMENT_CHANNEL_PK");
+
+            entity.ToTable("PAYMENT_CHANNEL");
+
+            entity.Property(e => e.Id)
+                .HasColumnType("NUMBER")
+                .HasColumnName("ID");
+            entity.Property(e => e.CreatedDate)
+                .HasDefaultValueSql("sysdate ")
+                .HasColumnType("DATE")
+                .HasColumnName("CREATED_DATE");
+            entity.Property(e => e.CurrentCode)
+                .HasMaxLength(20)
+                .IsUnicode(false)
+                .HasColumnName("CURRENT_CODE");
+            entity.Property(e => e.Description)
+                .HasMaxLength(1000)
+                .IsUnicode(false)
+                .HasColumnName("DESCRIPTION");
+            entity.Property(e => e.FromDate)
+                .HasColumnType("DATE")
+                .HasColumnName("FROM_DATE");
+            entity.Property(e => e.Name)
+                .HasMaxLength(200)
+                .IsUnicode(false)
+                .HasColumnName("NAME");
+            entity.Property(e => e.PayType)
+                .HasMaxLength(20)
+                .IsUnicode(false)
+                .HasColumnName("PAY_TYPE");
+            entity.Property(e => e.ProviderName)
+                .HasMaxLength(200)
+                .IsUnicode(false)
+                .HasColumnName("PROVIDER_NAME");
+            entity.Property(e => e.Status)
+                .HasDefaultValueSql("1 ")
+                .HasColumnType("NUMBER")
+                .HasColumnName("STATUS");
+            entity.Property(e => e.ToDate)
+                .HasColumnType("DATE")
+                .HasColumnName("TO_DATE");
+            entity.Property(e => e.Type)
+                .HasMaxLength(20)
+                .IsUnicode(false)
+                .HasColumnName("TYPE");
+            entity.Property(e => e.UpdatedDate)
+                .HasColumnType("DATE")
+                .HasColumnName("UPDATED_DATE");
+        });
+
+        modelBuilder.Entity<PaymentTransaction>(entity =>
+        {
+            entity.HasKey(e => e.Id).HasName("PAYMENT_TRANSACTION_PK");
+
+            entity.ToTable("PAYMENT_TRANSACTION");
+
+            entity.Property(e => e.Id)
+                .HasColumnType("NUMBER")
+                .HasColumnName("ID");
+            entity.Property(e => e.Discount)
+                .HasDefaultValueSql("0 ")
+                .HasColumnType("NUMBER")
+                .HasColumnName("DISCOUNT");
+            entity.Property(e => e.Money)
+                .HasColumnType("NUMBER")
+                .HasColumnName("MONEY");
+            entity.Property(e => e.Msisdn)
+                .HasMaxLength(20)
+                .IsUnicode(false)
+                .HasColumnName("MSISDN");
+            entity.Property(e => e.PartnerTransactionId)
+                .HasMaxLength(100)
+                .IsUnicode(false)
+                .HasColumnName("PARTNER_TRANSACTION_ID");
+            entity.Property(e => e.PaymentChannelId)
+                .HasColumnType("NUMBER")
+                .HasColumnName("PAYMENT_CHANNEL_ID");
+            entity.Property(e => e.PaymentTransactionId)
+                .HasMaxLength(100)
+                .IsUnicode(false)
+                .HasColumnName("PAYMENT_TRANSACTION_ID");
+            entity.Property(e => e.Status)
+                .HasColumnType("NUMBER")
+                .HasColumnName("STATUS");
+            entity.Property(e => e.TimePayment)
+                .HasColumnType("DATE")
+                .HasColumnName("TIME_PAYMENT");
+            entity.Property(e => e.Type)
+                .HasMaxLength(20)
+                .IsUnicode(false)
+                .HasColumnName("TYPE");
+        });
+
+        modelBuilder.Entity<PaymentTransactionLog>(entity =>
+        {
+            entity.HasKey(e => e.Id).HasName("PAYMENT_TRANSACTION_LOG_PK");
+
+            entity.ToTable("PAYMENT_TRANSACTION_LOG");
+
+            entity.Property(e => e.Id)
+                .HasColumnType("NUMBER")
+                .HasColumnName("ID");
+            entity.Property(e => e.PaymentTransactionId)
+                .HasColumnType("NUMBER")
+                .HasColumnName("PAYMENT_TRANSACTION_ID");
+            entity.Property(e => e.ReponseTime)
+                .HasColumnType("DATE")
+                .HasColumnName("REPONSE_TIME");
+            entity.Property(e => e.RequestBody)
+                .HasMaxLength(2000)
+                .IsUnicode(false)
+                .HasColumnName("REQUEST_BODY");
+            entity.Property(e => e.RequestTime)
+                .HasColumnType("DATE")
+                .HasColumnName("REQUEST_TIME");
+            entity.Property(e => e.ResponseBody)
+                .HasMaxLength(2000)
+                .IsUnicode(false)
+                .HasColumnName("RESPONSE_BODY");
+            entity.Property(e => e.Url)
+                .HasMaxLength(200)
+                .IsUnicode(false)
+                .HasColumnName("URL");
+        });
+
+        modelBuilder.Entity<PotInfo>(entity =>
+        {
+            entity.HasKey(e => e.Id).HasName("POT_MANAGER_PK");
+
+            entity.ToTable("POT_INFO");
+
+            entity.Property(e => e.Id)
+                .HasColumnType("NUMBER")
+                .HasColumnName("ID");
+            entity.Property(e => e.LastUpdate)
+                .HasColumnType("DATE")
+                .HasColumnName("LAST_UPDATE");
+            entity.Property(e => e.Revenue)
+                .HasDefaultValueSql("0 ")
+                .HasColumnType("NUMBER")
+                .HasColumnName("REVENUE");
+            entity.Property(e => e.Reward)
+                .HasDefaultValueSql("0 ")
+                .HasColumnType("NUMBER")
+                .HasColumnName("REWARD");
+            entity.Property(e => e.Status)
+                .HasDefaultValueSql("1 ")
+                .HasColumnType("NUMBER")
+                .HasColumnName("STATUS");
+        });
+
+        modelBuilder.Entity<RankingConfig>(entity =>
+        {
+            entity.HasKey(e => e.Id).HasName("RANKING_CONFIG_PK");
+
+            entity.ToTable("RANKING_CONFIG");
+
+            entity.Property(e => e.Id)
+                .HasColumnType("NUMBER")
+                .HasColumnName("ID");
+            entity.Property(e => e.Description)
+                .HasMaxLength(500)
+                .IsUnicode(false)
+                .HasColumnName("DESCRIPTION");
+            entity.Property(e => e.IsActive)
+                .HasPrecision(1)
+                .HasDefaultValueSql("1\n   ")
+                .HasColumnName("IS_ACTIVE");
+            entity.Property(e => e.ProductId)
+                .HasPrecision(10)
+                .HasColumnName("PRODUCT_ID");
+            entity.Property(e => e.RankFrom)
+                .HasColumnType("NUMBER")
+                .HasColumnName("RANK_FROM");
+            entity.Property(e => e.RankTo)
+                .HasColumnType("NUMBER")
+                .HasColumnName("RANK_TO");
+            entity.Property(e => e.RankType)
+                .HasMaxLength(20)
+                .IsUnicode(false)
+                .HasColumnName("RANK_TYPE");
+            entity.Property(e => e.RewardUnit)
+                .HasMaxLength(20)
+                .IsUnicode(false)
+                .HasColumnName("REWARD_UNIT");
+            entity.Property(e => e.RewardValue)
+                .HasColumnType("NUMBER")
+                .HasColumnName("REWARD_VALUE");
+        });
+
+        modelBuilder.Entity<RankingHistory>(entity =>
+        {
+            entity.HasKey(e => e.Id).HasName("RANKING_HISTORY_PK");
+
+            entity.ToTable("RANKING_HISTORY");
+
+            entity.HasIndex(e => new { e.RankDate, e.RankType }, "RANKING_HISTORY_IDX_DATE");
+
+            entity.Property(e => e.Id)
+                .HasColumnType("NUMBER")
+                .HasColumnName("ID");
+            entity.Property(e => e.CreatedDate)
+                .HasDefaultValueSql("sysdate\n   ")
+                .HasColumnType("DATE")
+                .HasColumnName("CREATED_DATE");
+            entity.Property(e => e.Msisdn)
+                .HasMaxLength(20)
+                .IsUnicode(false)
+                .HasColumnName("MSISDN");
+            entity.Property(e => e.RankDate)
+                .HasColumnType("DATE")
+                .HasColumnName("RANK_DATE");
+            entity.Property(e => e.RankPosition)
+                .HasColumnType("NUMBER")
+                .HasColumnName("RANK_POSITION");
+            entity.Property(e => e.RankType)
+                .HasMaxLength(20)
+                .IsUnicode(false)
+                .HasColumnName("RANK_TYPE");
+            entity.Property(e => e.TotalBetValue)
+                .HasDefaultValueSql("0")
+                .HasColumnType("NUMBER")
+                .HasColumnName("TOTAL_BET_VALUE");
+        });
+
+        modelBuilder.Entity<RankingRewardLog>(entity =>
+        {
+            entity.HasKey(e => e.Id).HasName("RANKING_REWARD_LOG_PK");
+
+            entity.ToTable("RANKING_REWARD_LOG");
+
+            entity.Property(e => e.Id)
+                .HasColumnType("NUMBER")
+                .HasColumnName("ID");
+            entity.Property(e => e.CreatedDate)
+                .HasDefaultValueSql("sysdate\n   ")
+                .HasColumnType("DATE")
+                .HasColumnName("CREATED_DATE");
+            entity.Property(e => e.Msisdn)
+                .HasMaxLength(20)
+                .IsUnicode(false)
+                .HasColumnName("MSISDN");
+            entity.Property(e => e.Note)
+                .HasMaxLength(500)
+                .IsUnicode(false)
+                .HasColumnName("NOTE");
+            entity.Property(e => e.RankingHistoryId)
+                .HasColumnType("NUMBER")
+                .HasColumnName("RANKING_HISTORY_ID");
+            entity.Property(e => e.RewardDate)
+                .HasDefaultValueSql("sysdate")
+                .HasColumnType("DATE")
+                .HasColumnName("REWARD_DATE");
+            entity.Property(e => e.RewardUnit)
+                .HasMaxLength(20)
+                .IsUnicode(false)
+                .HasColumnName("REWARD_UNIT");
+            entity.Property(e => e.RewardValue)
+                .HasColumnType("NUMBER")
+                .HasColumnName("REWARD_VALUE");
+            entity.Property(e => e.Status)
+                .HasPrecision(2)
+                .HasDefaultValueSql("0")
+                .HasColumnName("STATUS");
+        });
+
+        modelBuilder.Entity<RegInfo>(entity =>
+        {
+            entity.HasKey(e => e.RegisterId).HasName("SYS_C0012857");
+
+            entity.ToTable("REG_INFO");
+
+            entity.HasIndex(e => e.Msisdn, "REG_INFO_MSISDN_IDX");
+
+            entity.Property(e => e.RegisterId)
+                .HasColumnType("NUMBER")
+                .HasColumnName("REGISTER_ID");
+            entity.Property(e => e.AlreadyCharged)
+                .HasColumnType("NUMBER(10,2)")
+                .HasColumnName("ALREADY_CHARGED");
+            entity.Property(e => e.Channel)
+                .HasMaxLength(20)
+                .IsUnicode(false)
+                .HasColumnName("CHANNEL");
+            entity.Property(e => e.EndTime)
+                .HasColumnType("DATE")
+                .HasColumnName("END_TIME");
+            entity.Property(e => e.ExpireTime)
+                .HasColumnType("DATE")
+                .HasColumnName("EXPIRE_TIME");
+            entity.Property(e => e.ExtendSpin)
+                .HasPrecision(5)
+                .HasColumnName("EXTEND_SPIN");
+            entity.Property(e => e.ExtendStatus)
+                .HasPrecision(1)
+                .HasColumnName("EXTEND_STATUS");
+            entity.Property(e => e.LastExtend)
+                .HasColumnType("DATE")
+                .HasColumnName("LAST_EXTEND");
+            entity.Property(e => e.Msisdn)
+                .HasMaxLength(20)
+                .IsUnicode(false)
+                .HasColumnName("MSISDN");
+            entity.Property(e => e.NumberSpin)
+                .HasPrecision(5)
+                .HasColumnName("NUMBER_SPIN");
+            entity.Property(e => e.PlayedTimes)
+                .HasPrecision(5)
+                .HasColumnName("PLAYED_TIMES");
+            entity.Property(e => e.ProductName)
+                .HasMaxLength(100)
+                .IsUnicode(false)
+                .HasColumnName("PRODUCT_NAME");
+            entity.Property(e => e.RegisterTime)
+                .HasColumnType("DATE")
+                .HasColumnName("REGISTER_TIME");
+            entity.Property(e => e.Renew)
+                .HasPrecision(2)
+                .HasDefaultValueSql("0")
+                .HasColumnName("RENEW");
+            entity.Property(e => e.ServiceId)
+                .HasColumnType("NUMBER(10,2)")
+                .HasColumnName("SERVICE_ID");
+            entity.Property(e => e.Status)
+                .HasPrecision(1)
+                .HasColumnName("STATUS");
+        });
+
+        modelBuilder.Entity<Room>(entity =>
+        {
+            entity.HasKey(e => e.Id).HasName("ROOM_PK");
+
+            entity.ToTable("ROOM");
+
+            entity.Property(e => e.Id)
+                .HasColumnType("NUMBER")
+                .HasColumnName("ID");
+            entity.Property(e => e.EndedTime)
+                .HasColumnType("DATE")
+                .HasColumnName("ENDED_TIME");
+            entity.Property(e => e.ResultType)
+                .HasColumnType("NUMBER")
+                .HasColumnName("RESULT_TYPE");
+            entity.Property(e => e.ResultValue)
+                .HasColumnType("NUMBER")
+                .HasColumnName("RESULT_VALUE");
+            entity.Property(e => e.StartedTime)
+                .HasColumnType("DATE")
+                .HasColumnName("STARTED_TIME");
+            entity.Property(e => e.Status)
+                .HasColumnType("NUMBER")
+                .HasColumnName("STATUS");
+        });
+
+        modelBuilder.Entity<RoomPrize>(entity =>
+        {
+            entity.HasKey(e => e.Id).HasName("USER_ROOM_PRICE_PK");
+
+            entity.ToTable("ROOM_PRIZE");
+
+            entity.Property(e => e.Id)
+                .HasColumnType("NUMBER")
+                .HasColumnName("ID");
+            entity.Property(e => e.BackCoin)
+                .HasDefaultValueSql("0 ")
+                .HasColumnType("NUMBER")
+                .HasColumnName("BACK_COIN");
+            entity.Property(e => e.Msisdn)
+                .HasMaxLength(20)
+                .IsUnicode(false)
+                .HasColumnName("MSISDN");
+            entity.Property(e => e.RoomId)
+                .HasColumnType("NUMBER")
+                .HasColumnName("ROOM_ID");
+            entity.Property(e => e.TimeCalculate)
+                .HasColumnType("DATE")
+                .HasColumnName("TIME_CALCULATE");
+            entity.Property(e => e.Type)
+                .HasColumnType("NUMBER")
+                .HasColumnName("TYPE");
+            entity.Property(e => e.WinCoin)
+                .HasColumnType("NUMBER")
+                .HasColumnName("WIN_COIN");
+        });
+
+        modelBuilder.Entity<RoomResult>(entity =>
+        {
+            entity.HasKey(e => e.Id).HasName("ROOM_RESULT_PK");
+
+            entity.ToTable("ROOM_RESULT");
+
+            entity.Property(e => e.Id)
+                .HasColumnType("NUMBER")
+                .HasColumnName("ID");
+            entity.Property(e => e.Dice1)
+                .HasColumnType("NUMBER")
+                .HasColumnName("DICE_1");
+            entity.Property(e => e.Dice2)
+                .HasColumnType("NUMBER")
+                .HasColumnName("DICE_2");
+            entity.Property(e => e.Dice3)
+                .HasColumnType("NUMBER")
+                .HasColumnName("DICE_3");
+            entity.Property(e => e.MoneyTai)
+                .HasColumnType("NUMBER")
+                .HasColumnName("MONEY_TAI");
+            entity.Property(e => e.MoneyType)
+                .HasColumnType("NUMBER")
+                .HasColumnName("MONEY_TYPE");
+            entity.Property(e => e.MoneyXiu)
+                .HasColumnType("NUMBER")
+                .HasColumnName("MONEY_XIU");
+            entity.Property(e => e.NumberTai)
+                .HasColumnType("NUMBER")
+                .HasColumnName("NUMBER_TAI");
+            entity.Property(e => e.NumberXiu)
+                .HasColumnType("NUMBER")
+                .HasColumnName("NUMBER_XIU");
+            entity.Property(e => e.RefundTai)
+                .HasColumnType("NUMBER")
+                .HasColumnName("REFUND_TAI");
+            entity.Property(e => e.RefundXiu)
+                .HasColumnType("NUMBER")
+                .HasColumnName("REFUND_XIU");
+            entity.Property(e => e.Result)
+                .HasColumnType("NUMBER")
+                .HasColumnName("RESULT");
+            entity.Property(e => e.RoomId)
+                .HasColumnType("NUMBER")
+                .HasColumnName("ROOM_ID");
+            entity.Property(e => e.TimeCalculate)
+                .HasColumnType("DATE")
+                .HasColumnName("TIME_CALCULATE");
+            entity.Property(e => e.TotalExpend)
+                .HasColumnType("NUMBER")
+                .HasColumnName("TOTAL_EXPEND");
+            entity.Property(e => e.TotalRevenue)
+                .HasColumnType("NUMBER")
+                .HasColumnName("TOTAL_REVENUE");
+        });
+
+        modelBuilder.Entity<ToolConfig>(entity =>
+        {
+            entity.HasKey(e => e.Id).HasName("TOOL_CONFIG_PK");
+
+            entity.ToTable("TOOL_CONFIG");
+
+            entity.Property(e => e.Id)
+                .HasColumnType("NUMBER")
+                .HasColumnName("ID");
+            entity.Property(e => e.Description)
+                .HasMaxLength(500)
+                .IsUnicode(false)
+                .HasColumnName("DESCRIPTION");
+            entity.Property(e => e.Name)
+                .HasMaxLength(100)
+                .IsUnicode(false)
+                .HasColumnName("NAME");
+            entity.Property(e => e.Value)
+                .HasMaxLength(200)
+                .IsUnicode(false)
+                .HasColumnName("VALUE");
+        });
+
+        modelBuilder.Entity<ToolPayment>(entity =>
+        {
+            entity.HasKey(e => e.Id).HasName("TABLE1_PK");
+
+            entity.ToTable("TOOL_PAYMENT");
+
+            entity.Property(e => e.Id)
+                .HasColumnType("NUMBER")
+                .HasColumnName("ID");
+            entity.Property(e => e.Money)
+                .HasColumnType("NUMBER")
+                .HasColumnName("MONEY");
+            entity.Property(e => e.Msisdn)
+                .HasMaxLength(20)
+                .IsUnicode(false)
+                .HasColumnName("MSISDN");
+            entity.Property(e => e.PaymentTime)
+                .HasColumnType("DATE")
+                .HasColumnName("PAYMENT_TIME");
+            entity.Property(e => e.PaymentTransactionId)
+                .HasMaxLength(200)
+                .IsUnicode(false)
+                .HasColumnName("PAYMENT_TRANSACTION_ID");
+            entity.Property(e => e.Status)
+                .HasPrecision(4)
+                .HasColumnName("STATUS");
+            entity.Property(e => e.ToolSimId)
+                .HasDefaultValueSql("NULL ")
+                .HasColumnType("NUMBER")
+                .HasColumnName("TOOL_SIM_ID");
+
+            entity.HasOne(d => d.ToolSim).WithMany(p => p.ToolPayments)
+                .HasForeignKey(d => d.ToolSimId)
+                .OnDelete(DeleteBehavior.ClientSetNull)
+                .HasConstraintName("TOOL_PAYMENT_FK1");
+        });
+
+        modelBuilder.Entity<ToolPlayHistory>(entity =>
+        {
+            entity.HasKey(e => e.Id).HasName("TOOL_PLAY_HISTORY_PK");
+
+            entity.ToTable("TOOL_PLAY_HISTORY");
+
+            entity.Property(e => e.Id)
+                .HasColumnType("NUMBER")
+                .HasColumnName("ID");
+            entity.Property(e => e.BetCoin)
+                .HasPrecision(5)
+                .HasColumnName("BET_COIN");
+            entity.Property(e => e.BetType)
+                .HasPrecision(2)
+                .HasColumnName("BET_TYPE");
+            entity.Property(e => e.Msisdn)
+                .HasMaxLength(20)
+                .IsUnicode(false)
+                .HasColumnName("MSISDN");
+            entity.Property(e => e.PlayingTime)
+                .HasColumnType("DATE")
+                .HasColumnName("PLAYING_TIME");
+            entity.Property(e => e.ToolSimId)
+                .HasDefaultValueSql("NULL ")
+                .HasColumnType("NUMBER")
+                .HasColumnName("TOOL_SIM_ID");
+
+            entity.HasOne(d => d.ToolSim).WithMany(p => p.ToolPlayHistories)
+                .HasForeignKey(d => d.ToolSimId)
+                .OnDelete(DeleteBehavior.ClientSetNull)
+                .HasConstraintName("TOOL_PLAY_HISTORY_FK1");
+        });
+
+        modelBuilder.Entity<ToolReport>(entity =>
+        {
+            entity.HasKey(e => e.Id).HasName("TOOL_REPORT_PK");
+
+            entity.ToTable("TOOL_REPORT");
+
+            entity.Property(e => e.Id)
+                .HasColumnType("NUMBER")
+                .HasColumnName("ID");
+            entity.Property(e => e.CoinBuy)
+                .HasDefaultValueSql("0 ")
+                .HasColumnType("NUMBER")
+                .HasColumnName("COIN_BUY");
+            entity.Property(e => e.CoinWin)
+                .HasDefaultValueSql("0 ")
+                .HasColumnType("NUMBER")
+                .HasColumnName("COIN_WIN");
+            entity.Property(e => e.MoneyAddFailure)
+                .HasDefaultValueSql("0 ")
+                .HasColumnType("NUMBER")
+                .HasColumnName("MONEY_ADD_FAILURE");
+            entity.Property(e => e.MoneyAddSuccess)
+                .HasDefaultValueSql("0 ")
+                .HasColumnType("NUMBER")
+                .HasColumnName("MONEY_ADD_SUCCESS");
+            entity.Property(e => e.MoneyBuyFailure)
+                .HasDefaultValueSql("0 ")
+                .HasColumnType("NUMBER")
+                .HasColumnName("MONEY_BUY_FAILURE");
+            entity.Property(e => e.MoneyBuyPlan)
+                .HasDefaultValueSql("0 ")
+                .HasColumnType("NUMBER")
+                .HasColumnName("MONEY_BUY_PLAN");
+            entity.Property(e => e.MoneyBuySuccess)
+                .HasDefaultValueSql("0 ")
+                .HasColumnType("NUMBER")
+                .HasColumnName("MONEY_BUY_SUCCESS");
+            entity.Property(e => e.PlayingTime)
+                .HasDefaultValueSql("0 ")
+                .HasColumnType("NUMBER")
+                .HasColumnName("PLAYING_TIME");
+            entity.Property(e => e.TimeReport)
+                .HasColumnType("DATE")
+                .HasColumnName("TIME_REPORT");
+            entity.Property(e => e.ToolSimId)
+                .HasColumnType("NUMBER")
+                .HasColumnName("TOOL_SIM_ID");
+            entity.Property(e => e.Type)
+                .HasMaxLength(20)
+                .IsUnicode(false)
+                .HasColumnName("TYPE");
+        });
+
+        modelBuilder.Entity<ToolScheduler>(entity =>
+        {
+            entity.HasKey(e => e.Id).HasName("TOOL_SCHEDULER_PK");
+
+            entity.ToTable("TOOL_SCHEDULER");
+
+            entity.Property(e => e.Id)
+                .HasColumnType("NUMBER")
+                .HasColumnName("ID");
+            entity.Property(e => e.DateRunning)
+                .HasMaxLength(200)
+                .IsUnicode(false)
+                .HasColumnName("DATE_RUNNING");
+            entity.Property(e => e.HourRunning)
+                .HasMaxLength(200)
+                .IsUnicode(false)
+                .HasColumnName("HOUR_RUNNING");
+            entity.Property(e => e.Money)
+                .HasDefaultValueSql("0 ")
+                .HasColumnType("NUMBER")
+                .HasColumnName("MONEY");
+            entity.Property(e => e.ToolSimId)
+                .HasColumnType("NUMBER")
+                .HasColumnName("TOOL_SIM_ID");
+
+            entity.HasOne(d => d.ToolSim).WithMany(p => p.ToolSchedulers)
+                .HasForeignKey(d => d.ToolSimId)
+                .OnDelete(DeleteBehavior.ClientSetNull)
+                .HasConstraintName("TOOL_SCHEDULER_FK1");
+        });
+
+        modelBuilder.Entity<ToolSim>(entity =>
+        {
+            entity.HasKey(e => e.Id).HasName("TOOL_MSISDN_PK");
+
+            entity.ToTable("TOOL_SIM");
+
+            entity.Property(e => e.Id)
+                .HasColumnType("NUMBER")
+                .HasColumnName("ID");
+            entity.Property(e => e.BetCoin)
+                .HasDefaultValueSql("0 ")
+                .HasColumnType("NUMBER")
+                .HasColumnName("BET_COIN");
+            entity.Property(e => e.Code)
+                .HasMaxLength(200)
+                .IsUnicode(false)
+                .HasColumnName("CODE");
+            entity.Property(e => e.Money)
+                .HasDefaultValueSql("0 ")
+                .HasColumnType("NUMBER")
+                .HasColumnName("MONEY");
+            entity.Property(e => e.Msisdn)
+                .HasMaxLength(20)
+                .IsUnicode(false)
+                .HasColumnName("MSISDN");
+            entity.Property(e => e.Status)
+                .HasPrecision(1)
+                .HasColumnName("STATUS");
+            entity.Property(e => e.WinCoin)
+                .HasDefaultValueSql("0 ")
+                .HasColumnType("NUMBER")
+                .HasColumnName("WIN_COIN");
+        });
+
+        modelBuilder.Entity<UserTransaction>(entity =>
+        {
+            entity.HasKey(e => e.Id).HasName("USER_TRANSACTION_PK");
+
+            entity.ToTable("USER_TRANSACTION");
+
+            entity.Property(e => e.Id)
+                .HasColumnType("NUMBER")
+                .HasColumnName("ID");
+            entity.Property(e => e.CreatedTime)
+                .HasColumnType("DATE")
+                .HasColumnName("CREATED_TIME");
+            entity.Property(e => e.Money)
+                .HasDefaultValueSql("0 ")
+                .HasColumnType("NUMBER")
+                .HasColumnName("MONEY");
+            entity.Property(e => e.Msisdn)
+                .HasMaxLength(20)
+                .IsUnicode(false)
+                .HasColumnName("MSISDN");
+            entity.Property(e => e.Otp)
+                .HasMaxLength(10)
+                .IsUnicode(false)
+                .HasColumnName("OTP");
+            entity.Property(e => e.PackageCode)
+                .HasMaxLength(200)
+                .IsUnicode(false)
+                .HasColumnName("PACKAGE_CODE");
+            entity.Property(e => e.PaymentChannelId)
+                .HasDefaultValueSql("0 ")
+                .HasColumnType("NUMBER")
+                .HasColumnName("PAYMENT_CHANNEL_ID");
+            entity.Property(e => e.Status)
+                .IsRequired()
+                .HasPrecision(1)
+                .HasDefaultValueSql("1 ")
+                .HasColumnName("STATUS");
+            entity.Property(e => e.TimeLeft)
+                .HasDefaultValueSql("2")
+                .HasColumnType("NUMBER")
+                .HasColumnName("TIME_LEFT");
+            entity.Property(e => e.TransactionId)
+                .HasMaxLength(200)
+                .IsUnicode(false)
+                .HasColumnName("TRANSACTION_ID");
+        });
+
+        modelBuilder.Entity<Webservice>(entity =>
+        {
+            entity.HasKey(e => e.WsId).HasName("WS_PK");
+
+            entity.ToTable("WEBSERVICE");
+
+            entity.Property(e => e.WsId)
+                .HasPrecision(10)
+                .ValueGeneratedNever()
+                .HasColumnName("WS_ID");
+            entity.Property(e => e.ErrorTag)
+                .HasMaxLength(100)
+                .IsUnicode(false)
+                .HasColumnName("ERROR_TAG");
+            entity.Property(e => e.MsgTemplate)
+                .HasMaxLength(2000)
+                .IsUnicode(false)
+                .HasColumnName("MSG_TEMPLATE");
+            entity.Property(e => e.ResponseTag)
+                .HasMaxLength(100)
+                .IsUnicode(false)
+                .HasColumnName("RESPONSE_TAG");
+            entity.Property(e => e.Status)
+                .HasPrecision(1)
+                .HasColumnName("STATUS");
+            entity.Property(e => e.WsCode)
+                .HasMaxLength(100)
+                .IsUnicode(false)
+                .HasColumnName("WS_CODE");
+            entity.Property(e => e.WsName)
+                .HasMaxLength(1000)
+                .IsUnicode(false)
+                .HasColumnName("WS_NAME");
+            entity.Property(e => e.Wsdl)
+                .HasMaxLength(1000)
+                .IsUnicode(false)
+                .HasColumnName("WSDL");
+        });
+
+        modelBuilder.Entity<WsUser>(entity =>
+        {
+            entity
+                .HasNoKey()
+                .ToTable("WS_USER");
+
+            entity.Property(e => e.IpAddress)
+                .HasMaxLength(100)
+                .IsUnicode(false)
+                .HasColumnName("IP_ADDRESS");
+            entity.Property(e => e.Password)
+                .HasMaxLength(100)
+                .IsUnicode(false)
+                .HasColumnName("PASSWORD");
+            entity.Property(e => e.Username)
+                .HasMaxLength(100)
+                .IsUnicode(false)
+                .HasColumnName("USERNAME");
+            entity.Property(e => e.WsUserId)
+                .HasPrecision(10)
+                .HasColumnName("WS_USER_ID");
+        });
+        modelBuilder.HasSequence("EXCHANGE_CONFIG_SEQ");
+        modelBuilder.HasSequence("EXCHANGE_HISTORY_SEQ");
+        modelBuilder.HasSequence("RANKING_CONFIG_SEQ");
+        modelBuilder.HasSequence("RANKING_HISTORY_SEQ");
+        modelBuilder.HasSequence("RANKING_REWARD_SEQ");
+        modelBuilder.HasSequence("TOOL_PAYMENT_SEQ");
+        modelBuilder.HasSequence("TOOL_PLAY_HISTORY_SEQ");
+        modelBuilder.HasSequence("TOOL_SCHEDULER_SEQ");
+        modelBuilder.HasSequence("TOOL_SIM_SEQ");
+
+        OnModelCreatingPartial(modelBuilder);
+    }
+
+    partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
+}

+ 23 - 0
SicboSub/Database/Database/MpsConfig.cs

@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class MpsConfig
+{
+    public string? ActionCode { get; set; }
+
+    public string? Service { get; set; }
+
+    public string? SubService { get; set; }
+
+    public string? CpName { get; set; }
+
+    public string? Command { get; set; }
+
+    public string? Category { get; set; }
+
+    public string? Price { get; set; }
+
+    public string? KeyPath { get; set; }
+}

+ 21 - 0
SicboSub/Database/Database/Mt.cs

@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class Mt
+{
+    public decimal MtId { get; set; }
+
+    public decimal? MoHisId { get; set; }
+
+    public string Msisdn { get; set; } = null!;
+
+    public string Message { get; set; } = null!;
+
+    public DateTime? ReceiveTime { get; set; }
+
+    public byte? RetryNum { get; set; }
+
+    public string Channel { get; set; } = null!;
+}

+ 27 - 0
SicboSub/Database/Database/MtHi.cs

@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class MtHi
+{
+    public int? MtHisId { get; set; }
+
+    public int? MoHisId { get; set; }
+
+    public string? Msisdn { get; set; }
+
+    public string? Message { get; set; }
+
+    public DateTime? SentTime { get; set; }
+
+    public string? NodeName { get; set; }
+
+    public string? ClusterName { get; set; }
+
+    public int? Status { get; set; }
+
+    public string? Channel { get; set; }
+
+    public DateTime? ReceiveTime { get; set; }
+}

+ 23 - 0
SicboSub/Database/Database/Packg.cs

@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class Packg
+{
+    public int? ProductId { get; set; }
+
+    public decimal? Fee { get; set; }
+
+    public short? NumberSpin { get; set; }
+
+    public string? ProductName { get; set; }
+
+    public string? SmsSyntax { get; set; }
+
+    public short? BizId { get; set; }
+
+    public short? ExpireDays { get; set; }
+
+    public byte? Renew { get; set; }
+}

+ 31 - 0
SicboSub/Database/Database/PaymentChannel.cs

@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class PaymentChannel
+{
+    public decimal Id { get; set; }
+
+    public string Name { get; set; } = null!;
+
+    public string? Description { get; set; }
+
+    public decimal Status { get; set; }
+
+    public DateTime FromDate { get; set; }
+
+    public DateTime ToDate { get; set; }
+
+    public DateTime CreatedDate { get; set; }
+
+    public DateTime? UpdatedDate { get; set; }
+
+    public string Type { get; set; } = null!;
+
+    public string? CurrentCode { get; set; }
+
+    public string? ProviderName { get; set; }
+
+    public string? PayType { get; set; }
+}

+ 27 - 0
SicboSub/Database/Database/PaymentTransaction.cs

@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class PaymentTransaction
+{
+    public decimal Id { get; set; }
+
+    public decimal? PaymentChannelId { get; set; }
+
+    public string Msisdn { get; set; } = null!;
+
+    public string PaymentTransactionId { get; set; } = null!;
+
+    public string PartnerTransactionId { get; set; } = null!;
+
+    public decimal Status { get; set; }
+
+    public DateTime TimePayment { get; set; }
+
+    public decimal Money { get; set; }
+
+    public decimal Discount { get; set; }
+
+    public string Type { get; set; } = null!;
+}

+ 21 - 0
SicboSub/Database/Database/PaymentTransactionLog.cs

@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class PaymentTransactionLog
+{
+    public decimal Id { get; set; }
+
+    public decimal PaymentTransactionId { get; set; }
+
+    public string Url { get; set; } = null!;
+
+    public string RequestBody { get; set; } = null!;
+
+    public string ResponseBody { get; set; } = null!;
+
+    public DateTime? RequestTime { get; set; }
+
+    public DateTime? ReponseTime { get; set; }
+}

+ 17 - 0
SicboSub/Database/Database/PotInfo.cs

@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class PotInfo
+{
+    public decimal Id { get; set; }
+
+    public decimal Revenue { get; set; }
+
+    public decimal Reward { get; set; }
+
+    public DateTime LastUpdate { get; set; }
+
+    public decimal Status { get; set; }
+}

+ 25 - 0
SicboSub/Database/Database/RankingConfig.cs

@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class RankingConfig
+{
+    public decimal Id { get; set; }
+
+    public decimal? RankFrom { get; set; }
+
+    public decimal? RankTo { get; set; }
+
+    public decimal? RewardValue { get; set; }
+
+    public string? RewardUnit { get; set; }
+
+    public int? ProductId { get; set; }
+
+    public string? RankType { get; set; }
+
+    public string? Description { get; set; }
+
+    public bool? IsActive { get; set; }
+}

+ 21 - 0
SicboSub/Database/Database/RankingHistory.cs

@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class RankingHistory
+{
+    public decimal Id { get; set; }
+
+    public string? Msisdn { get; set; }
+
+    public decimal? TotalBetValue { get; set; }
+
+    public string? RankType { get; set; }
+
+    public DateTime? RankDate { get; set; }
+
+    public decimal? RankPosition { get; set; }
+
+    public DateTime? CreatedDate { get; set; }
+}

+ 25 - 0
SicboSub/Database/Database/RankingRewardLog.cs

@@ -0,0 +1,25 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class RankingRewardLog
+{
+    public decimal Id { get; set; }
+
+    public string? Msisdn { get; set; }
+
+    public decimal? RankingHistoryId { get; set; }
+
+    public decimal? RewardValue { get; set; }
+
+    public string? RewardUnit { get; set; }
+
+    public DateTime? RewardDate { get; set; }
+
+    public int? Status { get; set; }
+
+    public string? Note { get; set; }
+
+    public DateTime? CreatedDate { get; set; }
+}

+ 39 - 0
SicboSub/Database/Database/RegInfo.cs

@@ -0,0 +1,39 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class RegInfo
+{
+    public decimal RegisterId { get; set; }
+
+    public string? Msisdn { get; set; }
+
+    public string? ProductName { get; set; }
+
+    public DateTime? RegisterTime { get; set; }
+
+    public short? NumberSpin { get; set; }
+
+    public short? ExtendSpin { get; set; }
+
+    public bool? ExtendStatus { get; set; }
+
+    public bool? Status { get; set; }
+
+    public DateTime? ExpireTime { get; set; }
+
+    public DateTime? LastExtend { get; set; }
+
+    public short? PlayedTimes { get; set; }
+
+    public DateTime? EndTime { get; set; }
+
+    public decimal? AlreadyCharged { get; set; }
+
+    public byte? Renew { get; set; }
+
+    public decimal? ServiceId { get; set; }
+
+    public string? Channel { get; set; }
+}

+ 19 - 0
SicboSub/Database/Database/Room.cs

@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class Room
+{
+    public decimal Id { get; set; }
+
+    public DateTime StartedTime { get; set; }
+
+    public DateTime EndedTime { get; set; }
+
+    public decimal? ResultType { get; set; }
+
+    public decimal? ResultValue { get; set; }
+
+    public decimal Status { get; set; }
+}

+ 21 - 0
SicboSub/Database/Database/RoomPrize.cs

@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class RoomPrize
+{
+    public decimal Id { get; set; }
+
+    public decimal RoomId { get; set; }
+
+    public string Msisdn { get; set; } = null!;
+
+    public decimal WinCoin { get; set; }
+
+    public decimal Type { get; set; }
+
+    public DateTime TimeCalculate { get; set; }
+
+    public decimal BackCoin { get; set; }
+}

+ 39 - 0
SicboSub/Database/Database/RoomResult.cs

@@ -0,0 +1,39 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class RoomResult
+{
+    public decimal Id { get; set; }
+
+    public decimal RoomId { get; set; }
+
+    public decimal Result { get; set; }
+
+    public decimal Dice1 { get; set; }
+
+    public decimal Dice2 { get; set; }
+
+    public decimal Dice3 { get; set; }
+
+    public DateTime TimeCalculate { get; set; }
+
+    public decimal NumberTai { get; set; }
+
+    public decimal NumberXiu { get; set; }
+
+    public decimal MoneyTai { get; set; }
+
+    public decimal MoneyXiu { get; set; }
+
+    public decimal TotalExpend { get; set; }
+
+    public decimal RefundTai { get; set; }
+
+    public decimal RefundXiu { get; set; }
+
+    public decimal TotalRevenue { get; set; }
+
+    public decimal MoneyType { get; set; }
+}

+ 15 - 0
SicboSub/Database/Database/ToolConfig.cs

@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class ToolConfig
+{
+    public decimal Id { get; set; }
+
+    public string Name { get; set; } = null!;
+
+    public string Value { get; set; } = null!;
+
+    public string? Description { get; set; }
+}

+ 23 - 0
SicboSub/Database/Database/ToolPayment.cs

@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class ToolPayment
+{
+    public decimal Id { get; set; }
+
+    public string Msisdn { get; set; } = null!;
+
+    public decimal Money { get; set; }
+
+    public byte Status { get; set; }
+
+    public DateTime PaymentTime { get; set; }
+
+    public string PaymentTransactionId { get; set; } = null!;
+
+    public decimal ToolSimId { get; set; }
+
+    public virtual ToolSim ToolSim { get; set; } = null!;
+}

+ 21 - 0
SicboSub/Database/Database/ToolPlayHistory.cs

@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class ToolPlayHistory
+{
+    public decimal Id { get; set; }
+
+    public string Msisdn { get; set; } = null!;
+
+    public DateTime PlayingTime { get; set; }
+
+    public short BetCoin { get; set; }
+
+    public byte BetType { get; set; }
+
+    public decimal ToolSimId { get; set; }
+
+    public virtual ToolSim ToolSim { get; set; } = null!;
+}

+ 31 - 0
SicboSub/Database/Database/ToolReport.cs

@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class ToolReport
+{
+    public decimal Id { get; set; }
+
+    public DateTime TimeReport { get; set; }
+
+    public decimal MoneyBuySuccess { get; set; }
+
+    public decimal MoneyBuyFailure { get; set; }
+
+    public decimal MoneyAddSuccess { get; set; }
+
+    public decimal MoneyAddFailure { get; set; }
+
+    public decimal CoinBuy { get; set; }
+
+    public decimal CoinWin { get; set; }
+
+    public decimal PlayingTime { get; set; }
+
+    public decimal MoneyBuyPlan { get; set; }
+
+    public decimal? ToolSimId { get; set; }
+
+    public string Type { get; set; } = null!;
+}

+ 19 - 0
SicboSub/Database/Database/ToolScheduler.cs

@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class ToolScheduler
+{
+    public decimal Id { get; set; }
+
+    public decimal ToolSimId { get; set; }
+
+    public decimal Money { get; set; }
+
+    public string DateRunning { get; set; } = null!;
+
+    public string HourRunning { get; set; } = null!;
+
+    public virtual ToolSim ToolSim { get; set; } = null!;
+}

+ 27 - 0
SicboSub/Database/Database/ToolSim.cs

@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class ToolSim
+{
+    public decimal Id { get; set; }
+
+    public string Msisdn { get; set; } = null!;
+
+    public bool Status { get; set; }
+
+    public decimal Money { get; set; }
+
+    public decimal BetCoin { get; set; }
+
+    public decimal WinCoin { get; set; }
+
+    public string Code { get; set; } = null!;
+
+    public virtual ICollection<ToolPayment> ToolPayments { get; set; } = new List<ToolPayment>();
+
+    public virtual ICollection<ToolPlayHistory> ToolPlayHistories { get; set; } = new List<ToolPlayHistory>();
+
+    public virtual ICollection<ToolScheduler> ToolSchedulers { get; set; } = new List<ToolScheduler>();
+}

+ 27 - 0
SicboSub/Database/Database/UserTransaction.cs

@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class UserTransaction
+{
+    public decimal Id { get; set; }
+
+    public string Msisdn { get; set; } = null!;
+
+    public string TransactionId { get; set; } = null!;
+
+    public string Otp { get; set; } = null!;
+
+    public DateTime CreatedTime { get; set; }
+
+    public decimal TimeLeft { get; set; }
+
+    public string PackageCode { get; set; } = null!;
+
+    public decimal Money { get; set; }
+
+    public decimal PaymentChannelId { get; set; }
+
+    public bool? Status { get; set; }
+}

+ 23 - 0
SicboSub/Database/Database/Webservice.cs

@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class Webservice
+{
+    public int WsId { get; set; }
+
+    public string? WsName { get; set; }
+
+    public string? WsCode { get; set; }
+
+    public string? Wsdl { get; set; }
+
+    public string? MsgTemplate { get; set; }
+
+    public bool? Status { get; set; }
+
+    public string? ResponseTag { get; set; }
+
+    public string? ErrorTag { get; set; }
+}

+ 15 - 0
SicboSub/Database/Database/WsUser.cs

@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+
+namespace Database.Database;
+
+public partial class WsUser
+{
+    public int? WsUserId { get; set; }
+
+    public string? Username { get; set; }
+
+    public string? Password { get; set; }
+
+    public string? IpAddress { get; set; }
+}

+ 0 - 33
SicboSub/SicboSub.Api/Controllers/WeatherForecastController.cs

@@ -1,33 +0,0 @@
-using Microsoft.AspNetCore.Mvc;
-
-namespace SicboSub.Api.Controllers
-{
-    [ApiController]
-    [Route("[controller]")]
-    public class WeatherForecastController : ControllerBase
-    {
-        private static readonly string[] Summaries = new[]
-        {
-            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
-        };
-
-        private readonly ILogger<WeatherForecastController> _logger;
-
-        public WeatherForecastController(ILogger<WeatherForecastController> logger)
-        {
-            _logger = logger;
-        }
-
-        [HttpGet(Name = "GetWeatherForecast")]
-        public IEnumerable<WeatherForecast> Get()
-        {
-            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
-            {
-                Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
-                TemperatureC = Random.Shared.Next(-20, 55),
-                Summary = Summaries[Random.Shared.Next(Summaries.Length)]
-            })
-            .ToArray();
-        }
-    }
-}

+ 4 - 0
SicboSub/SicboSub.Api/SicboSub.Api.csproj

@@ -10,4 +10,8 @@
     <PackageReference Include="Swashbuckle.AspNetCore" Version="6.6.2" />
   </ItemGroup>
 
+  <ItemGroup>
+    <Folder Include="Controllers\" />
+  </ItemGroup>
+
 </Project>

+ 15 - 0
SicboSub/SicboSub.Api/appsettings.json

@@ -1,4 +1,19 @@
 {
+  "Connection": "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1539))(CONNECT_DATA=(SERVICE_NAME=ORA12C)));User Id=sicbo;Password=qwK99QfuhEmcFE;Connection Timeout=120;",
+  "Kestrel": {
+    "EndPoints": {
+      "Http": {
+        "Url": "http://0.0.0.0:9106"
+      }
+      //"Https": {
+      //  "Url": "https://0.0.0.0:9107",
+      //  "Certificate": {
+      //    "Path": "/path/to/certificate.pfx",
+      //    "Password": "your-password"
+      //  }
+      //}
+    }
+  },
   "Logging": {
     "LogLevel": {
       "Default": "Information",

+ 66 - 0
SicboSub/SicboSub.StartProcedure/Program.cs

@@ -0,0 +1,66 @@
+using System;
+using System.Threading.Tasks;
+using Microsoft.Extensions.Configuration;
+
+namespace SicboSub.StartProcedure
+{
+    class Program
+    {
+        static async Task Main(string[] args)
+        {
+            Console.OutputEncoding = System.Text.Encoding.UTF8; // Hỗ trợ hiển thị tiếng Việt
+            Console.WriteLine("=== TIẾN TRÌNH TÍNH TOÁN BXH SICBO ===");
+
+            // 1. Cấu hình (Configuration)
+            IConfiguration config = new ConfigurationBuilder()
+                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
+                .Build();
+
+            string connectionString = config.GetConnectionString("DefaultConnection") 
+                                   ?? "Data Source=YOUR_DB_HOST:1521/YOUR_SERVICE_NAME;User Id=YOUR_USER;Password=YOUR_PASSWORD;";
+
+            var service = new RankingService(connectionString);
+
+            // 2. Phân tích tham số đầu vào hoặc Chạy mặc định
+            // Cách dùng: 
+            //   SicboSub.StartProcedure.exe daily
+            //   SicboSub.StartProcedure.exe monthly
+            //   SicboSub.StartProcedure.exe 2025-01-18 daily
+
+            DateTime targetDate = DateTime.Now.AddDays(-1); // Mặc định: Ngày hôm qua
+            string mode = "DAILY";
+
+            if (args.Length > 0)
+            {
+                if (args[0].ToUpper() == "DAILY") mode = "DAILY";
+                else if (args[0].ToUpper() == "MONTHLY") mode = "MONTHLY";
+                else if (DateTime.TryParse(args[0], out DateTime parsedDate)) targetDate = parsedDate;
+
+                if (args.Length > 1)
+                {
+                   if (args[1].ToUpper() == "DAILY") mode = "DAILY";
+                   else if (args[1].ToUpper() == "MONTHLY") mode = "MONTHLY";
+                }
+            }
+
+            Console.WriteLine($"Chế độ chạy: {(mode == "DAILY" ? "Hàng Ngày" : "Hàng Tháng")}");
+            Console.WriteLine($"Ngày mục tiêu: {targetDate:yyyy-MM-dd}");
+
+            // 3. Thực thi
+            if (mode == "DAILY")
+            {
+                await service.ExecuteDailyRankingAsync(targetDate);
+            }
+            else if (mode == "MONTHLY")
+            {
+                // Đối với chạy Tháng, Procedure sẽ lấy ngày truyền vào để xác định tháng.
+                // VD: 14/01/2026 -> Sẽ tính cho Tháng 1/2026.
+                // Nếu muốn tính tháng trước, cần đảm bảo targetDate thuộc về tháng trước.
+                await service.ExecuteMonthlyRankingAsync(targetDate);
+            }
+
+            Console.WriteLine("Nhấn phím bất kỳ để thoát...");
+            // Console.ReadKey(); // Bỏ comment nếu chạy bằng tay để xem kết quả
+        }
+    }
+}

+ 149 - 0
SicboSub/SicboSub.StartProcedure/RankingService.cs

@@ -0,0 +1,149 @@
+using System;
+using System.Data;
+using Dapper;
+using Oracle.ManagedDataAccess.Client;
+using System.Threading.Tasks;
+using System.Linq;
+using System.Collections.Generic;
+
+namespace SicboSub.StartProcedure
+{
+    public class RankingService
+    {
+        private readonly string _connectionString;
+
+        public RankingService(string connectionString)
+        {
+            _connectionString = connectionString;
+        }
+
+        public async Task ExecuteDailyRankingAsync(DateTime reportDate)
+        {
+            await RunRankingProcess(reportDate, "DAILY");
+        }
+
+        public async Task ExecuteMonthlyRankingAsync(DateTime reportDate)
+        {
+            await RunRankingProcess(reportDate, "MONTHLY");
+        }
+
+        private async Task RunRankingProcess(DateTime reportDate, string type)
+        {
+            string typeVN = type == "DAILY" ? "NGÀY" : "THÁNG";
+            Console.WriteLine($"[BẮT ĐẦU] Tính toán BXH {typeVN} cho ngày {reportDate:yyyy-MM-dd}...");
+
+            using (var conn = new OracleConnection(_connectionString))
+            {
+                await conn.OpenAsync();
+
+                try
+                {
+                    // 1. Gọi Procedure: Sinh ra dữ liệu SNAPSHOT (Nếu đã chạy Success thì nó sẽ skip)
+                    var p = new DynamicParameters();
+                    p.Add("p_report_date", reportDate, DbType.Date, ParameterDirection.Input);
+                    p.Add("p_type", type, DbType.String, ParameterDirection.Input);
+
+                    await conn.ExecuteAsync("PRC_CALCULATE_RANKING", p, commandType: CommandType.StoredProcedure);
+                    Console.WriteLine(" -> Kiểm tra/Chạy Procedure hoàn tất.");
+
+                    // 2. QUÉT ALL PENDING (Kể cả những cái bị treo từ lần chạy cũ bị crash)
+                    // Không chỉ lấy của ngày hôm nay mà lấy tất cả status=0 để xử lý triệt để
+                    string sqlGetPending = @"
+                        SELECT ID, MSISDN, REWARD_VALUE, REWARD_UNIT, NOTE 
+                        FROM RANKING_REWARD_LOG 
+                        WHERE STATUS = 0
+                        ORDER BY ID ASC"; // FIFO
+
+                    var pendingRewards = await conn.QueryAsync<RankingRewardLog>(sqlGetPending);
+                    var rewardList = pendingRewards.ToList();
+                    
+                    if (rewardList.Count == 0)
+                    {
+                        Console.WriteLine(" -> Không có phần thưởng nào cần xử lý.");
+                        return;
+                    }
+
+                    Console.WriteLine($" -> Tìm thấy {rewardList.Count} lệnh thưởng đang chờ (Status=0).");
+
+                    // 3. XỬ LÝ AN TOÀN (Claim -> Process -> Finish)
+                    foreach (var reward in rewardList)
+                    {
+                        await ProcessSingleRewardSafe(conn, reward);
+                    }
+                }
+                catch (Exception ex)
+                {
+                    Console.WriteLine($"[LỖI NGHIÊM TRỌNG] {ex.Message}");
+                }
+            }
+            Console.WriteLine("[HOÀN TẤT] Quá trình kết thúc.\n");
+        }
+
+        /// <summary>
+        /// Xử lý từng giao dịch với cơ chế 'Chiếm quyền' (Optimistic Locking) tránh tranh chấp.
+        /// </summary>
+        private async Task ProcessSingleRewardSafe(OracleConnection conn, RankingRewardLog reward)
+        {
+            // BƯỚC 1: CHIẾM QUYỀN (Mark as Processing - 3)
+            // Chỉ update được nếu Status vẫn đang là 0.
+            string sqlClaim = "UPDATE RANKING_REWARD_LOG SET STATUS = 3 WHERE ID = :id AND STATUS = 0";
+            int rowsAffected = await conn.ExecuteAsync(sqlClaim, new { id = reward.ID });
+
+            if (rowsAffected == 0)
+            {
+                // Ai đó đã xử lý rồi, hoặc trạng thái đã thay đổi -> Bỏ qua
+                Console.WriteLine($"    ! Bỏ qua ID {reward.ID} (User {reward.MSISDN}) - Đã bị chiếm bởi tiến trình khác.");
+                return;
+            }
+
+            // BƯỚC 2: THỰC HIỆN TRẢ THƯỞNG (Payment Logic)
+            Console.WriteLine($"    -> Đang xử lý ID {reward.ID} (User {reward.MSISDN}): {reward.REWARD_VALUE} {reward.REWARD_UNIT}...");
+            bool isSuccess = await DistributeReward(reward);
+
+            // BƯỚC 3: CHỐT TRẠNG THÁI (1: Success, 2: Failed)
+            // Nếu thất bại, set về 2 (Failed) để admin check, hoặc set về 0 (Pending) để retry tự động tùy nghiệp vụ.
+            // Ở đây tôi set về 2 để tránh retry vô tận nếu lỗi logic.
+            int finalStatus = isSuccess ? 1 : 2; 
+
+            string sqlFinalize = "UPDATE RANKING_REWARD_LOG SET STATUS = :s, CREATED_DATE = SYSDATE WHERE ID = :id";
+            await conn.ExecuteAsync(sqlFinalize, new { s = finalStatus, id = reward.ID });
+
+            Console.WriteLine($"       -> KẾT QUẢ: {(isSuccess ? "THÀNH CÔNG" : "THẤT BẠI")}");
+        }
+
+        private async Task<bool> DistributeReward(RankingRewardLog reward)
+        {
+            try
+            {
+                // TODO: Gọi API, Cộng tiền thật ở đây
+                // Giả lập độ trễ mạng
+                await Task.Delay(50); 
+                
+                if (reward.REWARD_UNIT == "COIN")
+                {
+                    // Call Service Add Coin
+                }
+                else if (reward.REWARD_UNIT == "MONEY")
+                {
+                    // Call Service Add Money
+                }
+
+                return true; // Giả sử luôn thành công
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine($"       [LỖI API] {ex.Message}");
+                return false;
+            }
+        }
+    }
+
+    public class RankingRewardLog
+    {
+        public decimal ID { get; set; }
+        public string MSISDN { get; set; } = "";
+        public decimal REWARD_VALUE { get; set; }
+        public string REWARD_UNIT { get; set; } = "";
+        public string NOTE { get; set; } = "";
+    }
+}

+ 17 - 0
SicboSub/SicboSub.StartProcedure/SicboSub.StartProcedure.csproj

@@ -0,0 +1,17 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <OutputType>Exe</OutputType>
+    <TargetFramework>net8.0</TargetFramework>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <Nullable>enable</Nullable>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Oracle.ManagedDataAccess.Core" Version="3.21.140" />
+    <PackageReference Include="Dapper" Version="2.1.35" />
+    <PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
+    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" />
+  </ItemGroup>
+
+</Project>

+ 5 - 0
SicboSub/SicboSub.StartProcedure/appsettings.json

@@ -0,0 +1,5 @@
+{
+  "ConnectionStrings": {
+    "DefaultConnection": "Data Source=localhost:1521/ORCL;User Id=SICBO_USER;Password=SICBO_PASS;"
+  }
+}

+ 25 - 0
SicboSub/SicboSub.Web/Controllers/HomeController.cs

@@ -23,6 +23,31 @@ namespace SicboSub.Web.Controllers
             return View();
         }
 
+        public IActionResult History()
+        {
+            return View();
+        }
+
+        public IActionResult Winner()
+        {
+            return View();
+        }
+
+        public IActionResult DailyRanking()
+        {
+            return View();
+        }
+
+        public IActionResult MonthlyRanking()
+        {
+            return View();
+        }
+
+        public IActionResult Account()
+        {
+            return View();
+        }
+
         [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
         public IActionResult Error()
         {

+ 62 - 0
SicboSub/SicboSub.Web/Views/Home/Account.cshtml

@@ -0,0 +1,62 @@
+@{
+    Layout = "_GameLayout";
+}
+
+@section Styles {
+    <link rel="stylesheet" href="~/css/sicbo-account.css" />
+}
+
+<div class="home">
+    <!-- Background Image -->
+    <img class="image" src="~/img/image-2.png" />
+    
+    <!-- Reuse Game Menu -->
+    <partial name="_GameMenu" />
+
+    <!-- Account Content Panel -->
+    <div class="account-panel">
+        <!-- Left Side - Avatar -->
+        <div class="account-avatar-section">
+            <div class="avatar-frame">
+                <img class="avatar-image" src="~/img/avatar.png" alt="Avatar" />
+            </div>
+            <div class="avatar-name">Rosé Stark</div>
+        </div>
+
+        <!-- Right Side - Account Info -->
+        <div class="account-info-section">
+            <!-- Phone Number -->
+            <div class="info-row">
+                <span class="info-label">Phone number</span>
+                <span class="info-value">0912 345 678</span>
+            </div>
+
+            <!-- Name -->
+            <div class="info-row">
+                <span class="info-label">Name</span>
+                <span class="info-value">Rosé Stark</span>
+            </div>
+
+            <!-- Total Coins -->
+            <div class="info-row with-icon">
+                <div class="info-content">
+                    <span class="info-label">Total coins</span>
+                    <span class="info-value coins">140.000</span>
+                </div>
+                <img class="settings-icon" src="~/img/042-settings.png" alt="Settings" />
+            </div>
+
+            <!-- Total Value Today -->
+            <div class="info-row">
+                <span class="info-label">Total value today</span>
+                <span class="info-value money">$520.000</span>
+            </div>
+
+            <!-- Total Value This Month -->
+            <div class="info-row">
+                <span class="info-label">Total value this month</span>
+                <span class="info-value money">$28.520.000</span>
+            </div>
+        </div>
+    </div>
+</div>

+ 93 - 0
SicboSub/SicboSub.Web/Views/Home/DailyRanking.cshtml

@@ -0,0 +1,93 @@
+@{
+    Layout = "_GameLayout";
+}
+
+@section Styles {
+    <link rel="stylesheet" href="~/css/sicbo-ranking.css" />
+}
+
+<div class="home">
+    <!-- Background Image -->
+    <img class="image" src="~/img/image-2.png" />
+    
+    <!-- Reuse Game Menu -->
+    <partial name="_GameMenu" />
+
+    <!-- Ranking Content Panel -->
+    <div class="ranking-panel">
+        <!-- Corner Rectangle -->
+        <img class="panel-corner-rectangle" src="~/img/Rectangle_red_T.png" alt="" />
+        <!-- Header -->
+        <div class="ranking-header">
+            <!-- Triangles -->
+            <div class="header-triangles">
+                <span class="triangle red">▲</span>
+                <span class="triangle red">▲</span>
+            </div>
+            
+            <!-- Switch Button -->
+            <a href="@Url.Action("MonthlyRanking", "Home")" class="switch-button">
+                <img class="switch-icon" src="~/img/017-strategy.png" alt="" />
+                <span class="switch-text">Switch to Monthy</span>
+            </a>
+            
+            <!-- Title -->
+            <div class="ranking-title daily">
+                <span class="title-line">Daily</span>
+                <span class="title-line">Ranking</span>
+            </div>
+        </div>
+
+        <!-- Table Header -->
+        <div class="ranking-table-header">
+            <div class="col-top">Top</div>
+            <div class="col-player">Player</div>
+            <div class="col-rewards">Rewards</div>
+        </div>
+
+        <!-- Table Body -->
+        <div class="ranking-table-body">
+            <!-- Row 1 - Gold -->
+            <div class="ranking-row gold">
+                <div class="col-top">1</div>
+                <div class="col-player">0912 345 678</div>
+                <div class="col-rewards"><span class="reward-value">+1.500</span> <span class="reward-unit">Coins</span></div>
+            </div>
+            
+            <!-- Row 2 - Silver -->
+            <div class="ranking-row silver">
+                <div class="col-top">2</div>
+                <div class="col-player">0912 345 678</div>
+                <div class="col-rewards"><span class="reward-value">+500</span> <span class="reward-unit">Coins</span></div>
+            </div>
+            
+            <!-- Row 3 - Bronze -->
+            <div class="ranking-row bronze">
+                <div class="col-top">3</div>
+                <div class="col-player">0912 345 678</div>
+                <div class="col-rewards"><span class="reward-value">+250</span> <span class="reward-unit">Coins</span></div>
+            </div>
+            
+            <!-- Row 4 -->
+            <div class="ranking-row">
+                <div class="col-top">4</div>
+                <div class="col-player">0912 345 678</div>
+                <div class="col-rewards"><span class="reward-value">+150</span> <span class="reward-unit">Coins</span></div>
+            </div>
+            
+            <!-- Row 5 -->
+            <div class="ranking-row">
+                <div class="col-top">5</div>
+                <div class="col-player">0912 345 678</div>
+                <div class="col-rewards"><span class="reward-value">+75</span> <span class="reward-unit">Coins</span></div>
+            </div>
+            
+            <!-- Row 6 -->
+            <div class="ranking-row">
+                <div class="col-top">6</div>
+                <div class="col-player">0912 345 678</div>
+                <div class="col-rewards"><span class="reward-value">+50</span> <span class="reward-unit">Coins</span></div>
+            </div>
+        </div>
+    </div>
+</div>

+ 147 - 0
SicboSub/SicboSub.Web/Views/Home/History.cshtml

@@ -0,0 +1,147 @@
+@{
+    Layout = "_GameLayout";
+}
+
+@section Styles {
+    <link rel="stylesheet" href="~/css/sicbo-history.css" />
+}
+
+<div class="home">
+    <!-- Background Image -->
+    <img class="image" src="~/img/image-2.png" />
+    
+    <!-- Reuse Game Menu -->
+    <partial name="_GameMenu" />
+
+    <!-- History Content Panel -->
+    <div class="history-panel">
+        <!-- Tab Buttons -->
+        <div class="history-tabs">
+            <div class="tab-button active" data-tab="game">
+                <span class="tab-label">Game history</span>
+            </div>
+            <div class="tab-button" data-tab="prize">
+                <span class="tab-label">Prize history</span>
+            </div>
+        </div>
+
+        <!-- Game History Table -->
+        <div class="history-table" id="game-table">
+            <!-- Header Row -->
+            <div class="table-header">
+                <div class="col-id">ID</div>
+                <div class="col-time">Time</div>
+                <div class="col-coin">Coin</div>
+                <div class="col-status">Status</div>
+            </div>
+
+            <!-- Data Rows -->
+            <div class="table-row">
+                <div class="col-id">AA001</div>
+                <div class="col-time">20/12/2026, 18:00:00</div>
+                <div class="col-coin positive">+5.000</div>
+                <div class="col-status won">Won</div>
+            </div>
+            <div class="table-row">
+                <div class="col-id">AA002</div>
+                <div class="col-time">20/12/2026, 18:00:00</div>
+                <div class="col-coin positive">+50.000</div>
+                <div class="col-status won">Won</div>
+            </div>
+            <div class="table-row">
+                <div class="col-id">AA003</div>
+                <div class="col-time">20/12/2026, 18:00:00</div>
+                <div class="col-coin positive">+50.000</div>
+                <div class="col-status won">Won</div>
+            </div>
+            <div class="table-row">
+                <div class="col-id">AA004</div>
+                <div class="col-time">20/12/2026, 18:00:00</div>
+                <div class="col-coin positive">+50.000</div>
+                <div class="col-status won">Won</div>
+            </div>
+            <div class="table-row">
+                <div class="col-id">AA005</div>
+                <div class="col-time">20/12/2026, 18:00:00</div>
+                <div class="col-coin negative">-50.000</div>
+                <div class="col-status lost">Losed</div>
+            </div>
+            <div class="table-row">
+                <div class="col-id">AA006</div>
+                <div class="col-time">20/12/2026, 18:00:00</div>
+                <div class="col-coin negative">-250.000</div>
+                <div class="col-status lost">Losed</div>
+            </div>
+        </div>
+
+        <!-- Prize History Table (Hidden by default) -->
+        <div class="history-table hidden" id="prize-table">
+            <!-- Header Row -->
+            <div class="table-header">
+                <div class="col-account">Account</div>
+                <div class="col-time">Time</div>
+                <div class="col-value">Value</div>
+                <div class="col-status">Status</div>
+            </div>
+
+            <!-- Data Rows -->
+            <div class="table-row">
+                <div class="col-account">0912345678</div>
+                <div class="col-time">20/12/2026, 18:00:00</div>
+                <div class="col-value">250.000 <span class="usd">USD</span></div>
+                <div class="col-status pending">Peding</div>
+            </div>
+            <div class="table-row">
+                <div class="col-account">0912345678</div>
+                <div class="col-time">20/12/2026, 18:00:00</div>
+                <div class="col-value">25.000 <span class="usd">USD</span></div>
+                <div class="col-status successful">Successful</div>
+            </div>
+            <div class="table-row">
+                <div class="col-account">0912345678</div>
+                <div class="col-time">20/12/2026, 18:00:00</div>
+                <div class="col-value">1.000.000 <span class="usd">USD</span></div>
+                <div class="col-status fail">Fail</div>
+            </div>
+            <div class="table-row">
+                <div class="col-account">0912345678</div>
+                <div class="col-time">20/12/2026, 18:00:00</div>
+                <div class="col-value">5.000 <span class="usd">USD</span></div>
+                <div class="col-status successful">Successful</div>
+            </div>
+            <div class="table-row">
+                <div class="col-account">0912345678</div>
+                <div class="col-time">20/12/2026, 18:00:00</div>
+                <div class="col-value">2.000.000 <span class="usd">USD</span></div>
+                <div class="col-status fail">Fail</div>
+            </div>
+            <div class="table-row">
+                <div class="col-account">0912345678</div>
+                <div class="col-time">20/12/2026, 18:00:00</div>
+                <div class="col-value">105.000 <span class="usd">USD</span></div>
+                <div class="col-status successful">Successful</div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script>
+    document.querySelectorAll('.tab-button').forEach(button => {
+        button.addEventListener('click', function() {
+            // Remove active from all tabs
+            document.querySelectorAll('.tab-button').forEach(btn => btn.classList.remove('active'));
+            // Add active to clicked tab
+            this.classList.add('active');
+            
+            // Show/hide tables
+            const tab = this.dataset.tab;
+            if (tab === 'game') {
+                document.getElementById('game-table').classList.remove('hidden');
+                document.getElementById('prize-table').classList.add('hidden');
+            } else {
+                document.getElementById('game-table').classList.add('hidden');
+                document.getElementById('prize-table').classList.remove('hidden');
+            }
+        });
+    });
+</script>

+ 83 - 5
SicboSub/SicboSub.Web/Views/Home/Index.cshtml

@@ -1,8 +1,86 @@
-@{
-    ViewData["Title"] = "Home Page";
+@{
+    Layout = "_GameLayout";
 }
 
-<div class="text-center">
-    <h1 class="display-4">Welcome</h1>
-    <p>Learn about <a href="https://learn.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
+<div class="home">
+    <div class="image-2-parent">
+        <img class="image" src="~/img/image-2.png" />
+        <img class="image-2-icon" alt="" src="~/img/image-2.png" style="display:none;">
+        
+        <img class="frame-child" src="~/img/image-1.png" alt="Logo">
+
+        <partial name="_GameMenu" />
+
+        <div class="frame-parent">
+            <div class="medal-parent">
+                <img class="hourglass-icon" src="~/img/021-medal-2.svg" alt="">
+                <div class="ranking-coin">Ranking coin</div>
+                <b class="view-ranking-coin">View ranking coin tablet 👉</b>
+            </div>
+            <div class="frame-group">
+                <div class="frame-container">
+                    <div class="my-play-parent">
+                        <div class="my-play"> My play</div>
+                        <div class="frame-item">
+                        </div>
+                    </div>
+                    <div class="sword-parent">
+                        <img class="sword-icon" src="~/img/003-sword.svg" alt="">
+                        <div class="my-play">1.400</div>
+                    </div>
+                </div>
+                <div class="frame-container">
+                    <div class="my-coins-parent">
+                        <div class="my-play">My coins</div>
+                        <div class="frame-item">
+                        </div>
+                    </div>
+                    <div class="sword-parent">
+                        <img class="sword-icon" src="~/img/021-medal.svg" alt="">
+                        <div class="my-play">140.000</div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+    <div class="frame-parent3">
+        <div class="rectangle-parent">
+            <div class="rectangle-div">
+            </div>
+            <!-- Register Button -->
+            <div class="button-label">Register</div>
+        </div>
+        <div class="rectangle-parent">
+            <div class="rectangle-div">
+            </div>
+            <!-- Buy more Button -->
+            <div class="button-label2">Buy more</div>
+        </div>
+
+        <!-- PLAY BUTTON COMPLEX -->
+        <div class="button-small">
+            <div class="button-small-child"></div>
+            <div class="button-small-item"></div>
+
+            <img class="button-small-inner" src="~/img/rectangle-314.svg" alt="">
+            <img class="rectangle-icon" src="~/img/rectangle-315.svg" alt="">
+            <img class="button-small-child2" src="~/img/rectangle-316.svg" alt="">
+
+            <img class="frame-icon" src="~/img/rectangle-318-3.svg" alt=""> <!-- subtract-2.svg inside? -->
+
+            <img class="button-small-child3" src="~/img/rectangle-318-2.svg" alt="">
+            <img class="button-small-child4" src="~/img/rectangle-317.svg" alt="">
+            <img class="button-small-child5" src="~/img/image.svg" alt="">
+            <img class="button-small-child6" src="~/img/rectangle-318.svg" alt="">
+
+            <img class="vector-icon" src="~/img/vector-2.svg" alt="">
+            <img class="vector-icon2" src="~/img/vector.svg" alt="">
+            <img class="vector-icon3" src="~/img/vector-3.svg" alt="">
+            <img class="vector-icon4" src="~/img/vector-4.svg" alt="">
+
+            <div class="button-label3">Play</div>
+        </div>
+    </div>
+    <!-- <img class="home-barpro-icon" alt=""> -->
+
 </div>

+ 93 - 0
SicboSub/SicboSub.Web/Views/Home/MonthlyRanking.cshtml

@@ -0,0 +1,93 @@
+@{
+    Layout = "_GameLayout";
+}
+
+@section Styles {
+    <link rel="stylesheet" href="~/css/sicbo-ranking.css" />
+}
+
+<div class="home">
+    <!-- Background Image -->
+    <img class="image" src="~/img/image-2.png" />
+    
+    <!-- Reuse Game Menu -->
+    <partial name="_GameMenu" />
+
+    <!-- Ranking Content Panel -->
+    <div class="ranking-panel">
+        <!-- Corner Rectangle -->
+        <img class="panel-corner-rectangle" src="~/img/Rectangle_Blue_T.png" alt="" />
+        <!-- Header -->
+        <div class="ranking-header">
+            <!-- Triangles -->
+            <div class="header-triangles">
+                <span class="triangle white">▲</span>
+                <span class="triangle blue">▲</span>
+            </div>
+            
+            <!-- Switch Button -->
+            <a href="@Url.Action("DailyRanking", "Home")" class="switch-button">
+                <img class="switch-icon" src="~/img/017-strategy.png" alt="" />
+                <span class="switch-text">Switch to Daily</span>
+            </a>
+            
+            <!-- Title -->
+            <div class="ranking-title monthly">
+                <span class="title-line">Monthly</span>
+                <span class="title-line">Ranking</span>
+            </div>
+        </div>
+
+        <!-- Table Header -->
+        <div class="ranking-table-header">
+            <div class="col-top">Top</div>
+            <div class="col-player">Player</div>
+            <div class="col-rewards">Rewards</div>
+        </div>
+
+        <!-- Table Body -->
+        <div class="ranking-table-body">
+            <!-- Row 1 - Gold -->
+            <div class="ranking-row gold">
+                <div class="col-top">1</div>
+                <div class="col-player">0912 345 678</div>
+                <div class="col-rewards"><span class="reward-value">+10.000</span> <span class="reward-unit">Coins</span></div>
+            </div>
+            
+            <!-- Row 2 - Silver -->
+            <div class="ranking-row silver">
+                <div class="col-top">2</div>
+                <div class="col-player">0912 345 678</div>
+                <div class="col-rewards"><span class="reward-value">+5.000</span> <span class="reward-unit">Coins</span></div>
+            </div>
+            
+            <!-- Row 3 - Bronze -->
+            <div class="ranking-row bronze">
+                <div class="col-top">3</div>
+                <div class="col-player">0912 345 678</div>
+                <div class="col-rewards"><span class="reward-value">+2.500</span> <span class="reward-unit">Coins</span></div>
+            </div>
+            
+            <!-- Row 4 -->
+            <div class="ranking-row">
+                <div class="col-top">4</div>
+                <div class="col-player">0912 345 678</div>
+                <div class="col-rewards"><span class="reward-value">+1.500</span> <span class="reward-unit">Coins</span></div>
+            </div>
+            
+            <!-- Row 5 -->
+            <div class="ranking-row">
+                <div class="col-top">5</div>
+                <div class="col-player">0912 345 678</div>
+                <div class="col-rewards"><span class="reward-value">+750</span> <span class="reward-unit">Coins</span></div>
+            </div>
+            
+            <!-- Row 6 -->
+            <div class="ranking-row">
+                <div class="col-top">6</div>
+                <div class="col-player">0912 345 678</div>
+                <div class="col-rewards"><span class="reward-value">+500</span> <span class="reward-unit">Coins</span></div>
+            </div>
+        </div>
+    </div>
+</div>

+ 73 - 0
SicboSub/SicboSub.Web/Views/Home/Winner.cshtml

@@ -0,0 +1,73 @@
+@{
+    Layout = "_GameLayout";
+}
+
+@section Styles {
+    <link rel="stylesheet" href="~/css/sicbo-winner.css" />
+}
+
+<div class="home">
+    <!-- Background Image -->
+    <img class="image" src="~/img/image-2.png" />
+    
+    <!-- Reuse Game Menu -->
+    <partial name="_GameMenu" />
+
+    <!-- Winner Content Panel -->
+    <div class="winner-panel">
+        <!-- Daily Ranking Card -->
+        <a href="@Url.Action("DailyRanking", "Home")" class="ranking-card daily">
+            <!-- Triangles -->
+            <div class="card-triangles">
+                <span class="triangle blue">▲</span>
+                <span class="triangle white">▲</span>
+                <span class="triangle white">▲</span>
+            </div>
+            
+            <!-- Main Character Image -->
+            <div class="card-image">
+                <img src="~/img/daily-ranking.png" alt="Daily Ranking" />
+            </div>
+            
+            <!-- Dice Images -->
+            <img class="dice dice-1" src="~/img/Group.png" alt="" />
+            <img class="dice dice-2" src="~/img/Group1.png" alt="" />
+            
+            <!-- Corner Rectangle -->
+            <img class="corner-rectangle" src="~/img/Rectangle_Red.png" alt="" />
+            
+            <!-- Title -->
+            <div class="card-title daily-title">
+                <span class="title-line-1">Daily</span>
+                <span class="title-line-2">Ranking</span>
+            </div>
+        </a>
+
+        <!-- Monthly Ranking Card -->
+        <a href="@Url.Action("MonthlyRanking", "Home")" class="ranking-card monthly">
+            <!-- Triangles -->
+            <div class="card-triangles">
+                <span class="triangle white">▲</span>
+                <span class="triangle blue">▲</span>
+                <span class="triangle white">▲</span>
+            </div>
+            
+            <!-- Main Character Image -->
+            <div class="card-image">
+                <img src="~/img/monthly-ranking.png" alt="Monthly Ranking" />
+            </div>
+            
+            <!-- Dice Image -->
+            <img class="dice dice-monthly" src="~/img/GroupN.png" alt="" />
+            
+            <!-- Corner Rectangle -->
+            <img class="corner-rectangle" src="~/img/Rectangle_Blue.png" alt="" />
+            
+            <!-- Title -->
+            <div class="card-title monthly-title">
+                <span class="title-line-1">Monthly</span>
+                <span class="title-line-2">Ranking</span>
+            </div>
+        </a>
+    </div>
+</div>

+ 15 - 0
SicboSub/SicboSub.Web/Views/Shared/_GameLayout.cshtml

@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="initial-scale=1, width=device-width">
+
+    <link rel="stylesheet" href="~/css/sicbo-game.css" />
+    <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Kanit:wght@800;900&display=swap" />
+    <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=SF+Pro:wght@700;900&display=swap" />
+    @RenderSection("Styles", required: false)
+</head>
+<body>
+    @RenderBody()
+</body>
+</html>

+ 37 - 0
SicboSub/SicboSub.Web/Views/Shared/_GameMenu.cshtml

@@ -0,0 +1,37 @@
+@{
+    var currentAction = ViewContext.RouteData.Values["action"]?.ToString() ?? "Index";
+}
+
+<div class="menu">
+    <!-- Home Link -->
+    <a href="@Url.Action("Index", "Home")" class="menu-inner @(currentAction == "Index" ? "menu-active" : "")" style="text-decoration: none; color: inherit; display: block;">
+        <div class="esports-parent">
+            <img class="esports-icon" src="~/img/046-esports.svg" alt="">
+            <b class="history">Home</b>
+        </div>
+    </a>
+
+    <!-- History Link -->
+    <a href="@Url.Action("History", "Home")" class="menu-child @(currentAction == "History" ? "menu-active" : "")" style="text-decoration: none; color: inherit; display: block;">
+        <div class="esports-parent">
+            <img class="hourglass-icon" src="~/img/023-hourglass.svg" alt="">
+            <b class="history">History</b>
+        </div>
+    </a>
+
+    <!-- Winner Link -->
+    <a href="@Url.Action("Winner", "Home")" class="menu-child @(currentAction == "Winner" ? "menu-active" : "")" style="text-decoration: none; color: inherit; display: block;">
+        <div class="esports-parent">
+            <img class="hourglass-icon" src="~/img/032-ranking.svg" alt="">
+            <b class="winner">Winner</b>
+        </div>
+    </a>
+
+    <!-- Account Link -->
+    <a href="@Url.Action("Account", "Home")" class="menu-child @(currentAction == "Account" ? "menu-active" : "")" style="text-decoration: none; color: inherit; display: block;">
+        <div class="esports-parent">
+            <img class="inventory-icon" src="~/img/037-inventory.svg" alt="">
+            <b class="account">Account</b>
+        </div>
+    </a>
+</div>

+ 137 - 0
SicboSub/SicboSub.Web/wwwroot/css/sicbo-account.css

@@ -0,0 +1,137 @@
+/* Account Page Styles */
+
+/* Account Panel */
+.account-panel {
+    position: absolute;
+    top: 20px;
+    left: 116px;
+    right: 20px;
+    bottom: 20px;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    gap: 80px;
+    font-family: 'Kanit', sans-serif;
+    box-sizing: border-box;
+    padding: 40px 60px;
+    border: 2px solid #c9a861;
+    border-radius: 127px;
+    background: rgba(0, 0, 0, 0.6);
+}
+
+/* Avatar Section */
+.account-avatar-section {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    gap: 20px;
+    position: relative;
+}
+
+/* Red Diamond Background - rotated 45deg square */
+.account-avatar-section::before {
+    content: '';
+    position: absolute;
+    top: 10px;
+    width: 180px;
+    height: 160px;
+    background: #8b0000;
+    transform: rotate(20deg);
+    border-radius: 20px;
+    z-index: 0;
+}
+
+/* Avatar Frame - Rounded square with golden border, rotated */
+.avatar-frame {
+    width: 180px;
+    height: 180px;
+    border-radius: 40px;
+    border: 1px solid #c9a861;
+    background: #000;
+    overflow: hidden;
+    position: relative;
+    z-index: 1;
+    transform: rotate(45deg);
+}
+
+.avatar-image {
+    width: 140%;
+    height: 140%;
+    object-fit: cover;
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%) rotate(-45deg);
+}
+
+/* Avatar Name */
+.avatar-name {
+    font-size: 32px;
+    font-weight: 700;
+    color: #FFE3AA;
+    text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.8);
+}
+
+/* Account Info Section */
+.account-info-section {
+    display: flex;
+    flex-direction: column;
+    gap: 12px;
+    min-width: 280px;
+}
+
+/* Info Row */
+.info-row {
+    display: flex;
+    flex-direction: column;
+    gap: 2px;
+    align-items: flex-start;
+}
+
+.info-row.with-icon {
+    flex-direction: row;
+    align-items: flex-start;
+    gap: 40px;
+}
+
+.info-content {
+    display: flex;
+    flex-direction: column;
+    gap: 2px;
+    align-items: flex-start;
+}
+
+/* Info Label */
+.info-label {
+    font-size: 12px;
+    color: rgba(255, 255, 255, 0.7);
+    font-weight: 400;
+}
+
+/* Info Value */
+.info-value {
+    font-size: 24px;
+    font-weight: 700;
+    color: #fff;
+}
+
+.info-value.coins {
+    color: #fff;
+}
+
+.info-value.money {
+    color: #fff;
+}
+
+/* Settings Icon */
+.settings-icon {
+    width: 100%;
+    height: 36px;
+    object-fit: contain;
+    cursor: pointer;
+    transition: transform 0.2s ease;
+}
+
+.settings-icon:hover {
+    transform: scale(1.1);
+}

+ 496 - 0
SicboSub/SicboSub.Web/wwwroot/css/sicbo-game.css

@@ -0,0 +1,496 @@
+/* Global Styles */
+body {
+    margin: 0;
+    line-height: normal;
+    background-color: #000;
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    width: 100vw;
+    height: 100vh;
+    overflow: hidden;
+}
+
+/* Index Styles */
+.home {
+    width: 852px;
+    height: 393px;
+    position: relative;
+    border-radius: 40px;
+    background-color: #1a0000;
+    overflow: hidden;
+    text-align: center;
+    font-size: 12px;
+    color: #fff;
+    font-family: 'Kanit', sans-serif;
+    box-shadow: 0 0 50px rgba(0,0,0,0.5);
+}
+
+.image-2-parent {
+    position: absolute;
+    top: 0px;
+    left: 0px;
+    background-color: #1a0000;
+    width: 100%;
+    height: 100%;
+    overflow: hidden;
+}
+
+.image {
+    position: absolute;
+    top: 0;
+    left: 0;
+    width: 100%;
+    height: 100%;
+    object-fit: cover;
+}
+
+.image-2-icon {
+    position: absolute;
+    top: calc(50% - 217.5px);
+    left: calc(50% - 388px);
+    width: 776px;
+    height: 435px;
+    object-fit: cover;
+    flex-shrink: 0;
+}
+
+.frame-child {
+    position: absolute;
+    top: 4px;
+    right: 65px;
+    width: 210px;
+    height: 150px;
+    object-fit: cover;
+    flex-shrink: 0;
+}
+
+.menu {
+    position: absolute;
+    top: calc(50% - 177.5px);
+    left: 16px;
+    width: 80px;
+    display: flex;
+    flex-direction: column;
+    align-items: flex-start;
+    gap: 12px;
+    flex-shrink: 0;
+}
+
+.menu-inner {
+    align-self: stretch;
+    height: 80px;
+    position: relative;
+    backdrop-filter: blur(34px);
+    border-radius: 20px;
+    background: transparent;
+    border: 4px solid #c9a861;
+    box-sizing: border-box;
+    flex-shrink: 0;
+    display: block;
+}
+
+.esports-parent {
+    position: absolute;
+    top: calc(50% - 33px);
+    left: calc(50% - 24px);
+    width: 48px;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    padding: 0px 0px 4px;
+    box-sizing: border-box;
+}
+
+.esports-icon {
+    align-self: stretch;
+    position: relative;
+    max-width: 100%;
+    overflow: hidden;
+    max-height: 100%;
+}
+
+.menu-child {
+    align-self: stretch;
+    height: 80px;
+    position: relative;
+    backdrop-filter: blur(34px);
+    border-radius: 20px;
+    background: transparent;
+    border: 4px solid #c9a861;
+    box-sizing: border-box;
+    flex-shrink: 0;
+    display: block;
+}
+
+/* Active menu item - when on current page */
+.menu-child.menu-active,
+.menu-inner.menu-active {
+    box-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25), 0px 0px 0px 6px #ad193f inset, 0px 0px 0px 8px #75001e inset;
+    background: linear-gradient(180deg, #75001e, #ad193f) padding-box, linear-gradient(180deg, #ffe3aa, #99814f) border-box;
+    overflow: hidden;
+}
+
+.hourglass-icon {
+    width: 48px;
+    position: relative;
+    max-height: 100%;
+}
+
+.history {
+    align-self: stretch;
+    position: relative;
+}
+
+.winner {
+    position: relative;
+}
+
+.inventory-icon {
+    width: 48px;
+    position: relative;
+    max-height: 100%;
+    flex-shrink: 0;
+}
+
+.account {
+    position: relative;
+    flex-shrink: 0;
+}
+
+.frame-parent {
+    position: absolute;
+    top: 19px;
+    left: 116px;
+    backdrop-filter: blur(24px);
+    border-radius: 20px;
+    background: linear-gradient(180deg, #000, rgba(0, 0, 0, 0.5)) padding-box, linear-gradient(180deg, #ffe3aa, #99814f) border-box;
+    border: 2px solid transparent;
+    box-sizing: border-box;
+    width: 302px;
+    height: 356px;
+    overflow: hidden;
+    flex-shrink: 0;
+    font-size: 32px;
+    font-family: Kanit;
+}
+
+.medal-parent {
+    position: absolute;
+    top: 0px;
+    left: calc(50% - 101px);
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    padding: 8px 0px;
+}
+
+.ranking-coin {
+    position: relative;
+    font-weight: 900;
+    text-shadow: 2px 0 0 #000, 0 2px 0 #000, -2px 0 0 #000, 0 -2px 0 #000;
+}
+
+.view-ranking-coin {
+    position: relative;
+    font-size: 12px;
+    text-decoration: underline;
+    font-family: 'SF Pro';
+    color: #b8ff84;
+    text-align: left;
+}
+
+.frame-group {
+    position: absolute;
+    bottom: 0px;
+    left: 0px;
+    width: 302px;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    padding: 32px 0px;
+    box-sizing: border-box;
+    gap: 24px;
+    text-align: left;
+    font-size: 20px;
+    font-family: 'SF Pro';
+}
+
+.frame-container {
+    align-self: stretch;
+    display: flex;
+    flex-direction: column;
+    align-items: flex-start;
+    padding: 0px 20px;
+    gap: 12px;
+}
+
+.my-play-parent {
+    align-self: stretch;
+    display: flex;
+    align-items: center;
+    gap: 8px;
+}
+
+.my-play {
+    position: relative;
+    font-weight: 900;
+}
+
+.frame-item {
+    height: 1px;
+    flex: 1;
+    position: relative;
+    border-top: 1px dashed rgba(255, 255, 255, 0.5);
+    box-sizing: border-box;
+}
+
+.sword-parent {
+    display: flex;
+    align-items: center;
+    gap: 12px;
+    font-size: 32px;
+}
+
+.sword-icon {
+    width: 40px;
+    position: relative;
+    max-height: 100%;
+}
+
+.my-coins-parent {
+    align-self: stretch;
+    display: flex;
+    align-items: center;
+    gap: 12px;
+}
+
+.frame-parent3 {
+    position: absolute;
+    bottom: 22px;
+    left: 562px;
+    width: 236.1px;
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: flex-end;
+    gap: 16px;
+    font-size: 32px;
+    color: #000;
+    font-family: Kanit;
+}
+
+.rectangle-parent {
+    align-self: stretch;
+    height: 60px;
+    position: relative;
+    box-shadow: -1px -1px 0px #fe5253 inset, 1px 1px 0px #ffe3aa inset;
+    border-radius: 12px;
+    background-color: #000;
+    overflow: hidden;
+    flex-shrink: 0;
+}
+
+.rectangle-div {
+    position: absolute;
+    top: calc(50% - 26px);
+    left: calc(50% - 114.05px);
+    box-shadow: 0px -1px 0px #fff inset, 0px 2px 0px #fff inset;
+    border-radius: 12px;
+    background: linear-gradient(180deg, #fff, #e1c59c);
+    width: 228px;
+    height: 52px;
+}
+
+.button-label {
+    position: absolute;
+    top: calc(50% - 24px);
+    left: calc(50% - 63.05px);
+    font-weight: 800;
+}
+
+.button-label2 {
+    position: absolute;
+    top: calc(50% - 24px);
+    left: calc(50% - 72.05px);
+    font-weight: 800;
+}
+
+.button-small {
+    width: 242.9px;
+    height: 81.8px;
+    position: relative;
+    box-shadow: 0px 4px 14px rgba(0, 0, 0, 0.45);
+    border-radius: 13.64px;
+    background-color: #9e1838;
+    border: 3.4px solid #5a0923;
+    box-sizing: border-box;
+    overflow: hidden;
+    flex-shrink: 0;
+    font-size: 36px;
+    color: #fff;
+}
+
+.button-small-child {
+    position: absolute;
+    width: 100%;
+    top: 17.05px;
+    right: 0%;
+    left: 0%;
+    background: linear-gradient(90deg, #ff83a9, #ff83a9 28%, rgba(255, 131, 169, 0) 38.05%, #ff83a9 47.5%, #ff83a9 71.36%, rgba(255, 131, 169, 0) 76.72%, #ff83a9 82.21%, #ff83a9);
+    height: 1.7px;
+    flex-shrink: 0;
+}
+
+.button-small-item {
+    position: absolute;
+    width: 100%;
+    top: 57.95px;
+    right: 0%;
+    left: 0%;
+    background: linear-gradient(-90deg, #db2c5a, #db2c5a 31.84%, rgba(219, 44, 90, 0) 35.1%, #db2c5a 38.8%, #db2c5a 65.46%, rgba(219, 44, 90, 0) 71.31%, #db2c5a 77.23%, #db2c5a);
+    height: 1.7px;
+    flex-shrink: 0;
+}
+
+.button-small-inner {
+    position: absolute;
+    width: 100%;
+    top: calc(50% - 37.5px);
+    right: 0%;
+    left: 0%;
+    max-width: 100%;
+    overflow: hidden;
+    height: 17px;
+    mix-blend-mode: normal;
+    flex-shrink: 0;
+}
+
+.rectangle-icon {
+    position: absolute;
+    width: 100%;
+    top: calc(50% + 20.45px);
+    right: 0%;
+    left: 0%;
+    max-width: 100%;
+    overflow: hidden;
+    height: 17px;
+    object-fit: contain;
+    mix-blend-mode: normal;
+    flex-shrink: 0;
+}
+
+.button-small-child2 {
+    position: absolute;
+    top: calc(50% - 37.5px);
+    right: 0.06px;
+    width: 13.6px;
+    height: 75px;
+    mix-blend-mode: normal;
+    flex-shrink: 0;
+}
+
+.frame-icon {
+    position: absolute;
+    top: 17.05px;
+    left: 13.64px;
+    width: 11.1px;
+    height: 27.3px;
+    object-fit: cover;
+    flex-shrink: 0;
+}
+
+.button-small-child3 {
+    position: absolute;
+    top: 17.05px;
+    right: 13.64px;
+    width: 11.1px;
+    height: 13.6px;
+    object-fit: contain;
+    flex-shrink: 0;
+}
+
+.button-small-child4 {
+    position: absolute;
+    top: calc(50% - 37.5px);
+    left: 0px;
+    width: 13.6px;
+    height: 75px;
+    object-fit: contain;
+    mix-blend-mode: normal;
+    flex-shrink: 0;
+}
+
+.button-small-child5 {
+    position: absolute;
+    top: 57.95px;
+    left: 13.64px;
+    width: 11.1px;
+    height: 13.6px;
+    object-fit: cover;
+    flex-shrink: 0;
+}
+
+.button-small-child6 {
+    position: absolute;
+    top: 35.8px;
+    right: 13.64px;
+    width: 11.1px;
+    height: 22.2px;
+    object-fit: contain;
+    flex-shrink: 0;
+}
+
+.vector-icon {
+    position: absolute;
+    bottom: 26.38px;
+    left: 26.42px;
+    width: 6.8px;
+    height: 4.3px;
+    flex-shrink: 0;
+}
+
+.vector-icon2 {
+    position: absolute;
+    top: 28.98px;
+    right: 31.57px;
+    width: 6.8px;
+    height: 4.3px;
+    flex-shrink: 0;
+}
+
+.vector-icon3 {
+    position: absolute;
+    top: 6.82px;
+    left: 69.89px;
+    width: 6px;
+    height: 3.4px;
+    flex-shrink: 0;
+}
+
+.vector-icon4 {
+    position: absolute;
+    right: 56.29px;
+    bottom: 5.12px;
+    width: 6.8px;
+    height: 3.4px;
+    flex-shrink: 0;
+}
+
+.button-label3 {
+    position: absolute;
+    top: calc(50% - 28px);
+    left: calc(50% - 38.51px);
+    font-weight: 800;
+    text-shadow: 0.4px 0 0 #000, 0 0.4px 0 #000, -0.4px 0 0 #000, 0 -0.4px 0 #000;
+    flex-shrink: 0;
+}
+
+.home-barpro-icon {
+    position: absolute;
+    top: calc(50% - 196.5px);
+    right: 0px;
+    width: 34px;
+    height: 393px;
+    object-fit: contain;
+}

+ 194 - 0
SicboSub/SicboSub.Web/wwwroot/css/sicbo-history.css

@@ -0,0 +1,194 @@
+/* History Page Specific Styles */
+
+/* History Panel - Main content area positioned to the right of menu */
+.history-panel {
+    position: absolute;
+    top: 20px;
+    left: 116px;
+    right: 20px;
+    bottom: 20px;
+    display: flex;
+    flex-direction: column;
+    font-family: 'Kanit', sans-serif;
+    /* Golden border around entire panel */
+    border-radius: 16px;
+    background: rgba(0, 0, 0, 0.6);
+    border: 2px solid #c9a861;
+    box-sizing: border-box;
+    padding: 16px;
+}
+
+/* Tab Buttons Container */
+.history-tabs {
+    display: flex;
+    gap: 16px;
+    margin-bottom: 16px;
+}
+
+/* Individual Tab Button */
+.tab-button {
+    flex: 1;
+    position: relative;
+    padding: 10px 20px;
+    cursor: pointer;
+    border-radius: 8px;
+    transition: all 0.2s ease;
+    text-align: center;
+}
+
+.tab-button.active {
+    background: linear-gradient(180deg, #FFFFFF, #E1C59C);
+    border: 2px solid #c9a861;
+}
+
+.tab-button:not(.active) {
+    background: transparent;
+    border: 2px solid #c9a861;
+}
+
+.tab-label {
+    font-size: 24px;
+    font-weight: 700;
+    font-family: 'Kanit', sans-serif;
+    color: #ffe3aa; /* Yellow for inactive */
+}
+
+.tab-button.active .tab-label {
+    color: #000; /* Black for active */
+}
+
+/* Data Table */
+.history-table {
+    flex: 1;
+    display: flex;
+    flex-direction: column;
+    overflow-y: auto;
+}
+
+/* Table Header */
+.table-header {
+    display: flex;
+    padding: 12px 16px;
+    font-weight: 700;
+    font-size: 14px;
+    color: rgba(255, 255, 255, 0.8);
+    border-bottom: 1px solid rgba(255, 255, 255, 0.2);
+    font-family: 'Kanit', sans-serif;
+}
+
+/* Table Row */
+.table-row {
+    display: flex;
+    padding: 12px 16px;
+    font-size: 14px;
+    color: #fff;
+    border-bottom: 1px solid rgba(255, 255, 255, 0.15);
+    transition: background 0.2s ease;
+    font-family: 'Kanit', sans-serif;
+}
+
+.table-row:last-child {
+    border-bottom: none;
+}
+
+.table-row:hover {
+    background: rgba(255, 255, 255, 0.05);
+}
+
+/* Column Widths */
+.col-id {
+    width: 100px;
+    flex-shrink: 0;
+}
+
+.col-time {
+    flex: 1;
+    text-align: center;
+}
+
+.col-coin {
+    width: 120px;
+    flex-shrink: 0;
+    text-align: center;
+    font-weight: 700;
+}
+
+.col-status {
+    width: 80px;
+    flex-shrink: 0;
+    text-align: right;
+    font-weight: 700;
+}
+
+/* Status Colors */
+.col-coin.positive {
+    color: #b8ff84; /* Light green for winning */
+}
+
+.col-coin.negative {
+    color: #ff6b6b; /* Red for losing */
+}
+
+.col-status.won {
+    color: #b8ff84;
+}
+
+.col-status.lost {
+    color: #ff6b6b;
+}
+
+/* Scrollbar Styling */
+.history-table::-webkit-scrollbar {
+    width: 4px;
+}
+
+.history-table::-webkit-scrollbar-track {
+    background: rgba(255, 255, 255, 0.05);
+    border-radius: 2px;
+}
+
+.history-table::-webkit-scrollbar-thumb {
+    background: rgba(255, 227, 170, 0.3);
+    border-radius: 2px;
+}
+
+.history-table::-webkit-scrollbar-thumb:hover {
+    background: rgba(255, 227, 170, 0.5);
+}
+
+/* Hidden class for tab switching */
+.hidden {
+    display: none !important;
+}
+
+/* Prize History Columns */
+.col-account {
+    width: 120px;
+    flex-shrink: 0;
+}
+
+.col-value {
+    width: 140px;
+    flex-shrink: 0;
+    text-align: center;
+    font-weight: 700;
+}
+
+.usd {
+    color: rgba(255, 255, 255, 0.5);
+    font-size: 12px;
+    margin-left: 4px;
+}
+
+/* Prize Status Colors */
+.col-status.pending {
+    color: #ffe3aa; /* Yellow for pending */
+}
+
+.col-status.successful {
+    color: #b8ff84; /* Green for successful */
+}
+
+.col-status.fail {
+    color: #ff6b6b; /* Red for fail */
+}

+ 195 - 0
SicboSub/SicboSub.Web/wwwroot/css/sicbo-ranking.css

@@ -0,0 +1,195 @@
+/* Ranking Page Styles */
+
+/* Ranking Panel */
+.ranking-panel {
+    position: absolute;
+    top: 20px;
+    left: 116px;
+    right: 20px;
+    bottom: 20px;
+    display: flex;
+    flex-direction: column;
+    font-family: 'Kanit', sans-serif;
+    box-sizing: border-box;
+    padding: 16px;
+    border: 2px solid #c9a861;
+    border-radius: 16px;
+    background: rgba(0, 0, 0, 0.5);
+}
+
+/* Header */
+.ranking-header {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    margin-bottom: 16px;
+    position: relative;
+}
+
+/* Triangles */
+.header-triangles {
+    display: flex;
+    flex-direction: column;
+    gap: 2px;
+}
+
+.triangle {
+    font-size: 12px;
+    line-height: 1;
+}
+
+.triangle.red {
+    color: #ff4444;
+}
+
+/* Switch Button */
+.switch-button {
+    display: flex;
+    align-items: center;
+    gap: 8px;
+    padding: 10px 24px;
+    border-radius: 15px;
+    background: linear-gradient(180deg, #FFFFFF, #E1C59C);
+    border: 2px solid #c9a861;
+    text-decoration: none;
+    cursor: pointer;
+    transition: transform 0.2s ease;
+    margin-right: 30%;
+}
+
+.switch-button:hover {
+    transform: scale(1.05);
+}
+
+.switch-icon {
+    width: 24px;
+    height: 24px;
+    object-fit: contain;
+}
+
+.switch-text {
+    font-size: 18px;
+    font-weight: 700;
+    color: #000;
+}
+
+/* Ranking Title */
+.ranking-title {
+    display: flex;
+    flex-direction: column;
+    text-align: left;
+}
+
+.ranking-title .title-line {
+    font-size: 32px;
+    font-weight: 900;
+    font-style: Kanit;
+    line-height: 0.9;
+    transform: skewX(-10deg) rotate(-10deg);
+    background: linear-gradient(180deg, #FFE8DB 0%, #FFCD8D 100%);
+    -webkit-background-clip: text;
+    -webkit-text-fill-color: transparent;
+    background-clip: text;
+    -webkit-text-stroke: 1.5px #000;
+    filter: drop-shadow(2px 2px 2px rgba(0,0,0,0.8));
+}
+
+/* Table Header */
+.ranking-table-header {
+    display: flex;
+    padding: 12px 16px;
+    font-weight: 700;
+    font-size: 16px;
+    color: #fff;
+    border-bottom: 1px solid rgba(255, 255, 255, 0.3);
+}
+
+/* Table Body */
+.ranking-table-body {
+    flex: 1;
+    overflow-y: auto;
+}
+
+/* Table Row */
+.ranking-row {
+    display: flex;
+    padding: 12px 16px;
+    font-size: 14px;
+    color: #fff;
+    border-bottom: 1px solid rgba(255, 255, 255, 0.15);
+    transition: background 0.2s ease;
+}
+
+.ranking-row:hover {
+    background: rgba(255, 255, 255, 0.05);
+}
+
+/* Top 3 Row Styles - only left border, no background */
+.ranking-row.gold {
+    border-left: 4px solid #ffd700;
+}
+
+.ranking-row.silver {
+    border-left: 4px solid #c0c0c0;
+}
+
+.ranking-row.bronze {
+    border-left: 4px solid #00c8ff;
+}
+
+/* Column Widths */
+.col-top {
+    width: 80px;
+    flex-shrink: 0;
+    font-weight: 700;
+}
+
+.col-player {
+    flex: 1;
+    text-align: center;
+}
+
+.col-rewards {
+    width: 150px;
+    flex-shrink: 0;
+    text-align: right;
+}
+
+/* Reward Colors */
+.reward-value {
+    color: #b8ff84;
+    font-weight: 700;
+}
+
+.reward-unit {
+    color: rgba(255, 255, 255, 0.7);
+}
+
+/* Scrollbar Styling */
+.ranking-table-body::-webkit-scrollbar {
+    width: 4px;
+}
+
+.ranking-table-body::-webkit-scrollbar-track {
+    background: rgba(255, 255, 255, 0.05);
+    border-radius: 2px;
+}
+
+.ranking-table-body::-webkit-scrollbar-thumb {
+    background: rgba(255, 227, 170, 0.3);
+    border-radius: 2px;
+}
+
+.ranking-table-body::-webkit-scrollbar-thumb:hover {
+    background: rgba(255, 227, 170, 0.5);
+}
+
+/* Panel Corner Rectangle - positioned inside the border at top-right */
+.panel-corner-rectangle {
+    position: absolute;
+    top: 1px;
+    right: -2px;
+    z-index: 0;
+    pointer-events: none;
+    border-top-right-radius: 16px;
+}

+ 190 - 0
SicboSub/SicboSub.Web/wwwroot/css/sicbo-winner.css

@@ -0,0 +1,190 @@
+/* Winner Page Specific Styles */
+
+/* Winner Panel - Main content area matching history panel positioning */
+.winner-panel {
+    position: absolute;
+    top: 20px;
+    left: 116px;
+    right: 20px;
+    bottom: 20px;
+    display: flex;
+    gap: 24px;
+    justify-content: space-between;
+    align-items: stretch;
+    font-family: 'Kanit', sans-serif;
+    padding: 16px;
+    box-sizing: border-box;
+}
+
+/* Ranking Card */
+.ranking-card {
+    flex: 1;
+    position: relative;
+    border-radius: 16px;
+    overflow: hidden;
+    text-decoration: none;
+    cursor: pointer;
+    transition: transform 0.3s ease, box-shadow 0.3s ease;
+}
+
+.ranking-card:hover {
+    transform: translateY(-5px);
+    box-shadow: 0 10px 30px rgba(0, 0, 0, 0.5);
+}
+
+/* Daily Card - Golden border outside, red border inside */
+.ranking-card.daily {
+    background: transparent;
+    border: 3px solid #c9a861;
+    box-shadow: inset 0 0 0 3px #8b0000;
+}
+
+/* Monthly Card - Golden border outside, red border inside */
+.ranking-card.monthly {
+    background: transparent;
+    border: 3px solid #c9a861;
+    box-shadow: inset 0 0 0 3px #8b0000;
+}
+
+/* Card Triangles */
+.card-triangles {
+    position: absolute;
+    top: 16px;
+    left: 16px;
+    display: flex;
+    flex-direction: column;
+    gap: 2px;
+    z-index: 10;
+}
+
+.triangle {
+    font-size: 12px;
+    line-height: 1;
+}
+
+.triangle.white {
+    color: #fff;
+}
+
+.triangle.blue {
+    color: #4fc3f7;
+}
+
+/* Card Image - positioned inside the double border */
+.card-image {
+    position: absolute;
+    top: 3px;
+    left: 3px;
+    right: 3px;
+    bottom: 3px;
+    z-index: 1;
+    border-radius: 10px;
+    overflow: hidden;
+}
+
+.card-image img {
+    width: 90%;
+    height: 100%;
+    object-fit: cover;
+}
+
+/* Dice Images */
+.dice {
+    position: absolute;
+    z-index: 5;
+    pointer-events: none;
+}
+
+/* Daily Card - Dice 1 (left side, upper) */
+.ranking-card.daily .dice-1 {
+    top: 20%;
+    left: 2%;
+    width: 30%;
+    height: auto;
+    transform: rotate(-20deg);
+}
+
+/* Daily Card - Dice 2 (right of person, lower) */
+.ranking-card.daily .dice-2 {
+    top: 50%;
+    left: 70%;
+    width: 12%;
+    height: auto;
+    transform: rotate(12deg);
+}
+
+/* Monthly Card - Dice (right side near head) */
+.ranking-card.monthly .dice-monthly {
+    top: 20%;
+    right: 10%;
+    width: 12%;
+    height: auto;
+    transform: rotate(12deg);
+}
+
+/* Card Title - Base styles */
+.card-title {
+    position: absolute;
+    bottom: 20px;
+    z-index: 10;
+    display: flex;
+    flex-direction: column;
+}
+
+/* Daily Title - positioned bottom-left with skew */
+.daily-title {
+    left: 50%;
+    transform: rotate(-19deg);
+}
+
+.daily-title .title-line-1,
+.daily-title .title-line-2 {
+    font-size: 32px;
+    font-weight: 900;
+    font-style: Kanit;
+    line-height: 0.85;
+    transform: skewX(-15deg);
+    display: block;
+    /* Gradient text effect - #FFE8DB to #FFCD8D */
+    background: linear-gradient(180deg, #FFE8DB 0%, #FFCD8D 100%);
+    -webkit-background-clip: text;
+    -webkit-text-fill-color: transparent;
+    background-clip: text;
+    -webkit-text-stroke: 2px #000;
+    filter: drop-shadow(2px 2px 2px rgba(0,0,0,0.8));
+}
+
+/* Monthly Title - positioned bottom-right with skew */
+.monthly-title {
+    right: 10%;
+    left: auto;
+    text-align: right;
+    transform: rotate(-12deg);
+}
+
+.monthly-title .title-line-1,
+.monthly-title .title-line-2 {
+    font-size: 32px;
+    font-weight: 900;
+    font-style: Kanit;
+    line-height: 0.85;
+    transform: skewX(-10deg);
+    display: block;
+    /* Gradient text effect - #FFE8DB to #FFCD8D */
+    background: linear-gradient(180deg, #FFE8DB 0%, #FFCD8D 100%);
+    -webkit-background-clip: text;
+    -webkit-text-fill-color: transparent;
+    background-clip: text;
+    -webkit-text-stroke: 2px #000;
+    filter: drop-shadow(2px 2px 2px rgba(0,0,0,0.8));
+}
+
+/* Corner Rectangle - positioned at bottom-right corner */
+.corner-rectangle {
+    position: absolute;
+    bottom: 0;
+    right: 0;
+    z-index: 3;
+    pointer-events: none;
+    border-bottom-right-radius: 12px;
+}

+ 21 - 0
SicboSub/SicboSub.Web/wwwroot/img/003-sword.svg

@@ -0,0 +1,21 @@
+<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_2061_854)">
+<path d="M39.9999 13L39.9523 3.35171C39.9434 1.53069 38.4694 0.0566277 36.6483 0.0476433L27 6.52133e-05C25.0723 -0.00946604 23.2909 1.02639 22.3457 2.70639L13.6062 18.2395L21.7605 26.3937L37.2936 17.6543C38.9736 16.709 40.0094 14.9276 39.9999 13Z" fill="#F5EA72"/>
+<path d="M28.3889 0.00694021L27 6.52133e-05C25.0724 -0.00946604 23.291 1.02639 22.3458 2.70639L13.6062 18.2395L21.7605 26.3937L27.0601 23.412C18.7941 19.0078 23.3495 5.00178 28.3889 0.00694021Z" fill="#F3A977"/>
+<path d="M22.0199 18.566C21.8699 18.566 21.7199 18.5088 21.6055 18.3944C21.3766 18.1655 21.3766 17.7945 21.6055 17.5658L25.9206 13.2506C26.1496 13.0218 26.5206 13.0218 26.7493 13.2506C26.9781 13.4794 26.9781 13.8504 26.7493 14.0792L22.4341 18.3944C22.3198 18.5088 22.1698 18.566 22.0199 18.566Z" fill="#F3A977"/>
+<path d="M11.0837 23.9828L16.0151 28.9142L8.72406 36.2052L3.79268 31.2738L11.0837 23.9828Z" fill="#3685E3"/>
+<path d="M11.0817 23.9861L8.34087 26.727C9.15782 27.6326 9.96907 28.4693 10.7499 29.2501C11.5307 30.0309 12.3674 30.8422 13.2731 31.6591L16.0139 28.9183L11.0817 23.9861Z" fill="#0052B4"/>
+<path d="M8.37548 38.8018C10.125 37.0523 9.9868 35.7462 7.12024 32.8797C4.25368 30.0131 2.94766 29.875 1.19813 31.6245C-0.551398 33.374 -0.36296 36.3989 1.61899 38.3809C3.60102 40.3629 6.62595 40.5513 8.37548 38.8018Z" fill="#F5EA72"/>
+<path d="M12.7417 27.2583C10.0967 24.6133 7.08728 21.302 4.82196 16.7977C3.70845 14.5836 4.60064 11.8859 6.81485 10.7724C9.02892 9.6589 11.7266 10.5512 12.8401 12.7653C14.5284 16.1225 16.8407 18.6648 19.0879 20.9121C21.3351 23.1593 23.8774 25.4716 27.2348 27.16C29.4488 28.2733 30.3411 30.971 29.2276 33.1852C28.1141 35.3994 25.4165 36.2916 23.2024 35.178C18.698 32.9127 15.3867 29.9034 12.7417 27.2583Z" fill="#CD3D63"/>
+<path d="M26.7044 7.50475C27.4501 6.76009 27.2966 5.3973 26.3615 4.46087C25.4264 3.52445 24.0638 3.36899 23.3181 4.11365C22.5724 4.85831 22.7259 6.2211 23.661 7.15752C24.5961 8.09395 25.9587 8.24941 26.7044 7.50475Z" fill="#EDA1AB"/>
+<path d="M35.8824 16.6894C36.6281 15.9448 36.4746 14.582 35.5395 13.6456C34.6044 12.7091 33.2418 12.5537 32.4961 13.2983C31.7504 14.043 31.9039 15.4058 32.839 16.3422C33.7741 17.2786 35.1367 17.4341 35.8824 16.6894Z" fill="#EDA1AB"/>
+<path d="M27.2951 6.08815C27.1449 6.08815 26.9948 6.03081 26.8804 5.9162C26.6517 5.68714 26.652 5.3162 26.8811 5.08753L27.5575 4.41222C27.7866 4.18362 28.1576 4.18394 28.3861 4.41284C28.6148 4.6419 28.6145 5.01284 28.3854 5.24151L27.709 5.9169C27.5947 6.03105 27.4448 6.08815 27.2951 6.08815Z" fill="#565E75"/>
+<path d="M34.493 13.3001C34.3428 13.3001 34.1927 13.2427 34.0783 13.1281C33.8496 12.8991 33.8499 12.5281 34.079 12.2995L34.7554 11.6241C34.9845 11.3954 35.3555 11.3959 35.5841 11.6247C35.8127 11.8538 35.8124 12.2247 35.5834 12.4534L34.907 13.1288C34.7926 13.243 34.6427 13.3001 34.493 13.3001Z" fill="#565E75"/>
+<path d="M31.5427 10.9445C31.3925 10.9445 31.2424 10.8872 31.128 10.7726L29.23 8.87142C29.0013 8.64235 29.0016 8.27142 29.2307 8.04282C29.4597 7.81423 29.8307 7.81454 30.0594 8.04353L31.9573 9.94478C32.186 10.1738 32.1857 10.5448 31.9566 10.7734C31.8423 10.8874 31.6924 10.9445 31.5427 10.9445Z" fill="#565E75"/>
+</g>
+<defs>
+<clipPath id="clip0_2061_854">
+<rect width="40" height="40" fill="white"/>
+</clipPath>
+</defs>
+</svg>

BIN
SicboSub/SicboSub.Web/wwwroot/img/017-strategy.png


+ 21 - 0
SicboSub/SicboSub.Web/wwwroot/img/021-medal-2.svg

@@ -0,0 +1,21 @@
+<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_2061_792)">
+<path d="M35.3013 0H29.0947L23.6304 2.45809L18.1664 0H11.9601C9.47953 0 7.58482 2.21443 7.96841 4.66517L12.2259 31.8634H35.0354L39.2929 4.66517C39.6766 2.21443 37.7819 0 35.3013 0Z" fill="#E05F60"/>
+<path d="M10.4827 17.214L12.2261 28.3512H35.0355L36.7789 17.2142L35.8558 16.879L32.0353 11.9816C30.0009 9.37367 26.9377 7.87781 23.6312 7.87781C20.3238 7.87781 17.2601 9.37356 15.2256 11.9816L11.4051 16.879L10.4827 17.214Z" fill="#CD3D63"/>
+<path d="M18.8203 12.5302C20.1634 13.8524 21.927 14.6234 23.6313 14.6234C25.335 14.6234 27.0979 13.8529 28.4409 12.5316L29.0947 0H18.1664L18.8203 12.5302Z" fill="#EFEDFF"/>
+<path d="M19.8291 31.8634H27.4322L28.4409 12.5301C26.9738 11.7882 25.3351 11.3901 23.6313 11.3901C21.9269 11.3901 20.2877 11.7883 18.8202 12.5303L19.8291 31.8634Z" fill="#D4D4FF"/>
+<path d="M22.4878 43.3615L15.8582 45.2679C13.2712 46.0118 10.6743 44.125 10.5824 41.4347L10.3467 34.5406C10.3202 33.764 10.0754 33.0107 9.64044 32.3667L5.77879 26.6508C4.27185 24.4202 5.26382 21.3674 7.79402 20.4487L14.2779 18.0942C15.0083 17.829 15.6491 17.3633 16.1271 16.7507L20.37 11.3116C22.0257 9.18917 25.2356 9.18917 26.8913 11.3116L31.1342 16.7507C31.6121 17.3633 32.253 17.8289 32.9834 18.0942L39.4673 20.4487C41.9975 21.3674 42.9894 24.4203 41.4825 26.6508L37.6209 32.3667C37.1859 33.0106 36.9412 33.7639 36.9146 34.5406L36.679 41.4347C36.587 44.125 33.9902 46.0118 31.4031 45.2679L24.7736 43.3615C24.0267 43.1468 23.2346 43.1468 22.4878 43.3615Z" fill="#F5EA72"/>
+<path d="M14.7687 31.711C16.5745 31.711 18.0385 30.5452 18.0385 29.1071C18.0385 27.6689 16.5745 26.5031 14.7687 26.5031C12.9628 26.5031 11.4988 27.6689 11.4988 29.1071C11.4988 30.5452 12.9628 31.711 14.7687 31.711Z" fill="#EDA1AB"/>
+<path d="M32.4926 31.711C34.2984 31.711 35.7624 30.5452 35.7624 29.1071C35.7624 27.6689 34.2984 26.5031 32.4926 26.5031C30.6867 26.5031 29.2227 27.6689 29.2227 29.1071C29.2227 30.5452 30.6867 31.711 32.4926 31.711Z" fill="#EDA1AB"/>
+<path d="M18.2308 27.0965C17.7762 27.0965 17.4076 26.728 17.4076 26.2734C17.4076 25.869 17.0787 25.5401 16.6744 25.5401C16.27 25.5401 15.9411 25.869 15.9411 26.2734C15.9411 26.728 15.5725 27.0965 15.1179 27.0965C14.6633 27.0965 14.2947 26.728 14.2947 26.2734C14.2947 24.9612 15.3622 23.8937 16.6744 23.8937C17.9865 23.8937 19.054 24.9612 19.054 26.2734C19.054 26.7281 18.6854 27.0965 18.2308 27.0965Z" fill="#565E75"/>
+<path d="M32.1432 27.0965C31.6886 27.0965 31.32 26.728 31.32 26.2734C31.32 25.869 30.9911 25.5401 30.5869 25.5401C30.1825 25.5401 29.8536 25.869 29.8536 26.2734C29.8536 26.728 29.485 27.0965 29.0304 27.0965C28.5758 27.0965 28.2072 26.728 28.2072 26.2734C28.2072 24.9612 29.2747 23.8937 30.5869 23.8937C31.899 23.8937 32.9664 24.9612 32.9664 26.2734C32.9664 26.7281 32.5978 27.0965 32.1432 27.0965Z" fill="#565E75"/>
+<path d="M23.6307 29.6678C22.76 29.6678 21.932 29.2908 21.3592 28.6333C21.0605 28.2907 21.0962 27.7707 21.439 27.4719C21.7817 27.1732 22.3016 27.2089 22.6004 27.5517C22.8605 27.8502 23.2361 28.0215 23.6308 28.0215C24.0254 28.0215 24.4009 27.8502 24.6612 27.5517C24.9599 27.2089 25.4797 27.1733 25.8226 27.472C26.1653 27.7707 26.201 28.2907 25.9023 28.6333C25.3291 29.2908 24.5013 29.6678 23.6307 29.6678Z" fill="#565E75"/>
+<path d="M40.3434 18.0359L33.8593 15.6814C33.5821 15.5807 33.3396 15.4046 33.1582 15.1719L28.9153 9.73283C26.2292 6.28957 21.028 6.29495 18.346 9.73283L16.7307 11.8035C14.6384 15.1258 14.1614 17.7767 15.0154 20.5575L15.154 20.5071C16.339 20.0769 17.3754 19.3239 18.1511 18.3298L22.394 12.8907C23.024 12.0833 24.2398 12.0862 24.8674 12.8907L29.1104 18.3298C29.886 19.3239 30.9224 20.077 32.1073 20.5071L38.5912 22.8616C39.554 23.2112 39.9267 24.3683 39.3556 25.2139L35.4939 30.9298C34.7882 31.9745 34.3923 33.1928 34.3492 34.453L34.1135 41.3471C34.0785 42.3707 33.0933 43.0829 32.1126 42.8009L25.483 40.8947C24.2714 40.5462 22.9904 40.5462 21.7785 40.8947H21.7786L20.5156 41.2579C20.8661 43.5298 22.6129 45.0867 24.7102 46.0145L30.6938 47.735C34.8909 48.942 39.0956 45.8802 39.2445 41.5226L39.48 34.6285C39.4901 34.3335 39.5828 34.0484 39.7479 33.804L43.6096 28.088C46.0543 24.4692 44.4418 19.5241 40.3434 18.0359Z" fill="#F3A977"/>
+<path d="M20.5154 41.2576L15.1487 42.8008C14.1624 43.0842 13.1826 42.3645 13.1479 41.3469L12.9122 34.4526C12.8691 33.1925 12.4732 31.9742 11.7675 30.9296L7.90585 25.2136C7.33249 24.365 7.71115 23.2097 8.67019 22.8614L15.0154 20.5572C15.0515 17.3262 15.5768 14.2927 16.7308 11.8032L14.1031 15.1716C13.9216 15.4043 13.6791 15.5805 13.4018 15.6812L6.91783 18.0357C2.81297 19.5263 1.21086 24.4746 3.65172 28.0877L7.51337 33.8036C7.67855 34.0482 7.77118 34.3332 7.78128 34.628L8.01692 41.5221C8.16597 45.8829 12.3727 48.9408 16.5676 47.7346L23.1971 45.8283C23.4807 45.7467 23.7805 45.7468 24.064 45.8283L24.71 46.014C23.2366 45.0479 21.8056 43.381 20.5154 41.2576Z" fill="#EE8C49"/>
+</g>
+<defs>
+<clipPath id="clip0_2061_792">
+<rect width="48" height="48" fill="white"/>
+</clipPath>
+</defs>
+</svg>

+ 10 - 0
SicboSub/SicboSub.Web/wwwroot/img/021-medal.svg

@@ -0,0 +1,10 @@
+<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M18.4993 33.701L12.6951 35.37C10.4301 36.0213 8.1566 34.3694 8.07607 32.0141L7.86977 25.9783C7.84651 25.2984 7.63223 24.6389 7.25142 24.0751L3.87056 19.0708C2.55123 17.1179 3.4197 14.4453 5.63488 13.6409L11.3116 11.5795C11.9509 11.3474 12.512 10.9397 12.9305 10.4033L16.6452 5.6414C18.0947 3.78319 20.905 3.78319 22.3545 5.6414L26.0692 10.4033C26.4876 10.9397 27.0487 11.3473 27.6882 11.5795L33.3648 13.6409C35.58 14.4453 36.4484 17.118 35.1291 19.0708L31.7483 24.0751C31.3675 24.6388 31.1532 25.2983 31.1299 25.9783L30.9236 32.0141C30.8431 34.3694 28.5696 36.0213 26.3046 35.37L20.5004 33.701C19.8465 33.5131 19.1531 33.5131 18.4993 33.701Z" fill="#F5EA72"/>
+<path d="M11.7412 23.5011C13.3223 23.5011 14.604 22.4804 14.604 21.2213C14.604 19.9623 13.3223 18.9416 11.7412 18.9416C10.1602 18.9416 8.87848 19.9623 8.87848 21.2213C8.87848 22.4804 10.1602 23.5011 11.7412 23.5011Z" fill="#EDA1AB"/>
+<path d="M27.2585 23.5011C28.8395 23.5011 30.1212 22.4804 30.1212 21.2213C30.1212 19.9623 28.8395 18.9416 27.2585 18.9416C25.6774 18.9416 24.3958 19.9623 24.3958 21.2213C24.3958 22.4804 25.6774 23.5011 27.2585 23.5011Z" fill="#EDA1AB"/>
+<path d="M14.7723 19.4611C14.3743 19.4611 14.0516 19.1385 14.0516 18.7405C14.0516 18.3865 13.7636 18.0985 13.4096 18.0985C13.0556 18.0985 12.7677 18.3865 12.7677 18.7405C12.7677 19.1385 12.445 19.4611 12.047 19.4611C11.649 19.4611 11.3263 19.1385 11.3263 18.7405C11.3263 17.5917 12.2609 16.6571 13.4096 16.6571C14.5584 16.6571 15.493 17.5917 15.493 18.7405C15.493 19.1386 15.1703 19.4611 14.7723 19.4611Z" fill="#565E75"/>
+<path d="M26.9526 19.4611C26.5546 19.4611 26.2319 19.1385 26.2319 18.7405C26.2319 18.3865 25.9439 18.0985 25.59 18.0985C25.236 18.0985 24.948 18.3865 24.948 18.7405C24.948 19.1385 24.6253 19.4611 24.2273 19.4611C23.8293 19.4611 23.5067 19.1385 23.5067 18.7405C23.5067 17.5917 24.4412 16.6571 25.59 16.6571C26.7388 16.6571 27.6733 17.5917 27.6733 18.7405C27.6733 19.1386 27.3506 19.4611 26.9526 19.4611Z" fill="#565E75"/>
+<path d="M19.4999 21.7123C18.7376 21.7123 18.0127 21.3822 17.5112 20.8067C17.2497 20.5067 17.2809 20.0514 17.581 19.7898C17.8811 19.5283 18.3363 19.5596 18.5979 19.8597C18.8256 20.121 19.1544 20.271 19.5 20.271C19.8454 20.271 20.1742 20.121 20.4021 19.8597C20.6636 19.5596 21.1187 19.5284 21.4189 19.7899C21.7189 20.0514 21.7502 20.5067 21.4887 20.8067C20.9869 21.3822 20.2621 21.7123 19.4999 21.7123Z" fill="#565E75"/>
+<path d="M34.1318 11.5284L28.455 9.4671C28.2123 9.37898 28.0001 9.22476 27.8412 9.02104L24.1265 4.25916C21.7749 1.24459 17.2212 1.2493 14.8732 4.25916L13.459 6.07201C11.6271 8.98069 11.2095 11.3016 11.9572 13.7361L12.0785 13.692C13.116 13.3154 14.0234 12.6562 14.7025 11.7858L18.4172 7.02389C18.9688 6.31695 20.0332 6.31954 20.5826 7.02389L24.2974 11.7858C24.9764 12.6562 25.8837 13.3154 26.9211 13.692L32.5978 15.7534C33.4407 16.0594 33.7671 17.0725 33.267 17.8128L29.8861 22.8171C29.2683 23.7317 28.9217 24.7983 28.8839 25.9016L28.6776 31.9374C28.6469 32.8335 27.7844 33.4571 26.9258 33.2102L21.1216 31.5413C20.0608 31.2362 18.9393 31.2362 17.8783 31.5413H17.8784L16.7726 31.8593C17.0795 33.8484 18.6088 35.2114 20.445 36.0237L25.6836 37.53C29.3582 38.5867 33.0394 35.9062 33.1698 32.0911L33.376 26.0553C33.3848 25.797 33.4659 25.5474 33.6105 25.3335L36.9914 20.3291C39.1317 17.1608 37.7199 12.8314 34.1318 11.5284Z" fill="#F3A977"/>
+<path d="M16.7724 31.859L12.074 33.2101C11.2104 33.4582 10.3526 32.8281 10.3222 31.9373L10.1159 25.9013C10.0781 24.7981 9.73155 23.7315 9.11368 22.8169L5.73282 17.8126C5.23084 17.0696 5.56235 16.0581 6.40199 15.7532L11.9572 13.7359C11.9888 10.9072 12.4487 8.25131 13.459 6.07178L11.1585 9.02081C10.9996 9.22452 10.7873 9.37875 10.5445 9.46696L4.86781 11.5283C1.274 12.8333 -0.128637 17.1656 2.00833 20.3288L5.38919 25.3331C5.53381 25.5472 5.61491 25.7968 5.62375 26.0549L5.83006 32.0906C5.96055 35.9085 9.64353 38.5857 13.3161 37.5297L19.1203 35.8607C19.3686 35.7893 19.631 35.7894 19.8792 35.8607L20.4448 36.0232C19.1549 35.1775 17.9021 33.7181 16.7724 31.859Z" fill="#EE8C49"/>
+</svg>

+ 18 - 0
SicboSub/SicboSub.Web/wwwroot/img/023-hourglass.svg

@@ -0,0 +1,18 @@
+<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M6.35242 26.7772C7.34727 23.9644 10.4387 19.6515 14.0452 16.0452C17.6516 12.4388 21.9644 9.3473 24.7772 8.35245C25.7274 8.01628 26.7703 8.51386 27.1064 9.46448C27.4425 10.4147 26.9447 11.4575 25.9944 11.7936C23.4187 12.7046 19.3319 15.9204 16.6262 18.6262C13.9204 21.3319 10.7046 25.4187 9.79359 27.9944C9.4575 28.9447 8.41469 29.4425 7.46445 29.1064C6.51805 28.7717 6.01485 27.7315 6.35242 26.7772Z" fill="#FFE3AA"/>
+<path d="M23.2228 43.6476C26.0356 42.6527 30.3485 39.5612 33.9548 35.9548C37.5612 32.3484 40.6527 28.0356 41.6476 25.2228C41.9837 24.2726 41.4861 23.2297 40.5355 22.8936C39.5853 22.5575 38.5425 23.0553 38.2064 24.0056C37.2954 26.5813 34.0796 30.668 31.3738 33.3738C28.6681 36.0796 24.5813 39.2954 22.0056 40.2064C21.0554 40.5425 20.5575 41.5853 20.8936 42.5355C21.2284 43.4819 22.2685 43.9851 23.2228 43.6476Z" fill="#FFE3AA"/>
+<path d="M21.6673 21.5432C23.3928 23.1376 25.5347 23.8459 28.4262 22.7579L34.9768 22.1188L35.3442 21.9544L32.0508 17.9491L25.0539 12.1959C22.3718 14.878 21.2089 18.421 21.6673 21.5432Z" fill="#EFEDFF"/>
+<path d="M28.4262 22.7579C26.122 21.4822 23.4417 21.3027 21.6673 21.5432C21.8036 22.4717 22.0816 23.3632 22.5076 24.1835C22.6164 24.3928 22.3928 24.6164 22.1835 24.5076C18.605 22.6486 13.6755 23.5742 10.196 27.0538L15.9492 34.0508L22.9462 39.804C26.4258 36.3244 27.3513 31.395 25.4924 27.8165C25.3837 27.6071 25.6073 27.3835 25.8166 27.4923C29.3951 29.3513 34.3246 28.4256 37.8041 24.946L35.3443 21.9544L34.9769 22.1188L28.4262 22.7579Z" fill="#F3A977"/>
+<path d="M34.9768 22.1188C36.4551 23.5971 32.8988 25.2343 28.4262 22.7579C29.7461 21.746 33.6129 20.755 34.9768 22.1188Z" fill="#EE8C49"/>
+<path d="M22.8955 13.4522C24.0295 12.701 25.1025 12.109 25.9943 11.7936C26.9446 11.4575 27.4424 10.4147 27.1063 9.46448C26.7702 8.51386 25.7273 8.01628 24.7771 8.35245C23.5113 8.80011 21.9415 9.67339 20.2692 10.826L22.8955 13.4522Z" fill="#D3B023"/>
+<path d="M40.5355 22.8936C39.5853 22.5576 38.5425 23.0554 38.2064 24.0057C37.8909 24.8975 37.299 25.9705 36.5478 27.1045L39.174 29.7307C40.3266 28.0585 41.1999 26.4886 41.6476 25.2228C41.9837 24.2726 41.4861 23.2297 40.5355 22.8936Z" fill="#D3B023"/>
+<path d="M43.4113 24.1358L31.8304 12.5549C29.8943 13.1621 29.2805 15.3064 30.9158 18.0579L40.2025 27.3446C40.9874 28.1295 42.26 28.1295 43.0449 27.3446L43.4113 26.9782C44.1962 26.1933 44.1962 24.9207 43.4113 24.1358Z" fill="#E05F60"/>
+<path d="M31.8304 12.5549L25.8642 6.58869C25.0793 5.80377 23.8067 5.80377 23.0218 6.58869L22.6554 6.9551C21.8705 7.74002 21.8705 9.0126 22.6554 9.79752L30.9158 18.0579C30.364 16.5006 30.8429 13.9099 31.8304 12.5549Z" fill="#CD3D63"/>
+<path d="M8.82602 22.2693C7.67336 23.9415 6.80008 25.5114 6.35242 26.7772C6.01485 27.7315 6.51805 28.7716 7.46445 29.1064C8.41469 29.4425 9.4575 28.9447 9.79359 27.9944C10.109 27.1026 10.701 26.0295 11.4522 24.8955L8.82602 22.2693Z" fill="#D3B023"/>
+<path d="M25.1044 38.5479C23.9704 39.2991 22.8974 39.891 22.0056 40.2065C21.0554 40.5426 20.5575 41.5854 20.8936 42.5356C21.2284 43.482 22.2685 43.9853 23.2228 43.6477C24.4886 43.2 26.0584 42.3267 27.7306 41.1741L25.1044 38.5479Z" fill="#D3B023"/>
+<path d="M25.3445 42.2025L13.7637 30.6216C11.6534 30.8229 11.8297 34.2374 12.8491 36.1246L22.1358 45.4113C22.9207 46.1963 24.1933 46.1963 24.9782 45.4113L25.3446 45.0449C26.1294 44.26 26.1294 42.9874 25.3445 42.2025Z" fill="#E05F60"/>
+<path d="M13.7637 30.6216L7.7975 24.6554C7.01258 23.8705 5.74 23.8705 4.95508 24.6554L4.58868 25.0218C3.80375 25.8067 3.80375 27.0793 4.58868 27.8642L12.8491 36.1246C12.2973 34.5673 12.7762 31.9767 13.7637 30.6216Z" fill="#CD3D63"/>
+<path d="M15.6048 27.8731C15.4549 27.8731 15.3049 27.8159 15.1905 27.7015C14.9617 27.4726 14.9617 27.1016 15.1905 26.8729L15.8735 26.19C16.1023 25.9612 16.4734 25.9612 16.7021 26.19C16.9309 26.4188 16.9309 26.7898 16.7021 27.0187L16.0191 27.7016C15.9048 27.8159 15.7548 27.8731 15.6048 27.8731Z" fill="#565E75"/>
+<path d="M22.7128 34.981C22.5629 34.981 22.4129 34.9238 22.2985 34.8093C22.0697 34.5805 22.0697 34.2095 22.2985 33.9807L22.9814 33.2978C23.2102 33.069 23.5812 33.069 23.81 33.2978C24.0388 33.5266 24.0388 33.8976 23.81 34.1264L23.1271 34.8093C23.0127 34.9238 22.8627 34.981 22.7128 34.981Z" fill="#565E75"/>
+<path d="M19.995 32.3479C19.3751 32.3479 18.7787 32.1027 18.338 31.662C17.8591 31.1832 17.6112 30.5204 17.6577 29.8436C17.6798 29.5208 17.9588 29.277 18.2824 29.2993C18.6052 29.3215 18.849 29.6011 18.8268 29.924C18.8035 30.2627 18.9274 30.5942 19.1666 30.8334C19.4059 31.0726 19.7373 31.1965 20.076 31.1732C20.3987 31.1522 20.6786 31.3948 20.7008 31.7176C20.723 32.0404 20.4792 32.3202 20.1564 32.3424C20.1024 32.3461 20.0486 32.3479 19.995 32.3479Z" fill="#565E75"/>
+</svg>

+ 13 - 0
SicboSub/SicboSub.Web/wwwroot/img/032-ranking.svg

@@ -0,0 +1,13 @@
+<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M23.2987 20.3089L19.8878 21.2898C18.5567 21.6725 17.2206 20.7018 17.1733 19.3176L17.0521 15.7705C17.0384 15.3709 16.9125 14.9833 16.6887 14.6521L14.7018 11.7111C13.9265 10.5635 14.4369 8.99279 15.7386 8.52013L19.0747 7.30869C19.4504 7.17227 19.7801 6.93266 20.0261 6.6175L22.2091 3.819C23.061 2.727 24.7125 2.727 25.5643 3.819L27.7473 6.61741C27.9933 6.93258 28.3229 7.17219 28.6987 7.30861L32.0348 8.52005C33.3365 8.99279 33.8469 10.5634 33.0716 11.7111L31.0847 14.652C30.8609 14.9832 30.7349 15.3709 30.7213 15.7704L30.6 19.3175C30.5527 20.7017 29.2166 21.6724 27.8856 21.2897L24.4746 20.3088C24.0905 20.1984 23.6829 20.1984 23.2987 20.3089Z" fill="#F5EA72"/>
+<path d="M17.0863 16.7717L17.1733 19.3177C17.2206 20.7018 18.5567 21.6725 19.8877 21.2898L23.2986 20.309C23.6829 20.1985 24.0904 20.1985 24.4746 20.309L27.8856 21.2898C29.2166 21.6726 30.5527 20.7018 30.6001 19.3177L30.6871 16.7717H17.0863Z" fill="#EBCA5F"/>
+<path d="M24.1192 16.5559C23.7795 16.5559 23.504 16.2805 23.504 15.9406V10.3951H22.8025C22.4627 10.3951 22.1872 10.1198 22.1872 9.77991C22.1872 9.44005 22.4627 9.16467 22.8025 9.16467H24.1192C24.459 9.16467 24.7345 9.44005 24.7345 9.77991V15.9405C24.7345 16.2804 24.459 16.5559 24.1192 16.5559Z" fill="#6171A3"/>
+<path d="M38.9401 19.7294H18.1219C10.5982 24.8274 11.9726 41.457 23.873 45H38.9401C41.5784 45 43.7173 42.8612 43.7173 40.2227V24.5066C43.7173 21.8683 41.5785 19.7294 38.9401 19.7294Z" fill="#FFE3AA"/>
+<path d="M8.77725 19.7294C6.13888 19.7294 4 21.8682 4 24.5066V40.2227C4.00008 42.8611 6.13888 45 8.77725 45H23.873C16.4188 40.6289 16.8773 24.7502 18.1218 19.7294H8.77725Z" fill="#F3A977"/>
+<path d="M13.7103 32.3648H10.1404C8.70594 32.3648 7.54314 31.2019 7.54314 29.7675V25.8697C7.54314 24.4353 8.70594 23.2725 10.1404 23.2725H22.8026L20.827 27.8186L13.7103 32.3648Z" fill="#E05F60"/>
+<path d="M37.577 32.3648H13.7102L22.8024 23.2725H37.577C39.0115 23.2725 40.1743 24.4353 40.1743 25.8697V29.7675C40.1743 31.2019 39.0115 32.3648 37.577 32.3648Z" fill="#CD3D63"/>
+<path d="M33.4091 28.4337H29.9456C29.6059 28.4337 29.3304 28.1583 29.3304 27.8185C29.3304 27.4786 29.6059 27.2032 29.9456 27.2032H33.4091C33.7489 27.2032 34.0244 27.4786 34.0244 27.8185C34.0244 28.1583 33.7489 28.4337 33.4091 28.4337Z" fill="white"/>
+<path d="M13.7103 41.457H10.1404C8.70594 41.457 7.54314 40.2941 7.54314 38.8597V34.9619C7.54314 33.5275 8.70594 32.3646 10.1404 32.3646H22.8026L20.827 36.9108L13.7103 41.457Z" fill="#3685E3"/>
+<path d="M37.577 41.457H13.7102L22.8024 32.3646H37.577C39.0115 32.3646 40.1743 33.5275 40.1743 34.9619V38.8597C40.1743 40.2942 39.0115 41.457 37.577 41.457Z" fill="#0052B4"/>
+<path d="M33.4091 37.5261H29.9456C29.6059 37.5261 29.3304 37.2507 29.3304 36.9109C29.3304 36.571 29.6059 36.2957 29.9456 36.2957H33.4091C33.7489 36.2957 34.0244 36.571 34.0244 36.9109C34.0244 37.2507 33.7489 37.5261 33.4091 37.5261Z" fill="white"/>
+</svg>

+ 20 - 0
SicboSub/SicboSub.Web/wwwroot/img/037-inventory.svg

@@ -0,0 +1,20 @@
+<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M42.9291 19.5473L38.3339 14.9522L42.7981 10.4879C43.607 9.67907 44.9185 9.67907 45.7273 10.4879L47.3932 12.1538C48.2021 12.9627 48.2021 14.2742 47.3932 15.083L42.9291 19.5473Z" fill="#E05F60"/>
+<path d="M41.5513 21.0161L36.865 16.3298L28.5238 22.2673C27.6902 22.8606 27.1771 23.8053 27.1329 24.8275L26.9453 29.1721C26.9025 30.1633 27.7178 30.9784 28.7089 30.9357L33.0536 30.7481C34.0758 30.704 35.0204 30.1908 35.6137 29.3572L41.5513 21.0161Z" fill="#D7FFFF"/>
+<path d="M41.9803 23.997C41.083 22.5475 39.3819 20.8012 38.1858 19.6055C37.4397 18.8581 35.4536 16.8723 33.8842 15.9009C32.7911 15.2251 32.4546 13.7913 33.1306 12.6991C33.8068 11.6069 35.2402 11.2695 36.3325 11.9456C38.1631 13.0785 40.063 14.904 41.5763 16.4172C43.0248 17.8657 44.8256 19.7552 45.9358 21.5487C46.6119 22.6409 46.2745 24.0745 45.1822 24.7506C44.0864 25.4288 42.6537 25.0859 41.9803 23.997Z" fill="#CD3D63"/>
+<path d="M36.0492 23.116C34.2476 23.6337 27.1312 25.6688 22.9703 25.6688C18.8095 25.6688 11.6931 23.6337 9.89148 23.116L9.89122 23.1155C8.8792 25.6101 8.23507 28.567 7.88855 31.1717C9.21639 35.9453 12.6698 38.9531 16.0704 41.5194C18.0976 41.8432 20.4216 42 22.9704 42C25.5016 42 27.811 41.8452 29.8283 41.5259L29.8261 41.5194C33.2268 38.9531 36.6803 35.9453 38.008 31.1717L38.0495 31.1513C37.7023 28.5515 37.059 25.6035 36.0496 23.1155L36.0492 23.116Z" fill="#F5EA72"/>
+<path d="M36.0492 23.1159C35.2114 21.051 34.1218 19.3024 32.7399 18.3332H13.2009C11.819 19.3024 10.7294 21.051 9.89157 23.1159C10.658 23.8341 11.5897 24.4706 12.6647 25.0015C15.3422 26.3234 18.8095 26.9938 22.9703 26.9938C27.1312 26.9938 30.5985 26.3234 33.276 25.0015C34.3511 24.4706 35.2828 23.8341 36.0492 23.1159Z" fill="#EBCA5F"/>
+<path d="M25.2371 22.444H20.6593V34.5411C20.6593 35.058 20.8646 35.5537 21.2301 35.9192L22.1193 36.8084C22.5771 37.2662 23.3193 37.2662 23.7771 36.8084L24.6663 35.9192C25.0318 35.5537 25.2371 35.058 25.2371 34.5411V22.444Z" fill="#DAA985"/>
+<path d="M25.4097 32.747H20.4868C19.7175 32.747 19.0938 32.1233 19.0938 31.3539V29.8093C19.0938 29.0399 19.7175 28.4162 20.4868 28.4162H25.4097C26.179 28.4162 26.8028 29.0399 26.8028 29.8093V31.3539C26.8028 32.1234 26.179 32.747 25.4097 32.747Z" fill="#DE5C6E"/>
+<path d="M20.6593 26.9198C21.404 26.9687 22.1742 26.9938 22.9703 26.9938C23.7505 26.9938 24.5063 26.9702 25.2372 26.9232V22.4439H20.6594V26.9198H20.6593Z" fill="#D2896F"/>
+<path d="M22.9703 24.2758C35.9318 24.2758 38.1632 17.1783 33.5987 14.6236C30.1817 12.7113 26.415 12.3908 22.9703 12.3908C19.5257 12.3908 15.7589 12.7113 12.342 14.6236C7.77747 17.1783 10.0088 24.2758 22.9703 24.2758Z" fill="#F5EA72"/>
+<path d="M18.4169 19.9292C18.4169 21.1003 17.2249 22.0496 15.7544 22.0496C14.2839 22.0496 13.0918 21.1003 13.0918 19.9292C13.0918 18.7582 14.2839 17.8089 15.7544 17.8089C17.2249 17.8089 18.4169 18.7582 18.4169 19.9292Z" fill="#EDA1AB"/>
+<path d="M27.5238 19.9292C27.5238 21.1003 28.7158 22.0496 30.1864 22.0496C31.6569 22.0496 32.8489 21.1003 32.8489 19.9292C32.8489 18.7582 31.6569 17.8089 30.1864 17.8089C28.7158 17.8089 27.5238 18.7582 27.5238 19.9292Z" fill="#EDA1AB"/>
+<path d="M25.1171 18.3001C25.1171 16.9734 24.156 16.8488 22.9703 16.8488C21.7848 16.8488 20.8236 16.9734 20.8236 18.3001C20.8236 19.6268 21.7847 20.7022 22.9703 20.7022C24.1559 20.7022 25.1171 19.6268 25.1171 18.3001Z" fill="#565E75"/>
+<path d="M16.1994 18.0574C15.8351 18.0574 15.5398 17.7622 15.5398 17.3978V16.3106C15.5398 15.9462 15.8351 15.651 16.1994 15.651C16.5637 15.651 16.859 15.9462 16.859 16.3106V17.3978C16.859 17.7622 16.5637 18.0574 16.1994 18.0574Z" fill="#565E75"/>
+<path d="M29.7413 18.0574C29.377 18.0574 29.0817 17.7622 29.0817 17.3978V16.3106C29.0817 15.9462 29.377 15.651 29.7413 15.651C30.1055 15.651 30.4009 15.9462 30.4009 16.3106V17.3978C30.4009 17.7622 30.1055 18.0574 29.7413 18.0574Z" fill="#565E75"/>
+<path d="M14.0464 21.1269V24.3879C14.0464 25.7929 12.9075 26.9318 11.5025 26.9318H8.24148C7.54318 26.9318 6.87354 26.6544 6.37971 26.1607L3.74171 23.5227C3.24797 23.0289 2.97058 22.3592 2.97058 21.6609V18.3999C2.97058 16.9949 4.10951 15.856 5.51448 15.856H8.77551C9.47381 15.856 10.1434 16.1334 10.6373 16.6271L13.2753 19.2651C13.769 19.759 14.0464 20.4287 14.0464 21.1269Z" fill="#E05F60"/>
+<path d="M7.01373 21.0818C6.64945 21.0818 6.35412 20.7866 6.35412 20.4222V19.3441C6.35412 18.9797 6.64945 18.6844 7.01373 18.6844C7.37801 18.6844 7.67334 18.9797 7.67334 19.3441V20.4222C7.67334 20.7866 7.37801 21.0818 7.01373 21.0818Z" fill="#E05F60"/>
+<path d="M7.88847 31.1716C7.67053 32.8096 7.57001 34.3087 7.57001 35.4655C7.57001 38.7245 10.8251 40.6815 16.0704 41.5194C15.9897 36.1215 11.2973 32.2553 7.88847 31.1716Z" fill="#DAA985"/>
+<path d="M38.0079 31.1716C38.2259 32.8096 38.3264 34.3087 38.3264 35.4655C38.3264 38.7245 35.0714 40.6815 29.826 41.5194C29.9067 36.1215 34.5991 32.2553 38.0079 31.1716Z" fill="#DAA985"/>
+</svg>

BIN
SicboSub/SicboSub.Web/wwwroot/img/042-settings.png


+ 21 - 0
SicboSub/SicboSub.Web/wwwroot/img/046-esports.svg

@@ -0,0 +1,21 @@
+<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_4001_459)">
+<path d="M31.3411 32.2773L32.5472 21.4223L43.9807 16.3275C44.8401 15.9446 45.7427 16.7706 45.4373 17.6605L44.0122 21.8137C43.7996 22.4332 44.4279 23.0081 45.0262 22.7416L46.4827 22.0926C47.3421 21.7096 48.2447 22.5356 47.9393 23.4255L47.4742 24.7813C46.2382 28.3832 43.0393 30.9518 39.2555 31.3805L31.3411 32.2773Z" fill="#FFE3AA"/>
+<path d="M42.1199 19.4695C42.1646 18.7146 42.1096 17.9607 41.9621 17.2269L32.5472 21.4222L31.3411 32.2773L38.7939 31.4328C40.7231 27.4888 41.8929 23.3049 42.1199 19.4695Z" fill="#D3B023"/>
+<path d="M34.1067 28.1854C33.8375 28.1854 33.5807 28.0301 33.464 27.7683C33.306 27.4136 33.4655 26.9979 33.8201 26.8399L41.1875 23.557C41.542 23.3989 41.9578 23.5584 42.1159 23.913C42.2739 24.2677 42.1145 24.6835 41.7598 24.8414L34.3925 28.1244C34.2995 28.1658 34.2023 28.1854 34.1067 28.1854Z" fill="#A94F00"/>
+<path d="M16.6589 32.2773L15.4528 21.4222L4.01934 16.3276C3.15994 15.9446 2.25731 16.7706 2.56275 17.6605L3.98784 21.8137C4.20047 22.4332 3.57206 23.0082 2.97384 22.7417L1.51734 22.0926C0.657935 21.7097 -0.24469 22.5357 0.060654 23.4256L0.525841 24.7814C1.76175 28.3833 4.96069 30.9518 8.74453 31.3806L16.6589 32.2773Z" fill="#FFE3AA"/>
+<path d="M16.6589 32.2773L15.4528 21.4223L6.03788 17.2271C5.89041 17.9607 5.83538 18.7146 5.88009 19.4694C6.11747 23.4798 7.35863 27.6485 9.20775 31.4331L16.6589 32.2773Z" fill="#D3B023"/>
+<path d="M13.8933 28.1854C13.7977 28.1854 13.7005 28.1658 13.6075 28.1244L6.24009 24.8414C5.88544 24.6834 5.72597 24.2677 5.88403 23.913C6.04209 23.5585 6.45759 23.399 6.81244 23.557L14.1798 26.8399C14.5344 26.9979 14.6939 27.4137 14.5358 27.7683C14.4194 28.03 14.1624 28.1854 13.8933 28.1854Z" fill="#A94F00"/>
+<path d="M25.9597 38.3178C30.6193 35.1358 35.8414 26.7113 36.3052 18.875C36.3483 18.1468 36.083 17.4343 35.5852 16.9012C32.7636 13.8798 28.1468 11.0042 24 11.0042C19.8533 11.0042 15.2364 13.8798 12.4148 16.9012C11.9169 17.4343 11.6517 18.1468 11.6948 18.875C12.1586 26.7114 17.3807 35.1358 22.0403 38.3178C23.221 39.124 24.779 39.124 25.9597 38.3178Z" fill="#E05F60"/>
+<path d="M37.6301 14.8899C34.7208 11.7745 29.4052 8.13647 24 8.13647C18.5947 8.13647 13.2792 11.7745 10.3699 14.8899C9.25922 16.0793 8.67693 17.686 8.77246 19.2981C9.00853 23.2868 10.3902 27.7242 12.6629 31.7926C14.7723 35.5687 17.5217 38.7855 20.2062 40.6188C21.3282 41.3849 22.6402 41.79 24.0001 41.79C25.36 41.79 26.672 41.3849 27.794 40.6187C30.4785 38.7856 33.2279 35.5687 35.3373 31.7926C37.61 27.7243 38.9917 23.2869 39.2277 19.2983C39.3231 17.686 38.7408 16.0793 37.6301 14.8899ZM35.8532 19.0985C35.4065 26.647 30.3761 34.7621 25.8877 37.8272C24.7504 38.6038 23.2496 38.6038 22.1123 37.8272C17.6238 34.7621 12.5935 26.6469 12.1468 19.0985C12.1053 18.397 12.3608 17.7107 12.8404 17.1971C15.5584 14.2868 20.0055 11.5167 24 11.5167C27.9945 11.5167 32.4417 14.2868 35.1596 17.1971C35.6392 17.7107 35.8947 18.397 35.8532 19.0985Z" fill="#FFC7C7"/>
+<path d="M28.7767 22.946H27.294C26.8599 22.946 26.558 22.5146 26.7064 22.1068L28.3455 17.6035C28.5502 17.0409 28.1336 16.4459 27.535 16.4459H22.7893C22.1287 16.4459 21.5386 16.8591 21.3127 17.4799L19.2968 23.0183C19.0921 23.5809 19.5087 24.1758 20.1073 24.1758H21.5906C22.0247 24.1758 22.3267 24.6071 22.1782 25.015L20.6642 29.1748C20.3984 29.905 21.2548 30.5272 21.8671 30.0487L29.2388 24.2878C29.8011 23.8483 29.4904 22.946 28.7767 22.946Z" fill="#F5EA72"/>
+<path d="M34.312 36.0193C31.5161 34.9531 28.0446 34.1991 24 34.1991C22.6921 34.1991 21.445 34.279 20.2604 34.4217C17.4083 36.6666 17.8368 41.181 22.6585 42.351C23.0984 42.3327 23.5455 42.3228 24 42.3228C27.5428 42.3228 30.6459 42.9013 33.2405 43.7614C34.5216 44.1861 35.8419 43.2319 35.8419 41.8822V38.2415C35.8419 37.2551 35.2338 36.3706 34.312 36.0193Z" fill="#F5EA72"/>
+<path d="M14.7595 43.7615C17.0212 43.0118 19.6696 42.4763 22.6585 42.3512C19.6867 40.7538 19.1198 36.9207 20.2604 34.4218C17.7818 34.7204 15.5797 35.2978 13.688 36.0193C12.7662 36.3707 12.1581 37.2551 12.1581 38.2416V41.8823C12.1581 43.2319 13.4784 44.1861 14.7595 43.7615Z" fill="#EBCA5F"/>
+<path d="M30.164 39.5805C30.1168 39.5805 30.0689 39.5756 30.021 39.5658C28.0889 39.1665 26.0632 38.9641 24 38.9641C21.9368 38.9641 19.9111 39.1665 17.979 39.5658C17.5987 39.6445 17.2267 39.3997 17.1482 39.0195C17.0696 38.6391 17.3141 38.2672 17.6945 38.1887C19.7199 37.7701 21.8414 37.5579 24 37.5579C26.1586 37.5579 28.2801 37.7702 30.3055 38.1887C30.6859 38.2672 30.9304 38.6392 30.8518 39.0195C30.7832 39.3518 30.4904 39.5805 30.164 39.5805Z" fill="#A94F00"/>
+</g>
+<defs>
+<clipPath id="clip0_4001_459">
+<rect width="48" height="48" fill="white"/>
+</clipPath>
+</defs>
+</svg>

+ 15 - 0
SicboSub/SicboSub.Web/wwwroot/img/Frame 1244831299.svg

@@ -0,0 +1,15 @@
+<svg width="12" height="28" viewBox="0 0 12 28" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_2059_385)">
+<path d="M0 0H1.70455V21.3068C1.70455 21.7775 1.32297 22.1591 0.852273 22.1591C0.381576 22.1591 0 21.7775 0 21.3068V0Z" fill="url(#paint0_linear_2059_385)"/>
+<path d="M11.0791 1.71484C10.938 1.70824 10.796 1.7041 10.6533 1.7041C5.71108 1.70415 1.70416 5.71108 1.7041 10.6533C1.7041 10.796 1.70824 10.938 1.71484 11.0791H0V0H11.0791V1.71484Z" fill="#FF83A9"/>
+</g>
+<defs>
+<linearGradient id="paint0_linear_2059_385" x1="0.852273" y1="11.0795" x2="0.852273" y2="22.1591" gradientUnits="userSpaceOnUse">
+<stop stop-color="#FF83A9"/>
+<stop offset="1" stop-color="#FF83A9" stop-opacity="0"/>
+</linearGradient>
+<clipPath id="clip0_2059_385">
+<rect width="11.0795" height="27.2727" fill="white"/>
+</clipPath>
+</defs>
+</svg>

+ 15 - 0
SicboSub/SicboSub.Web/wwwroot/img/Frame 1244831300.svg

@@ -0,0 +1,15 @@
+<svg width="12" height="14" viewBox="0 0 12 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_2059_390)">
+<path d="M11.0795 0H9.375V12.7841C9.375 13.2548 9.75658 13.6364 10.2273 13.6364C10.698 13.6364 11.0795 13.2548 11.0795 12.7841V0Z" fill="url(#paint0_linear_2059_390)"/>
+<path d="M0.000443459 1.71484C0.141505 1.70824 0.283528 1.7041 0.426225 1.7041C5.36846 1.70417 9.37539 5.71109 9.37544 10.6533C9.37544 10.796 9.37131 10.938 9.3647 11.0791H11.0795V0H0.000443459V1.71484Z" fill="#FF83A9"/>
+</g>
+<defs>
+<linearGradient id="paint0_linear_2059_390" x1="10.2273" y1="11.0795" x2="10.2273" y2="13.6364" gradientUnits="userSpaceOnUse">
+<stop stop-color="#FF83A9"/>
+<stop offset="1" stop-color="#FF83A9" stop-opacity="0"/>
+</linearGradient>
+<clipPath id="clip0_2059_390">
+<rect width="11.0795" height="13.6364" fill="white" transform="matrix(-1 0 0 1 11.0795 0)"/>
+</clipPath>
+</defs>
+</svg>

+ 15 - 0
SicboSub/SicboSub.Web/wwwroot/img/Frame 1244831301.svg

@@ -0,0 +1,15 @@
+<svg width="12" height="14" viewBox="0 0 12 14" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_2059_396)">
+<path d="M0 13.6364H1.70455V0.852273C1.70455 0.381576 1.32297 2.38419e-07 0.852273 2.38419e-07C0.381576 2.38419e-07 0 0.381576 0 0.852273V13.6364Z" fill="url(#paint0_linear_2059_396)"/>
+<path d="M11.0791 11.9215C10.938 11.9281 10.796 11.9323 10.6533 11.9323C5.71107 11.9322 1.70414 7.9253 1.7041 2.98304C1.7041 2.84033 1.70824 2.69834 1.71484 2.55726H0V13.6364H11.0791V11.9215Z" fill="#DB2C5A"/>
+</g>
+<defs>
+<linearGradient id="paint0_linear_2059_396" x1="0.852273" y1="2.55682" x2="0.852273" y2="0" gradientUnits="userSpaceOnUse">
+<stop stop-color="#DB2C5A"/>
+<stop offset="1" stop-color="#DB2C5A" stop-opacity="0"/>
+</linearGradient>
+<clipPath id="clip0_2059_396">
+<rect width="11.0795" height="13.6364" fill="white" transform="matrix(1 0 0 -1 0 13.6364)"/>
+</clipPath>
+</defs>
+</svg>

+ 15 - 0
SicboSub/SicboSub.Web/wwwroot/img/Frame 1244831302.svg

@@ -0,0 +1,15 @@
+<svg width="12" height="23" viewBox="0 0 12 23" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_2059_401)">
+<path d="M11.0795 22.1591H9.375V0.8523C9.375 0.381603 9.75658 2.95639e-05 10.2273 2.95639e-05C10.698 2.95639e-05 11.0795 0.381605 11.0795 0.852302V22.1591Z" fill="url(#paint0_linear_2059_401)"/>
+<path d="M0.000443459 20.4443C0.141506 20.4509 0.283528 20.455 0.426225 20.455C5.36847 20.455 9.3754 16.448 9.37544 11.5058C9.37544 11.3631 9.37131 11.2211 9.3647 11.08H11.0795V22.1591H0.000443459V20.4443Z" fill="#DB2C5A"/>
+</g>
+<defs>
+<linearGradient id="paint0_linear_2059_401" x1="10.2273" y1="10.6534" x2="10.2273" y2="2.73402e-05" gradientUnits="userSpaceOnUse">
+<stop stop-color="#DB2C5A"/>
+<stop offset="1" stop-color="#DB2C5A" stop-opacity="0.352941"/>
+</linearGradient>
+<clipPath id="clip0_2059_401">
+<rect width="11.0795" height="22.1591" fill="white" transform="matrix(-1 0 0 -1 11.0795 22.1591)"/>
+</clipPath>
+</defs>
+</svg>

BIN
SicboSub/SicboSub.Web/wwwroot/img/Group.png


BIN
SicboSub/SicboSub.Web/wwwroot/img/Group1.png


BIN
SicboSub/SicboSub.Web/wwwroot/img/GroupN.png


BIN
SicboSub/SicboSub.Web/wwwroot/img/Rectangle_Blue.png


BIN
SicboSub/SicboSub.Web/wwwroot/img/Rectangle_Blue_T.png


BIN
SicboSub/SicboSub.Web/wwwroot/img/Rectangle_Red.png


BIN
SicboSub/SicboSub.Web/wwwroot/img/Rectangle_red_T.png


+ 17 - 0
SicboSub/SicboSub.Web/wwwroot/img/Vector.svg

@@ -0,0 +1,17 @@
+<svg width="7" height="5" viewBox="0 0 7 5" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g filter="url(#filter0_i_2059_407)">
+<path d="M4.55551 4.26136H2.26267C0.995575 4.26136 0 3.29545 0 2.13068C0 0.9375 1.02574 0 2.26267 0H4.55551C5.82261 0 6.81818 0.965909 6.81818 2.13068C6.81818 3.32386 5.79244 4.26136 4.55551 4.26136Z" fill="#9E1838"/>
+</g>
+<defs>
+<filter id="filter0_i_2059_407" x="0" y="0" width="6.81818" height="5.11363" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
+<feFlood flood-opacity="0" result="BackgroundImageFix"/>
+<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
+<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
+<feOffset dy="0.852273"/>
+<feGaussianBlur stdDeviation="1.70455"/>
+<feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1"/>
+<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"/>
+<feBlend mode="normal" in2="shape" result="effect1_innerShadow_2059_407"/>
+</filter>
+</defs>
+</svg>

BIN
SicboSub/SicboSub.Web/wwwroot/img/avatar.png


BIN
SicboSub/SicboSub.Web/wwwroot/img/daily-ranking.png


BIN
SicboSub/SicboSub.Web/wwwroot/img/image-1.png


BIN
SicboSub/SicboSub.Web/wwwroot/img/image-2.png


BIN
SicboSub/SicboSub.Web/wwwroot/img/monthly-ranking.png


+ 3 - 0
SicboSub/SicboSub.Web/wwwroot/img/rectangle-314.svg

@@ -0,0 +1,3 @@
+<svg width="237" height="18" viewBox="0 0 237 18" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M0 0H236.08V17.0455H0V0Z" fill="#E03459"/>
+</svg>

+ 3 - 0
SicboSub/SicboSub.Web/wwwroot/img/rectangle-315.svg

@@ -0,0 +1,3 @@
+<svg width="237" height="18" viewBox="0 0 237 18" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M236.08 17.0455H-1.00136e-05V1.74046e-05H236.08V17.0455Z" fill="#720D2E"/>
+</svg>

+ 3 - 0
SicboSub/SicboSub.Web/wwwroot/img/rectangle-316.svg

@@ -0,0 +1,3 @@
+<svg width="14" height="75" viewBox="0 0 14 75" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M0 17.0455L13.6364 0V75L0 57.9545V17.0455Z" fill="#8E1031"/>
+</svg>

+ 3 - 0
SicboSub/SicboSub.Web/wwwroot/img/rectangle-317.svg

@@ -0,0 +1,3 @@
+<svg width="14" height="75" viewBox="0 0 14 75" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M13.6364 17.0455L-1.14441e-05 0V75L13.6364 57.9545V17.0455Z" fill="#B21844"/>
+</svg>

+ 36 - 0
SicboSub/SicboSub.sln

@@ -3,7 +3,43 @@ Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio Version 17
 VisualStudioVersion = 17.14.36203.30 d17.14
 MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SicboSub.Web", "SicboSub.Web\SicboSub.Web.csproj", "{81272015-FBBC-41EC-A3B4-0014631F267D}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Database", "Database\Database.csproj", "{D6A5D156-E0A2-4590-ABA0-ECE74DCE914C}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SicboSub.Api", "SicboSub.Api\SicboSub.Api.csproj", "{CBF3997B-FD6F-4B3A-BF85-AB39FE7A18AA}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common", "Common\Common.csproj", "{2F249CA4-9B10-4ACD-A4C6-1512B11A49E2}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SicboSub.StartProcedure", "SicboSub.StartProcedure\SicboSub.StartProcedure.csproj", "{0812B965-CA70-C2C7-0CB6-0AC2733E4DE6}"
+EndProject
 Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{81272015-FBBC-41EC-A3B4-0014631F267D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{81272015-FBBC-41EC-A3B4-0014631F267D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{81272015-FBBC-41EC-A3B4-0014631F267D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{81272015-FBBC-41EC-A3B4-0014631F267D}.Release|Any CPU.Build.0 = Release|Any CPU
+		{D6A5D156-E0A2-4590-ABA0-ECE74DCE914C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{D6A5D156-E0A2-4590-ABA0-ECE74DCE914C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{D6A5D156-E0A2-4590-ABA0-ECE74DCE914C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{D6A5D156-E0A2-4590-ABA0-ECE74DCE914C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{CBF3997B-FD6F-4B3A-BF85-AB39FE7A18AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{CBF3997B-FD6F-4B3A-BF85-AB39FE7A18AA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{CBF3997B-FD6F-4B3A-BF85-AB39FE7A18AA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{CBF3997B-FD6F-4B3A-BF85-AB39FE7A18AA}.Release|Any CPU.Build.0 = Release|Any CPU
+		{2F249CA4-9B10-4ACD-A4C6-1512B11A49E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{2F249CA4-9B10-4ACD-A4C6-1512B11A49E2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{2F249CA4-9B10-4ACD-A4C6-1512B11A49E2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{2F249CA4-9B10-4ACD-A4C6-1512B11A49E2}.Release|Any CPU.Build.0 = Release|Any CPU
+		{0812B965-CA70-C2C7-0CB6-0AC2733E4DE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{0812B965-CA70-C2C7-0CB6-0AC2733E4DE6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{0812B965-CA70-C2C7-0CB6-0AC2733E4DE6}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{0812B965-CA70-C2C7-0CB6-0AC2733E4DE6}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
 	EndGlobalSection