83 changed files with 5279 additions and 0 deletions
			
			
		| @ -0,0 +1,25 @@ | |||
|  | |||
| Microsoft Visual Studio Solution File, Format Version 12.00 | |||
| # Visual Studio Version 17 | |||
| VisualStudioVersion = 17.5.33530.505 | |||
| MinimumVisualStudioVersion = 10.0.40219.1 | |||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Cloud_Manager", "Cloud_Manager\Cloud_Manager.csproj", "{D2BD9F08-9AD5-4ECB-B60F-C507F6DB0B22}" | |||
| EndProject | |||
| Global | |||
| 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | |||
| 		Debug|Any CPU = Debug|Any CPU | |||
| 		Release|Any CPU = Release|Any CPU | |||
| 	EndGlobalSection | |||
| 	GlobalSection(ProjectConfigurationPlatforms) = postSolution | |||
| 		{D2BD9F08-9AD5-4ECB-B60F-C507F6DB0B22}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||
| 		{D2BD9F08-9AD5-4ECB-B60F-C507F6DB0B22}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||
| 		{D2BD9F08-9AD5-4ECB-B60F-C507F6DB0B22}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||
| 		{D2BD9F08-9AD5-4ECB-B60F-C507F6DB0B22}.Release|Any CPU.Build.0 = Release|Any CPU | |||
| 	EndGlobalSection | |||
| 	GlobalSection(SolutionProperties) = preSolution | |||
| 		HideSolutionNode = FALSE | |||
| 	EndGlobalSection | |||
| 	GlobalSection(ExtensibilityGlobals) = postSolution | |||
| 		SolutionGuid = {B00F402F-EC33-41CE-9AEE-FB56B36DEEE3} | |||
| 	EndGlobalSection | |||
| EndGlobal | |||
								
									
										File diff suppressed because it is too large
									
								
							
						
					| @ -0,0 +1,280 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using Cloud_Manager.Models.ClientContractModels; | |||
| using Microsoft.EntityFrameworkCore; | |||
| 
 | |||
| namespace Cloud_Manager; | |||
| /// <summary>
 | |||
| /// This is the main EF DbContext for the Biskilog Accounting
 | |||
| /// </summary>
 | |||
| public partial class BiskilogContext : DbContext | |||
| { | |||
|     public BiskilogContext() | |||
|     { | |||
|     } | |||
|     public BiskilogContext(DbContextOptions<BiskilogContext> options) | |||
|         : base(options) | |||
|     { | |||
|     } | |||
| 
 | |||
|     public virtual DbSet<Authtype> Authtypes { get; set; } | |||
| 
 | |||
|     public virtual DbSet<Clientbusiness> Clientbusinesses { get; set; } | |||
| 
 | |||
|     public virtual DbSet<Clientinfo> Clientinfos { get; set; } | |||
| 
 | |||
|     public virtual DbSet<Contract> Contracts { get; set; } | |||
| 
 | |||
|     public virtual DbSet<Databasemap> Databasemaps { get; set; } | |||
| 
 | |||
|     public virtual DbSet<Siteaccesspermission> Siteaccesspermissions { get; set; } | |||
| 
 | |||
|     public virtual DbSet<Userauth> Userauths { get; set; } | |||
| 
 | |||
|     protected override void OnModelCreating(ModelBuilder modelBuilder) | |||
|     { | |||
|         modelBuilder | |||
|             .UseCollation("utf8mb4_general_ci") | |||
|             .HasCharSet("utf8mb4"); | |||
| 
 | |||
|         modelBuilder.Entity<Authtype>(entity => | |||
|         { | |||
|             entity.HasKey(e => e.Id).HasName("PRIMARY"); | |||
| 
 | |||
|             entity | |||
|                 .ToTable("authtypes") | |||
|                 .HasCharSet("utf8") | |||
|                 .UseCollation("utf8_general_ci"); | |||
| 
 | |||
|             entity.Property(e => e.Id) | |||
|                 .HasColumnType("int(11)") | |||
|                 .HasColumnName("id"); | |||
|             entity.Property(e => e.Type) | |||
|                 .HasMaxLength(50) | |||
|                 .HasColumnName("type") | |||
|                 .UseCollation("utf8mb4_general_ci") | |||
|                 .HasCharSet("utf8mb4"); | |||
|         }); | |||
| 
 | |||
|         modelBuilder.Entity<Clientbusiness>(entity => | |||
|         { | |||
|             entity.HasKey(e => new { e.BusinessId, e.ClientId }) | |||
|                 .HasName("PRIMARY") | |||
|                 .HasAnnotation("MySql:IndexPrefixLength", new[] { 0, 0 }); | |||
| 
 | |||
|             entity | |||
|                 .ToTable("clientbusiness") | |||
|                 .HasCharSet("utf8") | |||
|                 .UseCollation("utf8_general_ci"); | |||
| 
 | |||
|             entity.Property(e => e.BusinessId) | |||
|                 .HasComment("there could be multiple branches of the same  business") | |||
|                 .HasColumnType("int(11)") | |||
|                 .HasColumnName("businessId"); | |||
|             entity.Property(e => e.ClientId) | |||
|                 .HasColumnType("int(11)") | |||
|                 .HasColumnName("clientID"); | |||
|             entity.Property(e => e.BiskilogVersion) | |||
|                 .HasMaxLength(50) | |||
|                 .HasDefaultValueSql("''") | |||
|                 .HasColumnName("biskilog_version") | |||
|                 .UseCollation("utf8mb4_general_ci") | |||
|                 .HasCharSet("utf8mb4"); | |||
|             entity.Property(e => e.BusinessName) | |||
|                 .HasMaxLength(50) | |||
|                 .HasDefaultValueSql("''") | |||
|                 .HasColumnName("business_name") | |||
|                 .UseCollation("utf8mb4_general_ci") | |||
|                 .HasCharSet("utf8mb4"); | |||
|             entity.Property(e => e.DateJoined) | |||
|                 .HasDefaultValueSql("current_timestamp()") | |||
|                 .HasColumnType("datetime") | |||
|                 .HasColumnName("date_joined"); | |||
|             entity.Property(e => e.BusinessExternalId) | |||
|                 .HasMaxLength(50) | |||
|                 .HasDefaultValueSql("''") | |||
|                 .HasColumnName("businessExternalId") | |||
|                 .UseCollation("utf8mb4_general_ci") | |||
|                 .HasCharSet("utf8mb4"); | |||
| 
 | |||
|         }); | |||
| 
 | |||
|         modelBuilder.Entity<Clientinfo>(entity => | |||
|         { | |||
|             entity.HasKey(e => e.ClientId).HasName("PRIMARY"); | |||
| 
 | |||
|             entity | |||
|                 .ToTable("clientinfo") | |||
|                 .HasCharSet("utf8") | |||
|                 .UseCollation("utf8_general_ci"); | |||
| 
 | |||
|             entity.Property(e => e.ClientId) | |||
|                 .HasColumnType("int(11)") | |||
|                 .HasColumnName("clientID"); | |||
|             entity.Property(e => e.Email) | |||
|                 .HasMaxLength(200) | |||
|                 .HasColumnName("email") | |||
|                 .UseCollation("utf8mb4_general_ci") | |||
|                 .HasCharSet("utf8mb4"); | |||
|             entity.Property(e => e.Fullname) | |||
|                 .HasMaxLength(200) | |||
|                 .UseCollation("utf8mb4_general_ci") | |||
|                 .HasCharSet("utf8mb4"); | |||
|             entity.Property(e => e.PhoneNumber) | |||
|                 .HasMaxLength(200) | |||
|                 .HasColumnName("phoneNumber") | |||
|                 .UseCollation("utf8mb4_general_ci") | |||
|                 .HasCharSet("utf8mb4"); | |||
|         }); | |||
| 
 | |||
|         modelBuilder.Entity<Contract>(entity => | |||
|         { | |||
|             entity.HasKey(e => e.ContractId).HasName("PRIMARY"); | |||
| 
 | |||
|             entity | |||
|                 .ToTable("contracts") | |||
|                 .HasCharSet("utf8") | |||
|                 .UseCollation("utf8_general_ci"); | |||
| 
 | |||
|             entity.HasIndex(e => new { e.ClientId, e.BusinessId }, "clientId_businessId").IsUnique(); | |||
| 
 | |||
|             entity.Property(e => e.ContractId) | |||
|                 .HasColumnType("int(11)") | |||
|                 .HasColumnName("contractId"); | |||
|             entity.Property(e => e.Bill) | |||
|                 .HasPrecision(18, 2) | |||
|                 .HasColumnName("bill"); | |||
|             entity.Property(e => e.BusinessId) | |||
|                 .HasColumnType("int(11)") | |||
|                 .HasColumnName("businessId"); | |||
|             entity.Property(e => e.ClientId) | |||
|                 .HasColumnType("int(11)") | |||
|                 .HasColumnName("clientId"); | |||
|             entity.Property(e => e.Comments) | |||
|                 .HasColumnType("text") | |||
|                 .HasColumnName("comments") | |||
|                 .UseCollation("utf8mb4_general_ci") | |||
|                 .HasCharSet("utf8mb4"); | |||
|             entity.Property(e => e.EndDate) | |||
|                 .HasColumnType("datetime") | |||
|                 .HasColumnName("end_date"); | |||
|             entity.Property(e => e.StartDate) | |||
|                 .HasColumnType("datetime") | |||
|                 .HasColumnName("start_date"); | |||
|         }); | |||
| 
 | |||
|         modelBuilder.Entity<Databasemap>(entity => | |||
|         { | |||
|             entity.HasKey(e => e.DbNo).HasName("PRIMARY"); | |||
| 
 | |||
|             entity | |||
|                 .ToTable("databasemap") | |||
|                 .HasCharSet("utf8") | |||
|                 .UseCollation("utf8_general_ci"); | |||
| 
 | |||
|             entity.HasIndex(e => e.ClientId, "businessId").IsUnique(); | |||
| 
 | |||
|             entity.Property(e => e.DbNo) | |||
|                 .HasColumnType("int(11)") | |||
|                 .HasColumnName("db_no"); | |||
|             entity.Property(e => e.ClientId) | |||
|                 .HasColumnType("int(11)") | |||
|                 .HasColumnName("clientID"); | |||
|             entity.Property(e => e.DbName) | |||
|                 .HasMaxLength(50) | |||
|                 .HasDefaultValueSql("''") | |||
|                 .HasColumnName("db_name") | |||
|                 .UseCollation("utf8mb4_general_ci") | |||
|                 .HasCharSet("utf8mb4"); | |||
|             entity.Property(e => e.Domain) | |||
|                 .HasMaxLength(50) | |||
|                 .HasDefaultValueSql("''") | |||
|                 .HasColumnName("domain") | |||
|                 .UseCollation("utf8mb4_general_ci") | |||
|                 .HasCharSet("utf8mb4"); | |||
|             entity.Property(e => e.LastSyncDate) | |||
|             .HasColumnType("datetime") | |||
|                 .HasColumnName("last_sync_date"); | |||
|         }); | |||
| 
 | |||
|         modelBuilder.Entity<Siteaccesspermission>(entity => | |||
|         { | |||
|             entity.HasKey(e => new { e.UserId, e.BusinessId, e.ClientId }) | |||
|                 .HasName("PRIMARY") | |||
|                 .HasAnnotation("MySql:IndexPrefixLength", new[] { 0, 0, 0 }); | |||
| 
 | |||
|             entity | |||
|                 .ToTable("siteaccesspermission") | |||
|                 .HasCharSet("utf8") | |||
|                 .UseCollation("utf8_general_ci"); | |||
| 
 | |||
|             entity.Property(e => e.UserId) | |||
|                 .HasColumnType("int(11)") | |||
|                 .HasColumnName("userID"); | |||
|             entity.Property(e => e.BusinessId) | |||
|                 .HasComment("businessIds could also been seen as branchID") | |||
|                 .HasColumnType("int(11)") | |||
|                 .HasColumnName("businessId"); | |||
|             entity.Property(e => e.ClientId) | |||
|                 .HasColumnType("int(11)") | |||
|                 .HasColumnName("clientId"); | |||
|         }); | |||
| 
 | |||
|         modelBuilder.Entity<Userauth>(entity => | |||
|         { | |||
|             entity.HasKey(e => e.UserId).HasName("PRIMARY"); | |||
| 
 | |||
|             entity | |||
|                 .ToTable("userauth") | |||
|                 .HasCharSet("utf8") | |||
|                 .UseCollation("utf8_general_ci"); | |||
| 
 | |||
|             entity.HasIndex(e => e.AuthType, "authType"); | |||
| 
 | |||
|             entity.HasIndex(e => new { e.ClientId, e.Username, e.Email }, "clientId_username_email").IsUnique(); | |||
| 
 | |||
|             entity.Property(e => e.UserId) | |||
|                 .HasColumnType("int(11)") | |||
|                 .HasColumnName("userId"); | |||
|             entity.Property(e => e.AuthType) | |||
|                 .HasColumnType("int(11)") | |||
|                 .HasColumnName("authType"); | |||
|             entity.Property(e => e.ClientId) | |||
|                 .HasColumnType("int(11)") | |||
|                 .HasColumnName("clientId"); | |||
|             entity.Property(e => e.Email) | |||
|                 .HasMaxLength(200) | |||
|                 .HasColumnName("email") | |||
|                 .UseCollation("utf8mb4_general_ci") | |||
|                 .HasCharSet("utf8mb4"); | |||
|             entity.Property(e => e.Isactive) | |||
|                 .HasColumnType("bit(1)") | |||
|                 .HasColumnName("isactive"); | |||
|             entity.Property(e => e.Isowner) | |||
|                 .HasColumnType("bit(1)") | |||
|                 .HasColumnName("isowner"); | |||
|             entity.Property(e => e.LastLogin) | |||
|                 .HasColumnType("datetime") | |||
|                 .HasColumnName("last_login"); | |||
|             entity.Property(e => e.Passsword) | |||
|                 .HasMaxLength(200) | |||
|                 .HasColumnName("passsword") | |||
|                 .UseCollation("utf8mb4_general_ci") | |||
|                 .HasCharSet("utf8mb4"); | |||
|             entity.Property(e => e.PhoneNumber) | |||
|                 .HasMaxLength(50) | |||
|                 .HasColumnName("phoneNumber") | |||
|                 .UseCollation("utf8mb4_general_ci") | |||
|                 .HasCharSet("utf8mb4"); | |||
|             entity.Property(e => e.Username) | |||
|                 .HasMaxLength(30) | |||
|                 .HasColumnName("username") | |||
|                 .UseCollation("utf8mb4_general_ci") | |||
|                 .HasCharSet("utf8mb4"); | |||
|         }); | |||
| 
 | |||
|         OnModelCreatingPartial(modelBuilder); | |||
|     } | |||
| 
 | |||
|     partial void OnModelCreatingPartial(ModelBuilder modelBuilder); | |||
| } | |||
| @ -0,0 +1,18 @@ | |||
| using Cloud_Manager.Models.CustomModels; | |||
| using Cloud_Manager.Models.Interfaces; | |||
| using Microsoft.AspNetCore.SignalR; | |||
| 
 | |||
| namespace Cloud_Manager.CloudHubs | |||
| { | |||
|     public class SalesHub : Hub<ISalesHub> | |||
|     { | |||
|         public async Task JoinCompanyGroup(string a_companyId) | |||
|         { | |||
|             await Groups.AddToGroupAsync(Context.ConnectionId, a_companyId); | |||
|         } | |||
|         public async Task AddTransaction(string a_companyId, SaleItem a_sale) | |||
|         { | |||
|             await Clients.OthersInGroup(a_companyId).TransactionMade(a_sale); | |||
|         } | |||
|     } | |||
| } | |||
| @ -0,0 +1,16 @@ | |||
| <Project Sdk="Microsoft.NET.Sdk.Web"> | |||
| 
 | |||
|   <PropertyGroup> | |||
|     <TargetFramework>net7.0</TargetFramework> | |||
|     <Nullable>enable</Nullable> | |||
|     <ImplicitUsings>enable</ImplicitUsings> | |||
|   </PropertyGroup> | |||
| 
 | |||
|   <ItemGroup> | |||
|     <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="7.0.5" /> | |||
|     <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="7.0.0" /> | |||
|     <PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" /> | |||
|     <PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="7.0.3" /> | |||
|   </ItemGroup> | |||
| 
 | |||
| </Project> | |||
| @ -0,0 +1,151 @@ | |||
| using Cloud_Manager.Models.CustomModels; | |||
| using Cloud_Manager.Models.Interfaces; | |||
| using Cloud_Manager.Models.POSModels; | |||
| using Microsoft.AspNetCore.Authorization; | |||
| using Microsoft.AspNetCore.Http; | |||
| using Microsoft.AspNetCore.Mvc; | |||
| using System.Runtime.InteropServices; | |||
| 
 | |||
| namespace Cloud_Manager.Controllers.SyncControllers | |||
| { | |||
|     [Route("api/[controller]")]
 | |||
|     [ApiController] | |||
|     public class SyncCompanyInfoController : ControllerBase | |||
|     { | |||
|         private readonly ISalesInterface m_salesService; | |||
|         private readonly ICustomer m_customer; | |||
|         private readonly IUser m_users; | |||
|         private readonly ICompanyInfo m_companyInfo; | |||
|         public SyncCompanyInfoController(ISalesInterface a_salesService, ICustomer customer, IUser users, ICompanyInfo a_companyInfo) | |||
|         { | |||
|             m_salesService = a_salesService; | |||
|             m_customer = customer; | |||
|             m_users = users; | |||
|             m_companyInfo = a_companyInfo; | |||
|         } | |||
|         // GET: api/<SyncCompanyInfoController>
 | |||
|         [Authorize] | |||
|         [HttpGet, Route("lastsyncdate/{a_tableName}")] | |||
|         public DateTime GetLastSyncDate(string a_tableName) | |||
|         { | |||
|             return m_salesService.GetLastSyncDate(a_tableName); | |||
|         } | |||
|         // Post: api/<SyncCompanyInfoController>
 | |||
|         [Authorize] | |||
|         [HttpPost, Route("setsyncdate")] | |||
|         public void SetLastSyncDate(SyncTimestamp a_timestamp) | |||
|         { | |||
|             m_salesService.SetLastSyncDate(a_timestamp.TableName, a_timestamp.Timestamp); | |||
|         } | |||
|         // POST api/<SyncCompanyInfoController>
 | |||
|         /// <summary>
 | |||
|         /// Endpoint to publish a collection of SystemUserRoles rows to the cloud
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_item"></param>
 | |||
|         [Authorize] | |||
|         [HttpPost, Route("publish/SystemRoles")] | |||
|         public async Task SyncSyatemRolesAsync(List<Systemuserrole> a_item) | |||
|         { | |||
|             await m_companyInfo.SyncSystemRoles(a_item); | |||
|         } | |||
|         // POST api/<SyncCompanyInfoController>
 | |||
|         /// <summary>
 | |||
|         /// Endpoint to publish a collection of TblDriver rows to the cloud
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_item"></param>
 | |||
|         [Authorize] | |||
|         [HttpPost, Route("publish/tblDriver")] | |||
|         public async Task SyncDriversAsync(List<Tbldriver> a_item) | |||
|         { | |||
|             await m_companyInfo.SyncDriverDetails(a_item); | |||
|         } | |||
|         // POST api/<SyncCompanyInfoController>
 | |||
|         /// <summary>
 | |||
|         /// Endpoint to publish a collection of CompanyDetails rows to the cloud
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_item"></param>
 | |||
|         [Authorize] | |||
|         [HttpPost, Route("publish/tblcompanydetails")] | |||
|         public async Task SyncCompanyAsync(List<Tblcompanydetail> a_item) | |||
|         { | |||
|             await m_companyInfo.SyncCompanyDetails(a_item); | |||
|         } | |||
|         // POST api/<SyncCompanyInfoController>
 | |||
|         /// <summary>
 | |||
|         /// Endpoint to publish a collection of TblUsers rows to the cloud
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_item"></param>
 | |||
|         [Authorize] | |||
|         [HttpPost, Route("publish/tblusers")] | |||
|         public async Task SyncUsersAsync(List<Tbluser> a_item) | |||
|         { | |||
|             await m_users.SyncUserAsync(a_item); | |||
|         } | |||
|         // POST api/<SyncCompanyInfoController>
 | |||
|         /// <summary>
 | |||
|         /// Endpoint to publish a collection of Trucks rows to the cloud
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_item"></param>
 | |||
|         [Authorize] | |||
|         [HttpPost, Route("publish/tbltrucks")] | |||
|         public async Task SyncTrucksAsync(List<Tbltruck> a_item) | |||
|         { | |||
|             await m_companyInfo.SyncTrucks(a_item); | |||
|         } | |||
|         // POST api/<SyncCompanyInfoController>
 | |||
|         /// <summary>
 | |||
|         /// Endpoint to publish a collection of TblBranch rows to the cloud
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_item"></param>
 | |||
|         [Authorize] | |||
|         [HttpPost, Route("publish/tblbranch")] | |||
|         public async Task SyncBranchAsync(List<Tblbranch> a_item) | |||
|         { | |||
|             await m_companyInfo.SyncBranches(a_item); | |||
|         } | |||
|         // POST api/<SyncCompanyInfoController>
 | |||
|         /// <summary>
 | |||
|         /// Endpoint to publish a collection of TblCustomers rows to the cloud
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_item"></param>
 | |||
|         [Authorize] | |||
|         [HttpPost, Route("publish/tblcustomers")] | |||
|         public async Task SyncCustomersAsync(List<Tblcustomer> a_item) | |||
|         { | |||
|             await m_customer.SyncCustomers(a_item); | |||
|         } | |||
|         // POST api/<SyncCompanyInfoController>
 | |||
|         /// <summary>
 | |||
|         /// Endpoint to publish a collection of TblTruck Inventory rows to the cloud
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_item"></param>
 | |||
|         [Authorize] | |||
|         [HttpPost, Route("publish/tbltruckinventory")] | |||
|         public async Task SyncTruckInventoryAsync(List<Tbltruckinventory> a_item) | |||
|         { | |||
|             await m_companyInfo.SyncTruckInventory(a_item); | |||
|         } | |||
|         // POST api/<SyncCompanyInfoController>
 | |||
|         /// <summary>
 | |||
|         /// Endpoint to publish a collection of TblTruckAssignment rows to the cloud
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_item"></param>
 | |||
|         [Authorize] | |||
|         [HttpPost, Route("publish/tblTruckAssignment")] | |||
|         public async Task SyncTruckAssignmentSync(List<Tbltruckassignment> a_item) | |||
|         { | |||
|             await m_companyInfo.SyncTruckAssignments(a_item); | |||
|         } | |||
|         // POST api/<SyncCompanyInfoController>
 | |||
|         /// <summary>
 | |||
|         /// Endpoint to publish a collection of TblDriverMapping rows to the cloud
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_item"></param>
 | |||
|         [Authorize] | |||
|         [HttpPost, Route("publish/tbldrivermappings")] | |||
|         public async Task SyncTruckDriverMappingSync(List<TbltruckDrivermapping> a_item) | |||
|         { | |||
|             await m_companyInfo.SyncTruckMappings(a_item); | |||
|         } | |||
|     } | |||
| } | |||
| @ -0,0 +1,144 @@ | |||
| using Cloud_Manager.Models.CustomModels; | |||
| using Cloud_Manager.Models.Interfaces; | |||
| using Cloud_Manager.Models.POSModels; | |||
| using Microsoft.AspNetCore.Authorization; | |||
| using Microsoft.AspNetCore.Http; | |||
| using Microsoft.AspNetCore.Mvc; | |||
| 
 | |||
| namespace Cloud_Manager.Controllers.SyncControllers | |||
| { | |||
|     [Route("api/[controller]")]
 | |||
|     [ApiController] | |||
|     public class SyncProductsController : ControllerBase | |||
|     { | |||
|         private readonly IProduct m_productService; | |||
|         public SyncProductsController(IProduct a_productService) | |||
|         { | |||
|             m_productService = a_productService; | |||
|         } | |||
|         // GET: api/<SyncProductsController>
 | |||
|         [Authorize] | |||
|         [HttpGet, Route("lastsyncdate/{a_tableName}")] | |||
|         public DateTime GetLastSyncDate(string a_tableName) | |||
|         { | |||
|             return m_productService.GetLastSyncDate(a_tableName); | |||
|         } | |||
|         // Post: api/<SyncProductsController>
 | |||
|         [Authorize] | |||
|         [HttpPost, Route("setsyncdate")] | |||
|         public void SetLastSyncDate(SyncTimestamp a_timestamp) | |||
|         { | |||
|             m_productService.SetLastSyncDate(a_timestamp.TableName, a_timestamp.Timestamp); | |||
|         } | |||
|         // POST api/<SyncProductsController>
 | |||
|         /// <summary>
 | |||
|         /// Endpoint to publish a collection of TblProduct rows to the cloud
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_item"></param>
 | |||
|         [Authorize] | |||
|         [HttpPost, Route("publish/tblProducts")] | |||
|         public async Task SyncProductsAsync(List<Tblproduct> a_item) | |||
|         { | |||
|             await m_productService.SyncProducts(a_item); | |||
|         } | |||
|         // POST api/<SyncProductsController>
 | |||
|         /// <summary>
 | |||
|         /// Endpoint to publish a collection of TblInventory rows to the cloud
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_item"></param>
 | |||
|         [Authorize] | |||
|         [HttpPost, Route("publish/tblInventory")] | |||
|         public async Task SyncInventoryAsync(List<Tblinventory> a_item) | |||
|         { | |||
|             await m_productService.SyncInventory(a_item); | |||
|         } | |||
|         // POST api/<SyncProductsController>
 | |||
|         /// <summary>
 | |||
|         /// Endpoint to publish a collection of Restock rows to the cloud
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_item"></param>
 | |||
|         [Authorize] | |||
|         [HttpPost, Route("publish/tblRestock")] | |||
|         public async Task SyncRestockAsync(List<Restocklevel> a_item) | |||
|         { | |||
|             await m_productService.SyncRestockAsync(a_item); | |||
|         } | |||
|         // POST api/<SyncProductsController>
 | |||
|         /// <summary>
 | |||
|         /// Endpoint to publish a collection of TblInventoryEntries rows to the cloud
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_item"></param>
 | |||
|         [Authorize] | |||
|         [HttpPost, Route("publish/tblInventoryentry")] | |||
|         public async Task SyncInventoryEntriesAsync(List<Tblinventoryentry> a_item) | |||
|         { | |||
|             await m_productService.SyncInventoryEntries(a_item); | |||
|         } | |||
|         // POST api/<SyncProductsController>
 | |||
|         /// <summary>
 | |||
|         /// Endpoint to publish a collection of PriceChanges rows to the cloud
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_item"></param>
 | |||
|         [Authorize] | |||
|         [HttpPost, Route("publish/tlpricechanges")] | |||
|         public async Task SyncPriceChangesAsync(List<Tblpricechange> a_item) | |||
|         { | |||
|             await m_productService.SyncPriceChanges(a_item); | |||
|         } | |||
|         // POST api/<SyncProductsController>
 | |||
|         /// <summary>
 | |||
|         /// Endpoint to publish a collection of ProductAltUnit rows to the cloud
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_item"></param>
 | |||
|         [Authorize] | |||
|         [HttpPost, Route("publish/tblProductAltUnit")] | |||
|         public async Task SyncProductAltUnitAsync(List<Productaltunit> a_item) | |||
|         { | |||
|             await m_productService.SyncProductAltUnit(a_item); | |||
|         } | |||
|         // POST api/<SyncProductsController>
 | |||
|         /// <summary>
 | |||
|         /// Endpoint to publish a collection of TbStock rows to the cloud
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_item"></param>
 | |||
|         [Authorize] | |||
|         [HttpPost, Route("publish/tblStock")] | |||
|         public async Task SyncStockAsync(List<Tbstock> a_item) | |||
|         { | |||
|             await m_productService.SyncStockAsync(a_item); | |||
|         } | |||
|         // POST api/<SyncProductsController>
 | |||
|         /// <summary>
 | |||
|         /// Endpoint to publish a collection of TblBrands rows to the cloud
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_item"></param>
 | |||
|         [Authorize] | |||
|         [HttpPost, Route("publish/tblbrands")] | |||
|         public async Task SyncBrandsAsync(List<Tblbrand> a_item) | |||
|         { | |||
|             await m_productService.SyncBrandsAsync(a_item); | |||
|         } | |||
|         // POST api/<SyncProductsController>
 | |||
|         /// <summary>
 | |||
|         /// Endpoint to publish a collection of TblCategory rows to the cloud
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_item"></param>
 | |||
|         [Authorize] | |||
|         [HttpPost, Route("publish/tblCategories")] | |||
|         public async Task SyncCategoriesAsync(List<Tblcategory> a_item) | |||
|         { | |||
|             await m_productService.SyncCategoriesAsync(a_item); | |||
|         } | |||
|         // POST api/<SyncProductsController>
 | |||
|         /// <summary>
 | |||
|         /// Endpoint to publish a collection of UnitOfMeasure rows to the cloud
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_item"></param>
 | |||
|         [Authorize] | |||
|         [HttpPost, Route("publish/tblunitofmeasure")] | |||
|         public async Task SyncUnitMeasureAsync(List<Unitofmeasure> a_item) | |||
|         { | |||
|             await m_productService.SyncUnitOfMeasureAsync(a_item); | |||
|         } | |||
|     } | |||
| } | |||
| @ -0,0 +1,145 @@ | |||
| using Cloud_Manager.Models.CustomModels; | |||
| using Cloud_Manager.Models.Interfaces; | |||
| using Cloud_Manager.Models.POSModels; | |||
| using Microsoft.AspNetCore.Authorization; | |||
| using Microsoft.AspNetCore.Mvc; | |||
| 
 | |||
| // For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860
 | |||
| 
 | |||
| namespace Cloud_Manager.Controllers.SyncControllers | |||
| { | |||
|     [Route("api/[controller]")]
 | |||
|     [ApiController] | |||
|     public class SyncSalesController : ControllerBase | |||
|     { | |||
|         private readonly ISalesInterface m_salesService; | |||
|         public SyncSalesController(ISalesInterface a_salesService) | |||
|         { | |||
|             m_salesService = a_salesService; | |||
|         } | |||
|         // GET: api/<SyncSalesController>
 | |||
|         [Authorize] | |||
|         [HttpGet, Route("lastsyncdate/{a_tableName}")] | |||
|         public DateTime GetLastSyncDate(string a_tableName) | |||
|         { | |||
|             return m_salesService.GetLastSyncDate(a_tableName); | |||
|         } | |||
|         // Post: api/<SyncSalesController>
 | |||
|         [Authorize] | |||
|         [HttpPost, Route("setsyncdate")] | |||
|         public void SetLastSyncDate(SyncTimestamp a_timestamp) | |||
|         { | |||
|             m_salesService.SetLastSyncDate(a_timestamp.TableName, a_timestamp.Timestamp); | |||
|         } | |||
|         // POST api/<SyncSalesController>
 | |||
|         /// <summary>
 | |||
|         /// Endpoint to publish a collection of TblCart rows to the cloud
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_item"></param>
 | |||
|         [Authorize] | |||
|         [HttpPost, Route("publish/tblCart")] | |||
|         public async Task SyncSalesAsync(List<Tblcart> a_item) | |||
|         { | |||
|             await m_salesService.SyncCart(a_item); | |||
|         } | |||
|         // POST api/<SyncSalesController>
 | |||
|         /// <summary>
 | |||
|         /// Endpoint to publish a collection of TblCancelledTransation rows to the cloud
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_item"></param>
 | |||
|         [Authorize] | |||
|         [HttpPost, Route("publish/tblcancelledtransaction")] | |||
|         public async Task SyncCancelledTransactionAsync(List<Tblcancelledtransaction> a_item) | |||
|         { | |||
|             await m_salesService.SyncCancelledTransaction(a_item); | |||
|         } | |||
|         // POST api/<SyncSalesController>
 | |||
|         /// <summary>
 | |||
|         /// Endpoint to publish a collection of TblInvoice rows to the cloud
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_item"></param>
 | |||
|         [Authorize] | |||
|         [HttpPost, Route("publish/tblinvoice")] | |||
|         public async Task SyncInvoiceAsync(List<Tblinvoice> a_item) | |||
|         { | |||
|             await m_salesService.SyncInvoice(a_item); | |||
|         } | |||
|         // POST api/<SyncSalesController>
 | |||
|         /// <summary>
 | |||
|         /// Endpoint to publish a collection of CreditPurchase rows to the cloud
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_item"></param>
 | |||
|         [Authorize] | |||
|         [HttpPost, Route("publish/tblCreditpurchase")] | |||
|         public async Task SyncCreditPurchaseAsync(List<Creditpurchase> a_item) | |||
|         { | |||
|             await m_salesService.SyncCreditPurchase(a_item); | |||
|         } | |||
|         // POST api/<SyncSalesController>
 | |||
|         /// <summary>
 | |||
|         /// Endpoint to publish a collection of Customer Account rows to the cloud
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_item"></param>
 | |||
|         [Authorize] | |||
|         [HttpPost, Route("publish/tblCustomerAccount")] | |||
|         public async Task SyncCustomerAccountAsync(List<Customeraccount> a_item) | |||
|         { | |||
|             await m_salesService.SyncCustomerAccount(a_item); | |||
|         } | |||
|         // POST api/<SyncSalesController>
 | |||
|         /// <summary>
 | |||
|         /// Endpoint to publish a collection of Customer Purchase rows to the cloud
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_item"></param>
 | |||
|         [Authorize] | |||
|         [HttpPost, Route("publish/CustomerPurchase")] | |||
|         public async Task SyncCustomerPurchaseAsync(List<Tblcustomerpurchase> a_item) | |||
|         { | |||
|             await m_salesService.SyncCustomerPurchase(a_item); | |||
|         } | |||
|         // POST api/<SyncSalesController>
 | |||
|         /// <summary>
 | |||
|         /// Endpoint to publish a collection of Discount logs rows to the cloud
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_item"></param>
 | |||
|         [Authorize] | |||
|         [HttpPost, Route("publish/DiscountLogs")] | |||
|         public async Task SyncDiscountLogsAsync(List<Tbldiscountlog> a_item) | |||
|         { | |||
|             await m_salesService.SyncDiscountLogs(a_item); | |||
|         } | |||
|         // POST api/<SyncSalesController>
 | |||
|         /// <summary>
 | |||
|         /// Endpoint to publish a collection of Delivery Head rows to the cloud
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_item"></param>
 | |||
|         [Authorize] | |||
|         [HttpPost, Route("publish/tblDeliveryhead")] | |||
|         public async Task SyncDeliveryHeadAsync(List<Tbldeliveryhead> a_item) | |||
|         { | |||
|             await m_salesService.SyncDeliveryHead(a_item); | |||
|         } | |||
|         // POST api/<SyncSalesController>
 | |||
|         /// <summary>
 | |||
|         /// Endpoint to publish a collection of Delivery Details rows to the cloud
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_item"></param>
 | |||
|         [Authorize] | |||
|         [HttpPost, Route("publish/tblDeliverydetails")] | |||
|         public async Task SyncDeliveryDetailsAsync(List<Tbldeliverydetail> a_item) | |||
|         { | |||
|             await m_salesService.SyncDeliveryDetails(a_item); | |||
|         } | |||
|         // POST api/<SyncSalesController>
 | |||
|         /// <summary>
 | |||
|         /// Endpoint to publish a collection of Delivery Recipient rows to the cloud
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_item"></param>
 | |||
|         [Authorize] | |||
|         [HttpPost, Route("publish/tblDeliveryrecipient")] | |||
|         public async Task SyncDeliveryRecipientAsync(List<Tbldeliveryrecipient> a_item) | |||
|         { | |||
|             await m_salesService.SyncDeliveryRecipients(a_item); | |||
|         } | |||
|     } | |||
| } | |||
| @ -0,0 +1,33 @@ | |||
| using Microsoft.AspNetCore.Mvc; | |||
| 
 | |||
| namespace Cloud_Manager.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(); | |||
|         } | |||
|     } | |||
| } | |||
| @ -0,0 +1,11 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.ClientContractModels; | |||
| 
 | |||
| public partial class Authtype | |||
| { | |||
|     public int Id { get; set; } | |||
| 
 | |||
|     public string? Type { get; set; } | |||
| } | |||
| @ -0,0 +1,21 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.ClientContractModels; | |||
| 
 | |||
| public partial class Clientbusiness | |||
| { | |||
|     /// <summary>
 | |||
|     /// there could be multiple branches of the same  business
 | |||
|     /// </summary>
 | |||
|     public int BusinessId { get; set; } | |||
| 
 | |||
|     public int ClientId { get; set; } | |||
| 
 | |||
|     public string BusinessName { get; set; } = null!; | |||
| 
 | |||
|     public string BiskilogVersion { get; set; } = null!; | |||
| 
 | |||
|     public DateTime DateJoined { get; set; } | |||
|     public string BusinessExternalId { get; set; } = string.Empty!; | |||
| } | |||
| @ -0,0 +1,15 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.ClientContractModels; | |||
| 
 | |||
| public partial class Clientinfo | |||
| { | |||
|     public int ClientId { get; set; } | |||
| 
 | |||
|     public string? Fullname { get; set; } | |||
| 
 | |||
|     public string? PhoneNumber { get; set; } | |||
| 
 | |||
|     public string? Email { get; set; } | |||
| } | |||
| @ -0,0 +1,21 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.ClientContractModels; | |||
| 
 | |||
| public partial class Contract | |||
| { | |||
|     public int ContractId { get; set; } | |||
| 
 | |||
|     public int ClientId { get; set; } | |||
| 
 | |||
|     public int? BusinessId { get; set; } | |||
| 
 | |||
|     public DateTime? StartDate { get; set; } | |||
| 
 | |||
|     public DateTime? EndDate { get; set; } | |||
| 
 | |||
|     public decimal? Bill { get; set; } | |||
| 
 | |||
|     public string Comments { get; set; } = null!; | |||
| } | |||
| @ -0,0 +1,16 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.ClientContractModels; | |||
| 
 | |||
| public partial class Databasemap | |||
| { | |||
|     public int DbNo { get; set; } | |||
| 
 | |||
|     public string DbName { get; set; } = null!; | |||
| 
 | |||
|     public int ClientId { get; set; } | |||
|     public string Domain { get; set; } | |||
| 
 | |||
|     public DateTime LastSyncDate { get; set; } | |||
| } | |||
| @ -0,0 +1,16 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.ClientContractModels; | |||
| 
 | |||
| public partial class Siteaccesspermission | |||
| { | |||
|     public int UserId { get; set; } | |||
| 
 | |||
|     /// <summary>
 | |||
|     /// businessIds could also been seen as branchID
 | |||
|     /// </summary>
 | |||
|     public int BusinessId { get; set; } | |||
| 
 | |||
|     public int ClientId { get; set; } | |||
| } | |||
| @ -0,0 +1,27 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.ClientContractModels; | |||
| 
 | |||
| public partial class Userauth | |||
| { | |||
|     public int UserId { get; set; } | |||
| 
 | |||
|     public int ClientId { get; set; } | |||
| 
 | |||
|     public string? Username { get; set; } | |||
| 
 | |||
|     public string? Email { get; set; } | |||
| 
 | |||
|     public string? Passsword { get; set; } | |||
| 
 | |||
|     public string? PhoneNumber { get; set; } | |||
| 
 | |||
|     public int AuthType { get; set; } | |||
| 
 | |||
|     public ulong Isactive { get; set; } | |||
| 
 | |||
|     public ulong? Isowner { get; set; } | |||
| 
 | |||
|     public DateTime? LastLogin { get; set; } | |||
| } | |||
| @ -0,0 +1,16 @@ | |||
| using Cloud_Manager.Models.POSModels; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| 
 | |||
| namespace Cloud_Manager.Models.CustomModels | |||
| { | |||
|     public class CancelledSales | |||
|     { | |||
|         public Tblcancelledtransaction? CancelledTransaction { get; set; } | |||
|         public string Customer { get; set; } = "WALK-IN Purchase"; | |||
|         public decimal? Value { get; set; } | |||
|     } | |||
| } | |||
| @ -0,0 +1,15 @@ | |||
| using Cloud_Manager.Models.POSModels; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| 
 | |||
| namespace Cloud_Manager.Models.CustomModels | |||
| { | |||
|     public class CustomerAccounts | |||
|     { | |||
|         public Tblcustomer Customer { get; set; } | |||
|         public decimal Debt { get; set; } = 0; | |||
|     } | |||
| } | |||
| @ -0,0 +1,29 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| 
 | |||
| namespace Cloud_Manager.Models.CustomModels | |||
| { | |||
|     public class MostPurchasedItem | |||
|     { | |||
|         /// <summary>
 | |||
|         /// Specifies the id of the product
 | |||
|         /// </summary>
 | |||
|         public string ProductId { get; set; } = string.Empty; | |||
|         /// <summary>
 | |||
|         /// Specifies the name of the product 
 | |||
|         /// </summary>
 | |||
|         public string ProductName { get; set; } = string.Empty; | |||
|         /// <summary>
 | |||
|         /// The total revenue generated from the sale
 | |||
|         /// </summary>
 | |||
|         public decimal? Revenue { get; set; } | |||
|         /// <summary>
 | |||
|         /// This is the number of times the item has been sold
 | |||
|         /// </summary>
 | |||
|         public int? NbrTimesSold { get; set; } | |||
| 
 | |||
|     } | |||
| } | |||
| @ -0,0 +1,18 @@ | |||
| using Cloud_Manager.Models.POSModels; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| 
 | |||
| namespace Cloud_Manager.Models.CustomModels | |||
| { | |||
|     public class ProductItem | |||
|     { | |||
|         public Tblproduct? Product { get; set; } | |||
|         public Tblinventory? Stock { get; set; } | |||
|         public Restocklevel? Restocklevel { get; set; } | |||
|         public List<ProductUnits> Units { get; set; } = new List<ProductUnits>(); | |||
|         public string BaseUnit { get; set; } = string.Empty; | |||
|     } | |||
| } | |||
| @ -0,0 +1,23 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| 
 | |||
| namespace Cloud_Manager.Models.CustomModels | |||
| { | |||
|     public class ProductPriceChange | |||
|     { | |||
|         public string? Pcode { get; set; } | |||
|         public string? ProductName { get; set; } | |||
|         public decimal? PreviousPrice { get; set; } | |||
| 
 | |||
|         public decimal? CurrentPrice { get; set; } | |||
| 
 | |||
|         public DateTime? ChangeDate { get; set; } | |||
| 
 | |||
|         public string BranchId { get; set; } = null!; | |||
| 
 | |||
|         public string CountId { get; set; } = null!; | |||
|     } | |||
| } | |||
| @ -0,0 +1,26 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| 
 | |||
| namespace Cloud_Manager.Models.CustomModels | |||
| { | |||
|     public class ProductUnits | |||
|     { | |||
|         public string? Pcode { get; set; } | |||
| 
 | |||
|         public string? UnitCode { get; set; } | |||
|         public string? UnitName { get; set; } | |||
| 
 | |||
|         public string? UnitBarcode { get; set; } | |||
| 
 | |||
|         public decimal? PriceUnit { get; set; } | |||
| 
 | |||
|         public int? QuantityUnit { get; set; } | |||
| 
 | |||
|         public string DistinctiveCode { get; set; } = null!; | |||
| 
 | |||
|         public string BranchId { get; set; } = null!; | |||
|     } | |||
| } | |||
| @ -0,0 +1,22 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| 
 | |||
| namespace Cloud_Manager.Models.CustomModels | |||
| { | |||
|     public class SaleItem | |||
|     { | |||
|         public string? Transno { get; set; } | |||
| 
 | |||
|         public DateTime? Date { get; set; } | |||
| 
 | |||
|         public string? Cashier { get; set; } | |||
|         public string? Status { get; set; } | |||
|         public decimal? Total { get; set; } | |||
|         public string BranchId { get; set; } = null!; | |||
| 
 | |||
|         public string Customer { get; set; } = "Walk-In Purchase"!; | |||
|     } | |||
| } | |||
| @ -0,0 +1,14 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| 
 | |||
| namespace Cloud_Manager.Models.CustomModels | |||
| { | |||
|     public class SyncTimestamp | |||
|     { | |||
|         public string TableName { get; set; } | |||
|         public DateTime Timestamp { get; set; } | |||
|     } | |||
| } | |||
| @ -0,0 +1,16 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| 
 | |||
| namespace Cloud_Manager.Models.CustomModels | |||
| { | |||
|     public class TradeSummary | |||
|     { | |||
|         public DateTime CurrentTradeDate { get; set; } = DateTime.Now; | |||
|         public DateTime LastTradeDate { get; set; } = DateTime.Now.AddDays(-1); | |||
|         public double CurrentTradeSales { get; set; } = 0; | |||
|         public double LastTradeSales { get; set; } = 0; | |||
|     } | |||
| } | |||
| @ -0,0 +1,21 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| 
 | |||
| namespace Cloud_Manager.Models.CustomModels | |||
| { | |||
|     public class WeeklySaleItem | |||
|     { | |||
|         public DateTime Date { get; set; } | |||
|         public decimal? Total { get; set; } | |||
|         public string BranchId { get; set; } = null!; | |||
|     } | |||
| 
 | |||
|     public class WeeklyCategorySummary | |||
|     { | |||
|         public decimal? Total { get; set; } | |||
|         public string Category { get; set; } = string.Empty!; | |||
|     } | |||
| } | |||
| @ -0,0 +1,17 @@ | |||
| namespace Cloud_Manager.Models.Enums | |||
| { | |||
|     public enum AuthEnums | |||
|     { | |||
|         Registered, | |||
|         AleadyLoggedin, | |||
|         WrongPassword, | |||
|         NotFound, | |||
|         Found, | |||
|         Expired, | |||
|         Invalid, | |||
|         Valid, | |||
|         Successful, | |||
|         Error | |||
|     } | |||
| } | |||
| 
 | |||
| @ -0,0 +1,14 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| 
 | |||
| namespace Cloud_Manager.Models.Enums | |||
| { | |||
|     public enum ConnectionEnums | |||
|     { | |||
|         ConnectionEstablished, | |||
|         ConnectionNotEstablished, | |||
|     } | |||
| } | |||
| @ -0,0 +1,86 @@ | |||
| using Cloud_Manager.Models.CustomModels; | |||
| using Cloud_Manager.Models.POSModels; | |||
| 
 | |||
| namespace Cloud_Manager.Models.Interfaces | |||
| { | |||
|     public interface IAnalytics | |||
|     { | |||
|         /// <summary>
 | |||
|         /// Fetches a collection of sales transaction made from the specified start date to the end date
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_start">Specified Start Date</param>
 | |||
|         /// <param name="a_end">Specified end Date</param>
 | |||
|         /// <returns></returns>
 | |||
|         IEnumerable<Tblcart> GetSalesTransaction(DateTime a_start, DateTime a_end); | |||
|         /// <summary>
 | |||
|         /// Fetches a collection of sales transaction made within a one week period
 | |||
|         /// </summary>
 | |||
|         /// <returns></returns>
 | |||
|         IEnumerable<WeeklySaleItem> GetWeeklySalesTransaction(); | |||
|         /// <summary>
 | |||
|         /// Fetches a collection of in-debt customers
 | |||
|         /// <returns></returns>
 | |||
|         IEnumerable<CustomerAccounts> GetInDebtCustomers(); | |||
|         /// <summary>
 | |||
|         /// Fetches a collection of Product Items which are currently out of stock
 | |||
|         /// </summary>
 | |||
|         /// <returns></returns>
 | |||
|         IEnumerable<ProductItem> GetOutOfStockItems(); | |||
|         /// <summary>
 | |||
|         /// Fetches a collection of the most purchased Product Items within a specified date range
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_start"></param>
 | |||
|         /// <param name="a_end"></param>
 | |||
|         /// <returns></returns>
 | |||
|        IEnumerable<MostPurchasedItem> GetMostPurchasedItem(DateTime a_start, DateTime a_end); | |||
|         /// <summary>
 | |||
|         /// Fetches a collection of cancelled transaction within a specified date range
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_start"></param>
 | |||
|         /// <param name="a_end"></param>
 | |||
|         /// <returns></returns>
 | |||
|         IEnumerable<CancelledSales> GetCancelledSales(DateTime a_start, DateTime a_end); | |||
|         /// <summary>
 | |||
|         /// Fetches a collection of transaction made by employees within a specified date range
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_start"></param>
 | |||
|         /// <param name="a_end"></param>
 | |||
|         /// <returns>A dictionary of transactions made by employees with employee name as key</returns>
 | |||
|         Dictionary<string, List<SaleItem>> GetEmployeeSales(DateTime a_start, DateTime a_end); | |||
|         /// <summary>
 | |||
|         /// Fetches a collection of product price changes with a specified date range
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_start"></param>
 | |||
|         /// <param name="a_end"></param>
 | |||
|         /// <returns></returns>
 | |||
|         IEnumerable<ProductPriceChange> GetPriceChanges(DateTime a_start, DateTime a_end); | |||
|         /// <summary>
 | |||
|         /// Fetch the trade summary which is made of the total sales made currently and previous trade
 | |||
|         /// </summary>
 | |||
|         /// <returns></returns>
 | |||
|         TradeSummary GetTradeSummary(); | |||
|         /// <summary>
 | |||
|         /// Fetches the most recent sales transactions
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_limit">The number of rows to return </param>
 | |||
|         /// <returns></returns>
 | |||
|         IEnumerable<SaleItem> GetRecentSales(int a_limit); | |||
|         /// <summary>
 | |||
|         /// Fetches a collection of product price changes recently made
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_limit">the number of rows to return</param>
 | |||
|         /// <returns></returns>
 | |||
|         IEnumerable<ProductPriceChange> GetRecentPriceChanges(int a_limit); | |||
|         /// <summary>
 | |||
|         /// Fetches a collection of price change history per product
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_limit">the number of products to fetch history</param>
 | |||
|         /// <returns></returns>
 | |||
|         IEnumerable<ProductPriceChange> GetProductPriceChangeHistory(int a_limit); | |||
|         /// <summary>
 | |||
|         /// Fetches a collection of sales transaction grouped by category made within a one week period
 | |||
|         /// </summary>
 | |||
|         /// <returns></returns>
 | |||
|         IEnumerable<WeeklyCategorySummary> GetWeeklySalesCategoryTransaction(int a_limit); | |||
|     } | |||
| } | |||
| @ -0,0 +1,20 @@ | |||
| using Cloud_Manager.Models.ClientContractModels; | |||
| using Cloud_Manager.Models.ClientContractModels; | |||
| 
 | |||
| namespace Cloud_Manager.Models.Interfaces | |||
| { | |||
|     public interface IAuthService | |||
|     { | |||
|         /// <summary>
 | |||
|         /// Authenticates user or client 
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_username"></param>
 | |||
|         /// <param name="a_password"></param>
 | |||
|         /// <returns>A tokenized string with relevant information on the authenticated user</returns>
 | |||
|         Task<string> AuthenticateClient(string a_username, string a_password); | |||
|         Contract? GetContract(int a_clientId, List<int> a_businessId); | |||
|         Databasemap GetClientDB(int a_clientId); | |||
|         List<Siteaccesspermission> GetSiteaccesspermission(int a_clientId, int a_userId); | |||
|         List<Clientbusiness> GetClientbusiness(int a_clientId, int userId); | |||
|     } | |||
| } | |||
| @ -0,0 +1,28 @@ | |||
| using Cloud_Manager.Models.POSModels; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| 
 | |||
| namespace Cloud_Manager.Models.Interfaces | |||
| { | |||
|     public interface ICompanyInfo | |||
|     { | |||
|         IEnumerable<Tblbranch> FetchBranches(); | |||
|         Task<Tblcompanydetail> GetCompanyInfoAsync(); | |||
|         Task<IEnumerable<Tblbranch>> GetBranches(); | |||
|         string GetCompanyName(); | |||
|         string GetBranchName(string a_branchId); | |||
|         Task SyncBranches(List<Tblbranch> a_branches); | |||
|         Task SyncCompanyDetails(List<Tblcompanydetail> a_details); | |||
|         Task SyncDriverDetails(List<Tbldriver> a_details); | |||
|         Task SyncSystemRoles(List<Systemuserrole> a_roles); | |||
|         Task SyncTrucks(List<Tbltruck> a_trucks); | |||
|         Task SyncTruckAssignments(List<Tbltruckassignment> a_assignments); | |||
|         Task SyncTruckMappings(List<TbltruckDrivermapping> a_mapping); | |||
|         Task SyncTruckInventory(List<Tbltruckinventory> a_inventories); | |||
|         DateTime GetLastSyncDate(string a_tablename); | |||
|         void SetLastSyncDate(string a_tableName, DateTime a_timestamp); | |||
|     } | |||
| } | |||
| @ -0,0 +1,24 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| 
 | |||
| namespace Cloud_Manager.Models.Interfaces | |||
| { | |||
|     public interface IConnectionService | |||
|     { | |||
|         /// <summary>
 | |||
|         /// Prepares and returns the connection string for a client using the specified database id
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_databaseId">Specified database id to use</param>
 | |||
|         /// <returns></returns>
 | |||
|         string GetClientConnectionString(int a_databaseId); | |||
|         /// <summary>
 | |||
|         /// Prepare the DB context from the specified connection string
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_connectionString"></param>
 | |||
|         /// <returns>A configured BiskAcdbContext</returns>
 | |||
|         object PrepareDBContext(string a_connectionString); | |||
|     } | |||
| } | |||
| @ -0,0 +1,12 @@ | |||
| using Cloud_Manager.Models.CustomModels; | |||
| using Cloud_Manager.Models.POSModels; | |||
| 
 | |||
| namespace Cloud_Manager.Models.Interfaces | |||
| { | |||
|     public interface ICustomer | |||
|     { | |||
|         IEnumerable<CustomerAccounts> FetchCustomers(); | |||
|         Task<IEnumerable<CustomerAccounts>> GetCustomers(); | |||
|         Task SyncCustomers(List<Tblcustomer> a_details); | |||
|     } | |||
| } | |||
| @ -0,0 +1,15 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| 
 | |||
| namespace Cloud_Manager.Models.Interfaces | |||
| { | |||
|     public interface IMainInterface | |||
|     { | |||
|         void ShowReceipt(string a_receipt); | |||
|         DateOnly CurrentTradeDate(); | |||
|         DateOnly PreviousTradeDate(); | |||
|     } | |||
| } | |||
| @ -0,0 +1,44 @@ | |||
| using Cloud_Manager.Models.CustomModels; | |||
| using Cloud_Manager.Models.POSModels; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| 
 | |||
| namespace Cloud_Manager.Models.Interfaces | |||
| { | |||
|     public interface IProduct | |||
|     { | |||
|         IEnumerable<Unitofmeasure> GetUnitofmeasures(); | |||
|         IEnumerable<ProductItem> GetProducts(string a_productKey = ""); | |||
|         IEnumerable<Tblbrand> GetBrands(string a_brandKey = ""); | |||
|         IEnumerable<Tblcategory> GetCategories(string a_categoryKey = ""); | |||
|         IEnumerable<ProductItem> GetLowstockItems(); | |||
|         Task FetchProducts(); | |||
|         Task FetchLowStockProducts(); | |||
|         Task FetchUnits(); | |||
|         Task FetchBrands(); | |||
|         Task FetchCategories(); | |||
|         void RefreshList(); | |||
|         ProductItem GetProductById(string a_id); | |||
|         ProductItem GetProductByName(string name); | |||
|         string GetUnitName(string a_unitCode); | |||
|         event EventHandler ProductsChanged; | |||
|         event EventHandler UnitsChanged; | |||
|         event EventHandler BrandsChanged; | |||
|         event EventHandler CategoriesChanged; | |||
|         Task SyncProducts(List<Tblproduct> a_item); | |||
|         Task SyncInventory(List<Tblinventory> a_item); | |||
|         Task SyncInventoryEntries(List<Tblinventoryentry> a_item); | |||
|         Task SyncPriceChanges(List<Tblpricechange> a_items); | |||
|         Task SyncProductAltUnit(List<Productaltunit> a_items); | |||
|         Task SyncRestockAsync(List<Restocklevel> a_items); | |||
|         Task SyncUnitOfMeasureAsync(List<Unitofmeasure> a_items); | |||
|         Task SyncStockAsync(List<Tbstock> a_items); | |||
|         Task SyncBrandsAsync(List<Tblbrand> a_items); | |||
|         Task SyncCategoriesAsync(List<Tblcategory> a_items); | |||
|         DateTime GetLastSyncDate(string a_tablename); | |||
|         void SetLastSyncDate(string a_tableName, DateTime a_timestamp); | |||
|     } | |||
| } | |||
| @ -0,0 +1,10 @@ | |||
| using Cloud_Manager.Models.CustomModels; | |||
| 
 | |||
| namespace Cloud_Manager.Models.Interfaces | |||
| { | |||
|     public interface ISalesHub | |||
|     { | |||
|         Task TransactionMade(SaleItem a_transaction); | |||
|         Task JoinCompanyGroup(); | |||
|     } | |||
| } | |||
| @ -0,0 +1,36 @@ | |||
| using Cloud_Manager.Models.CustomModels; | |||
| using Cloud_Manager.Models.POSModels; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| 
 | |||
| namespace Cloud_Manager.Models.Interfaces | |||
| { | |||
|     public interface ISalesInterface | |||
|     { | |||
|         Task FetchRecentTransaction(int a_limit); | |||
|         Task FetchTransaction(DateTime a_start, DateTime a_end); | |||
|         IEnumerable<SaleItem> GetTransactions(DateTime a_start, DateTime a_end); | |||
|         IEnumerable<SaleItem> GetRecentTransaction(); | |||
|         Task FetchReceipt(string a_receiptId); | |||
|         IEnumerable<SaleItem> GetReceipt(string a_receiptId); | |||
|         Task<IEnumerable<Tblcart>> GetReceiptDetail(string a_receiptId); | |||
|         Task SyncCart(List<Tblcart> a_item); | |||
|         Task SyncCancelledTransaction(List<Tblcancelledtransaction> a_item); | |||
|         Task SyncCreditPurchase(List<Creditpurchase> a_item); | |||
|         Task SyncCustomerAccount(List<Customeraccount> a_customerAccounts); | |||
|         Task SyncCustomerPurchase(List<Tblcustomerpurchase> a_customerPurchase); | |||
|         Task SyncDiscountLogs(List<Tbldiscountlog> a_discountLog); | |||
|         Task SyncDeliveryDetails(List<Tbldeliverydetail> a_details); | |||
|         Task SyncDeliveryHead(List<Tbldeliveryhead> a_heads); | |||
|         Task SyncDeliveryRecipients(List<Tbldeliveryrecipient> a_recipients); | |||
|         Task SyncInvoice(List<Tblinvoice> a_invoice); | |||
|         DateTime GetLastSyncDate(string a_tablename); | |||
|         void SetLastSyncDate(string a_tableName, DateTime a_timestamp); | |||
|         event EventHandler TransactionsChanged; | |||
|         event EventHandler FetchComplete; | |||
|         event EventHandler FetchStart; | |||
|     } | |||
| } | |||
| @ -0,0 +1,18 @@ | |||
| using Cloud_Manager.Models.ClientContractModels; | |||
| using Cloud_Manager.Models.Enums; | |||
| 
 | |||
| namespace Cloud_Manager.Models.Interfaces | |||
| { | |||
|     public interface ITokenService | |||
|     { | |||
|         AuthEnums ValidateToken(string a_token); | |||
|         string GenerateToken(Userauth a_user, Contract a_clientContract, Databasemap a_database, List<string> a_business, bool a_comparison); | |||
|         int? GetDatabaseIdFromToken(string a_token); | |||
|         int? GetUserIdFromToken(string a_token); | |||
|         string? GetUserNameFromToken(string a_token); | |||
|         string? GetBaseBranch(string a_token); | |||
|         bool? GetComparison(string a_token); | |||
|         IEnumerable<string> BranchIds(string a_token); | |||
|         string? GetAllBranch(string a_token); | |||
|     } | |||
| } | |||
| @ -0,0 +1,16 @@ | |||
| using Cloud_Manager.Models.POSModels; | |||
| using System; | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System.Text; | |||
| using System.Threading.Tasks; | |||
| 
 | |||
| namespace Cloud_Manager.Models.Interfaces | |||
| { | |||
|     public interface IUser | |||
|     { | |||
|         IEnumerable<Tbluser> FetchUsers(); | |||
|         Task<IEnumerable<Tbluser>> GetUsers(); | |||
|         Task SyncUserAsync(List<Tbluser> a_users); | |||
|     } | |||
| } | |||
| @ -0,0 +1,21 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.POSModels; | |||
| 
 | |||
| public partial class Creditpurchase | |||
| { | |||
|     public string ReceiptId { get; set; } = null!; | |||
| 
 | |||
|     public string BranchId { get; set; } = null!; | |||
| 
 | |||
|     public DateTime Date { get; set; } | |||
| 
 | |||
|     public decimal TotalBill { get; set; } | |||
| 
 | |||
|     public decimal Paid { get; set; } | |||
| 
 | |||
|     public string CustomerId { get; set; } = null!; | |||
| 
 | |||
|     public string Status { get; set; } = null!; | |||
| } | |||
| @ -0,0 +1,25 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.POSModels; | |||
| 
 | |||
| public partial class Customeraccount | |||
| { | |||
|     public string CustomerId { get; set; } = null!; | |||
| 
 | |||
|     public string TransactionId { get; set; } = null!; | |||
| 
 | |||
|     public DateTime Date { get; set; } | |||
| 
 | |||
|     public decimal Debit { get; set; } | |||
| 
 | |||
|     public decimal Credit { get; set; } | |||
| 
 | |||
|     public decimal Balance { get; set; } | |||
| 
 | |||
|     public string Comments { get; set; } = null!; | |||
| 
 | |||
|     public string BranchId { get; set; } = null!; | |||
| 
 | |||
|     public string CountId { get; set; } = null!; | |||
| } | |||
| @ -0,0 +1,21 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.POSModels; | |||
| 
 | |||
| public partial class Productaltunit | |||
| { | |||
|     public string? Pcode { get; set; } | |||
| 
 | |||
|     public string? UnitCode { get; set; } | |||
| 
 | |||
|     public string? UnitBarcode { get; set; } | |||
| 
 | |||
|     public decimal? PriceUnit { get; set; } | |||
| 
 | |||
|     public int? QuantityUnit { get; set; } | |||
| 
 | |||
|     public string DistinctiveCode { get; set; } = null!; | |||
| 
 | |||
|     public string BranchId { get; set; } = null!; | |||
| } | |||
| @ -0,0 +1,15 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.POSModels; | |||
| 
 | |||
| public partial class Restocklevel | |||
| { | |||
|     public string ProductId { get; set; } = null!; | |||
| 
 | |||
|     public string BranchId { get; set; } = null!; | |||
| 
 | |||
|     public int? WarnLevel { get; set; } | |||
| 
 | |||
|     public string? Unit { get; set; } | |||
| } | |||
| @ -0,0 +1,19 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.POSModels; | |||
| 
 | |||
| public partial class Systemuserrole | |||
| { | |||
|     public string? Roles { get; set; } | |||
| 
 | |||
|     public bool? Owner { get; set; } | |||
| 
 | |||
|     public bool? Manager { get; set; } | |||
| 
 | |||
|     public bool? Assist { get; set; } | |||
| 
 | |||
|     public bool? Cashier { get; set; } | |||
| 
 | |||
|     public int Id { get; set; } | |||
| } | |||
| @ -0,0 +1,19 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.POSModels; | |||
| 
 | |||
| public partial class Tblbranch | |||
| { | |||
|     public string? BranchName { get; set; } | |||
| 
 | |||
|     public string BranchId { get; set; } = null!; | |||
| 
 | |||
|     public string? Address { get; set; } | |||
| 
 | |||
|     public string? City { get; set; } | |||
| 
 | |||
|     public string? StateOrProvince { get; set; } | |||
| 
 | |||
|     public string? BranchTelephone { get; set; } | |||
| } | |||
| @ -0,0 +1,13 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.POSModels; | |||
| 
 | |||
| public partial class Tblbrand | |||
| { | |||
|     public string Id { get; set; } = null!; | |||
| 
 | |||
|     public string BranchId { get; set; } = null!; | |||
| 
 | |||
|     public string? Brand { get; set; } | |||
| } | |||
| @ -0,0 +1,17 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.POSModels; | |||
| 
 | |||
| public partial class Tblcancelledtransaction | |||
| { | |||
|     public string? Transno { get; set; } | |||
| 
 | |||
|     public DateTime? DateCancelled { get; set; } | |||
| 
 | |||
|     public string? CancelledBy { get; set; } | |||
| 
 | |||
|     public string BranchId { get; set; } = null!; | |||
| 
 | |||
|     public string CountId { get; set; } = null!; | |||
| } | |||
| @ -0,0 +1,35 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.POSModels; | |||
| 
 | |||
| public partial class Tblcart | |||
| { | |||
|     public string? Transno { get; set; } | |||
| 
 | |||
|     public string? Id { get; set; } | |||
| 
 | |||
|     public int? Quantity { get; set; } | |||
| 
 | |||
|     public DateTime? Date { get; set; } | |||
| 
 | |||
|     public decimal? Price { get; set; } | |||
| 
 | |||
|     public string? Cashier { get; set; } | |||
| 
 | |||
|     public string? Status { get; set; } | |||
| 
 | |||
|     public decimal? Total { get; set; } | |||
| 
 | |||
|     public string? Unit { get; set; } | |||
|     public decimal? Tendered { get; set; } | |||
|     public decimal? Balance { get; set; } | |||
|     public decimal? ValueAddTax { get; set; } | |||
|     public decimal? Discount { get; set; } = 0; | |||
| 
 | |||
|     public decimal? Costprice { get; set; } | |||
| 
 | |||
|     public string BranchId { get; set; } = null!; | |||
| 
 | |||
|     public string CountId { get; set; } = null!; | |||
| } | |||
| @ -0,0 +1,13 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.POSModels; | |||
| 
 | |||
| public partial class Tblcategory | |||
| { | |||
|     public string Id { get; set; } = null!; | |||
| 
 | |||
|     public string BranchId { get; set; } = null!; | |||
| 
 | |||
|     public string? Category { get; set; } | |||
| } | |||
| @ -0,0 +1,21 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.POSModels; | |||
| 
 | |||
| public partial class Tblcompanydetail | |||
| { | |||
|     public string? CompanyName { get; set; } | |||
| 
 | |||
|     public string? Address { get; set; } | |||
| 
 | |||
|     public string? Website { get; set; } | |||
| 
 | |||
|     public string? Email { get; set; } | |||
| 
 | |||
|     public string Tin { get; set; } = null!; | |||
| 
 | |||
|     public string? MainTelephone { get; set; } | |||
| 
 | |||
|     public string? Vatno { get; set; } | |||
| } | |||
| @ -0,0 +1,35 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.POSModels; | |||
| 
 | |||
| public partial class Tblcustomer | |||
| { | |||
|     public string CustomerId { get; set; } = null!; | |||
| 
 | |||
|     public string BranchId { get; set; } = null!; | |||
| 
 | |||
|     public string? Firstname { get; set; } | |||
| 
 | |||
|     public string? Surname { get; set; } | |||
| 
 | |||
|     public string? Address { get; set; } | |||
| 
 | |||
|     public string? Telephone { get; set; } | |||
| 
 | |||
|     public DateTime? DateAdded { get; set; } | |||
| 
 | |||
|     public string? Status { get; set; } | |||
| 
 | |||
|     public string? Tin { get; set; } | |||
| 
 | |||
|     public DateTime? DateExit { get; set; } | |||
| 
 | |||
|     public string? Email { get; set; } | |||
| 
 | |||
|     public string? FinancialStatus { get; set; } | |||
| 
 | |||
|     public string? NameKey1 { get; set; } | |||
| 
 | |||
|     public string? NameKey2 { get; set; } | |||
| } | |||
| @ -0,0 +1,15 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.POSModels; | |||
| 
 | |||
| public partial class Tblcustomerpurchase | |||
| { | |||
|     public string? CustomerId { get; set; } | |||
| 
 | |||
|     public string? TransactionId { get; set; } | |||
| 
 | |||
|     public string BranchId { get; set; } = null!; | |||
| 
 | |||
|     public string CountId { get; set; } = null!; | |||
| } | |||
| @ -0,0 +1,21 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.POSModels; | |||
| 
 | |||
| public partial class Tbldeliverydetail | |||
| { | |||
|     public string? DeliveryId { get; set; } | |||
| 
 | |||
|     public string? Pcode { get; set; } | |||
| 
 | |||
|     public int? Quantity { get; set; } | |||
| 
 | |||
|     public string? Unit { get; set; } | |||
| 
 | |||
|     public decimal? Cost { get; set; } | |||
| 
 | |||
|     public string CountId { get; set; } = null!; | |||
| 
 | |||
|     public string BranchId { get; set; } = null!; | |||
| } | |||
| @ -0,0 +1,25 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.POSModels; | |||
| 
 | |||
| public partial class Tbldeliveryhead | |||
| { | |||
|     public string DeliveryId { get; set; } = null!; | |||
| 
 | |||
|     public string BranchId { get; set; } = null!; | |||
| 
 | |||
|     public string? GeneratedBy { get; set; } | |||
| 
 | |||
|     public DateTime? DateInitiated { get; set; } | |||
| 
 | |||
|     public DateTime? DateCompleted { get; set; } | |||
| 
 | |||
|     public string? Destination { get; set; } | |||
| 
 | |||
|     public string? CustomerId { get; set; } | |||
| 
 | |||
|     public decimal? TotalCost { get; set; } | |||
| 
 | |||
|     public string? Status { get; set; } | |||
| } | |||
| @ -0,0 +1,25 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.POSModels; | |||
| 
 | |||
| public partial class Tbldeliveryrecipient | |||
| { | |||
|     public string DeliveryId { get; set; } = null!; | |||
| 
 | |||
|     public string BranchId { get; set; } = null!; | |||
| 
 | |||
|     public string? Fullname { get; set; } | |||
| 
 | |||
|     public string? Address { get; set; } | |||
| 
 | |||
|     public string? Telephone { get; set; } | |||
| 
 | |||
|     public string? Email { get; set; } | |||
| 
 | |||
|     public string? CustomerId { get; set; } | |||
| 
 | |||
|     public DateOnly? FromDate { get; set; } | |||
| 
 | |||
|     public DateOnly? ToDate { get; set; } | |||
| } | |||
| @ -0,0 +1,19 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.POSModels; | |||
| 
 | |||
| public partial class Tbldiscountlog | |||
| { | |||
|     public string? ReceiptId { get; set; } | |||
| 
 | |||
|     public string? Cashier { get; set; } | |||
| 
 | |||
|     public DateTime? Date { get; set; } | |||
| 
 | |||
|     public decimal? Discount { get; set; } | |||
| 
 | |||
|     public string BranchId { get; set; } = null!; | |||
| 
 | |||
|     public string CountId { get; set; } = null!; | |||
| } | |||
| @ -0,0 +1,33 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.POSModels; | |||
| 
 | |||
| public partial class Tbldriver | |||
| { | |||
|     public string DriverId { get; set; } = null!; | |||
| 
 | |||
|     public string BranchId { get; set; } = null!; | |||
| 
 | |||
|     public string? Firstname { get; set; } | |||
| 
 | |||
|     public string? Surname { get; set; } | |||
| 
 | |||
|     public string? Middlename { get; set; } | |||
| 
 | |||
|     public DateOnly? DateOfBirth { get; set; } | |||
| 
 | |||
|     public string? Address1 { get; set; } | |||
| 
 | |||
|     public string? Address2 { get; set; } | |||
| 
 | |||
|     public string? Telephone { get; set; } | |||
| 
 | |||
|     public string? Email { get; set; } | |||
| 
 | |||
|     public string? City { get; set; } | |||
| 
 | |||
|     public string? State { get; set; } | |||
| 
 | |||
|     public string? Status { get; set; } | |||
| } | |||
| @ -0,0 +1,15 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.POSModels; | |||
| 
 | |||
| public partial class Tblinventory | |||
| { | |||
|     public string? Pcode { get; set; } | |||
| 
 | |||
|     public int? Quantity { get; set; } | |||
| 
 | |||
|     public string BranchId { get; set; } = null!; | |||
| 
 | |||
|     public string CountId { get; set; } = null!; | |||
| } | |||
| @ -0,0 +1,17 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.POSModels; | |||
| 
 | |||
| public partial class Tblinventoryentry | |||
| { | |||
|     public string? Pcode { get; set; } | |||
| 
 | |||
|     public int? Quantity { get; set; } | |||
| 
 | |||
|     public DateTime? Date { get; set; } | |||
| 
 | |||
|     public string BranchId { get; set; } = null!; | |||
| 
 | |||
|     public string CountId { get; set; } = null!; | |||
| } | |||
| @ -0,0 +1,29 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.POSModels; | |||
| 
 | |||
| public partial class Tblinvoice | |||
| { | |||
|     public string? InvoiceId { get; set; } | |||
| 
 | |||
|     public string? Pcode { get; set; } | |||
| 
 | |||
|     public int? Quantity { get; set; } | |||
| 
 | |||
|     public decimal? Unitprice { get; set; } | |||
| 
 | |||
|     public string? Unit { get; set; } | |||
| 
 | |||
|     public decimal? Totalprice { get; set; } | |||
| 
 | |||
|     public DateOnly? DateGenerated { get; set; } | |||
| 
 | |||
|     public string? Status { get; set; } | |||
| 
 | |||
|     public string? GeneratedBy { get; set; } | |||
| 
 | |||
|     public string BranchId { get; set; } = null!; | |||
| 
 | |||
|     public string CountId { get; set; } = null!; | |||
| } | |||
| @ -0,0 +1,19 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.POSModels; | |||
| 
 | |||
| public partial class Tblpricechange | |||
| { | |||
|     public string? Pcode { get; set; } | |||
| 
 | |||
|     public decimal? PreviousPrice { get; set; } | |||
| 
 | |||
|     public decimal? CurrentPrice { get; set; } | |||
| 
 | |||
|     public DateTime? ChangeDate { get; set; } | |||
| 
 | |||
|     public string BranchId { get; set; } = null!; | |||
| 
 | |||
|     public string CountId { get; set; } = null!; | |||
| } | |||
| @ -0,0 +1,31 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.POSModels; | |||
| 
 | |||
| public partial class Tblproduct | |||
| { | |||
|     public string? Pcode { get; set; } | |||
| 
 | |||
|     public string? Barcode { get; set; } | |||
| 
 | |||
|     public string? Pdesc { get; set; } | |||
| 
 | |||
|     public string? Bid { get; set; } | |||
| 
 | |||
|     public string? Cid { get; set; } | |||
| 
 | |||
|     public decimal? Price { get; set; } | |||
| 
 | |||
|     public decimal? Costprice { get; set; } | |||
| 
 | |||
|     public string? BaseUnit { get; set; } | |||
| 
 | |||
|     public string? ProductName { get; set; } | |||
| 
 | |||
|     public string? Status { get; set; } | |||
| 
 | |||
|     public string BranchId { get; set; } = null!; | |||
| 
 | |||
|     public string CountId { get; set; } = null!; | |||
| } | |||
| @ -0,0 +1,13 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Biskilog_Accounting.Server.POSModels; | |||
| 
 | |||
| public partial class Tblsyncinfo | |||
| { | |||
|     public string TableName { get; set; } = null!; | |||
| 
 | |||
|     public DateTime? LastSyncDate { get; set; } = DateTime.MinValue; | |||
| 
 | |||
|     public string? BranchId { get; set; } | |||
| } | |||
| @ -0,0 +1,19 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.POSModels; | |||
| 
 | |||
| public partial class Tbltruck | |||
| { | |||
|     public string TruckId { get; set; } = null!; | |||
| 
 | |||
|     public string BranchId { get; set; } = null!; | |||
| 
 | |||
|     public string? LicensePlate { get; set; } | |||
| 
 | |||
|     public string? Brand { get; set; } | |||
| 
 | |||
|     public string? Driver { get; set; } | |||
| 
 | |||
|     public decimal? Weight { get; set; } | |||
| } | |||
| @ -0,0 +1,19 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.POSModels; | |||
| 
 | |||
| public partial class TbltruckDrivermapping | |||
| { | |||
|     public string? TruckId { get; set; } | |||
| 
 | |||
|     public string? DriverId { get; set; } | |||
| 
 | |||
|     public DateTime? DateEntry { get; set; } | |||
| 
 | |||
|     public string? Operation { get; set; } | |||
| 
 | |||
|     public string CountId { get; set; } = null!; | |||
| 
 | |||
|     public string BranchId { get; set; } = null!; | |||
| } | |||
| @ -0,0 +1,21 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.POSModels; | |||
| 
 | |||
| public partial class Tbltruckassignment | |||
| { | |||
|     public string? OrderId { get; set; } | |||
| 
 | |||
|     public decimal? Cost { get; set; } | |||
| 
 | |||
|     public string? TruckId { get; set; } | |||
| 
 | |||
|     public string? Status { get; set; } | |||
| 
 | |||
|     public DateTime? DateAssigned { get; set; } | |||
| 
 | |||
|     public string CountId { get; set; } = null!; | |||
| 
 | |||
|     public string BranchId { get; set; } = null!; | |||
| } | |||
| @ -0,0 +1,19 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.POSModels; | |||
| 
 | |||
| public partial class Tbltruckinventory | |||
| { | |||
|     public string? TruckId { get; set; } | |||
| 
 | |||
|     public string? Pcode { get; set; } | |||
| 
 | |||
|     public int? Quantity { get; set; } | |||
| 
 | |||
|     public string? Unit { get; set; } | |||
| 
 | |||
|     public string CountId { get; set; } = null!; | |||
| 
 | |||
|     public string BranchId { get; set; } = null!; | |||
| } | |||
| @ -0,0 +1,33 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.POSModels; | |||
| 
 | |||
| public partial class Tbluser | |||
| { | |||
|     public string Username { get; set; } = null!; | |||
| 
 | |||
|     public string BranchId { get; set; } = null!; | |||
| 
 | |||
|     public string? Password { get; set; } = string.Empty; | |||
| 
 | |||
|     public string? Firstname { get; set; } = string.Empty; | |||
| 
 | |||
|     public string? Surname { get; set; } = string.Empty; | |||
| 
 | |||
|     public string? StreetAddress1 { get; set; } = string.Empty; | |||
| 
 | |||
|     public string? StreetAddress2 { get; set; } = string.Empty; | |||
| 
 | |||
|     public string? City { get; set; } = string.Empty; | |||
| 
 | |||
|     public string? StateOrProvince { get; set; } = string.Empty; | |||
| 
 | |||
|     public string? Telephone { get; set; } = string.Empty; | |||
| 
 | |||
|     public string? Email { get; set; } | |||
| 
 | |||
|     public string? AccessLevel { get; set; } | |||
| 
 | |||
|     public DateTime? LastLogin { get; set; } | |||
| } | |||
| @ -0,0 +1,23 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.POSModels; | |||
| 
 | |||
| public partial class Tbstock | |||
| { | |||
|     public string? Refno { get; set; } | |||
| 
 | |||
|     public string? Pcode { get; set; } | |||
| 
 | |||
|     public int? Qty { get; set; } | |||
| 
 | |||
|     public DateTime? Sdate { get; set; } | |||
| 
 | |||
|     public string? Stockinby { get; set; } | |||
| 
 | |||
|     public string? BranchId { get; set; } | |||
| 
 | |||
|     public string CountId { get; set; } = null!; | |||
| 
 | |||
|     public DateTime LastModified { get; set; } | |||
| } | |||
| @ -0,0 +1,17 @@ | |||
| using System; | |||
| using System.Collections.Generic; | |||
| 
 | |||
| namespace Cloud_Manager.Models.POSModels; | |||
| 
 | |||
| public partial class Unitofmeasure | |||
| { | |||
|     public string UnitCode { get; set; } = null!; | |||
| 
 | |||
|     public string BranchId { get; set; } = null!; | |||
| 
 | |||
|     public string? Unitname { get; set; } | |||
| 
 | |||
|     public string? Unitshort { get; set; } | |||
| 
 | |||
|     public string? Status { get; set; } | |||
| } | |||
| @ -0,0 +1,199 @@ | |||
| using Cloud_Manager.Models.ClientContractModels; | |||
| using Cloud_Manager.Models.Enums; | |||
| using Cloud_Manager.Models.Interfaces; | |||
| using Microsoft.Extensions.Configuration; | |||
| using Microsoft.IdentityModel.Tokens; | |||
| using System.IdentityModel.Tokens.Jwt; | |||
| using System.Security.Claims; | |||
| using System.Text; | |||
| 
 | |||
| namespace Cloud_Manager.Models.ServiceRepo | |||
| { | |||
|     public class TokenService : ITokenService | |||
|     { | |||
|         private IConfiguration m_configuration { get; } | |||
|         public TokenService(IConfiguration a_configuration) | |||
|         { | |||
|             m_configuration = a_configuration; | |||
|         } | |||
| 
 | |||
|         /// <summary>
 | |||
|         /// Validates a user access token
 | |||
|         /// </summary>
 | |||
|         /// <returns>AuthEnums.Valid if token is a valid and unexpired token</returns>
 | |||
|         public AuthEnums ValidateToken(string a_token) | |||
|         { | |||
|             try | |||
|             { | |||
|                 string token = a_token.Substring(6).Trim(); | |||
|                 var handler = new JwtSecurityTokenHandler(); | |||
|                 JwtSecurityToken jwtToken = (JwtSecurityToken)handler.ReadToken(token); | |||
| 
 | |||
|                 if (jwtToken.ValidFrom <= DateTime.Now && jwtToken.ValidTo > DateTime.Now) | |||
|                     return AuthEnums.Valid; | |||
|                 return AuthEnums.Expired; | |||
|             } | |||
|             catch (Exception ex) | |||
|             { | |||
|                 return AuthEnums.Invalid; | |||
|             } | |||
|         } | |||
|         /// <summary>
 | |||
|         /// Generates an access token based on the user
 | |||
|         /// </summary>
 | |||
|         /// <returns>A tokenized string</returns>
 | |||
|         public string GenerateToken(Userauth a_user, Contract a_clientContract, Databasemap a_database, List<string> a_business, bool a_comparison) | |||
|         { | |||
|             try | |||
|             { | |||
|                 //create claims details based on the user information
 | |||
|                 var claims = new[] { | |||
|                     new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), | |||
|                     new Claim(JwtRegisteredClaimNames.Iat, DateTime.UtcNow.ToString()), | |||
|                     new Claim("ContractStart",a_clientContract.StartDate !.Value.ToString()), | |||
|                     new Claim("ContractEnd",a_clientContract.EndDate!.Value.ToString()), | |||
|                     new Claim("UserId", a_user.UserId.ToString()), | |||
|                     new Claim("Username", a_user.Username.ToString()), | |||
|                     new Claim("DbId",a_database.DbNo.ToString()), | |||
|                     new Claim("ComparisonMode",a_comparison.ToString()), | |||
|                     new Claim("BranchId",a_business[0].ToString()), | |||
|                     new Claim("BranchAccess",string.Join(", ", a_business.ToArray())), | |||
|                     new Claim("ClientId", a_user.ClientId.ToString()), | |||
|                    }; | |||
| 
 | |||
|                 var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(m_configuration["Jwt:Key"]!)); | |||
| 
 | |||
|                 var signIn = new SigningCredentials(key, SecurityAlgorithms.HmacSha256); | |||
| 
 | |||
|                 var token = new JwtSecurityToken(m_configuration["Jwt:Issuer"], m_configuration["Jwt:Audience"], claims, expires: DateTime.UtcNow.AddDays(14), signingCredentials: signIn); | |||
|                 return $"{new JwtSecurityTokenHandler().WriteToken(token)}"; | |||
|             } | |||
|             catch (Exception ex) | |||
|             { | |||
|                 Console.WriteLine(ex.Message); | |||
|                 return AuthEnums.Error.ToString(); | |||
|             } | |||
|         } | |||
|         /// <summary>
 | |||
|         ///Deserializes the token string if valid to return the specified user role id in the token string
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_token"></param>
 | |||
|         /// <returns>RoleId</returns>
 | |||
|         public int? GetDatabaseIdFromToken(string a_token) | |||
|         { | |||
|             if (ValidateToken(a_token) == AuthEnums.Valid) | |||
|             { | |||
|                 string token = a_token.Substring(6).Trim(); | |||
|                 var handler = new JwtSecurityTokenHandler(); | |||
|                 JwtSecurityToken jwtToken = (JwtSecurityToken)handler.ReadToken(token); | |||
|                 return int.Parse(jwtToken.Claims.First(claim => claim.Type == "DbId").Value); | |||
|             } | |||
|             return null; | |||
|         } | |||
|         /// <summary>
 | |||
|         ///Deserializes the token string if valid to return the specified user id in the token string
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_token"></param>
 | |||
|         /// <returns>UserId</returns>
 | |||
|         public int? GetUserIdFromToken(string a_token) | |||
|         { | |||
|             if (ValidateToken(a_token) == AuthEnums.Valid) | |||
|             { | |||
|                 string token = a_token.Substring(6).Trim(); | |||
|                 var handler = new JwtSecurityTokenHandler(); | |||
|                 JwtSecurityToken jwtToken = (JwtSecurityToken)handler.ReadToken(token); | |||
|                 return int.Parse(jwtToken.Claims.First(claim => claim.Type == "UserId").Value); | |||
|             } | |||
|             return null; | |||
|         } | |||
|         /// <summary>
 | |||
|         ///Deserializes the token string if valid to return the specified username in the token string
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_token"></param>
 | |||
|         /// <returns>Username</returns>
 | |||
|         public string? GetUserNameFromToken(string a_token) | |||
|         { | |||
|             if (ValidateToken(a_token) == AuthEnums.Valid) | |||
|             { | |||
|                 string token = a_token.Substring(6).Trim(); | |||
|                 var handler = new JwtSecurityTokenHandler(); | |||
|                 JwtSecurityToken jwtToken = (JwtSecurityToken)handler.ReadToken(token); | |||
|                 return jwtToken.Claims.First(claim => claim.Type == "Username").Value; | |||
|             } | |||
|             return null; | |||
|         } | |||
|         /// <summary>
 | |||
|         ///Deserializes the token string if valid to return the specified branchId in the token string
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_token"></param>
 | |||
|         /// <returns>Username</returns>
 | |||
|         public string? GetBaseBranch(string a_token) | |||
|         { | |||
|             if (ValidateToken(a_token) == AuthEnums.Valid) | |||
|             { | |||
|                 string token = a_token.Substring(6).Trim(); | |||
|                 var handler = new JwtSecurityTokenHandler(); | |||
|                 JwtSecurityToken jwtToken = (JwtSecurityToken)handler.ReadToken(token); | |||
|                 return jwtToken.Claims.First(claim => claim.Type == "BranchId").Value; | |||
|             } | |||
|             return null; | |||
|         } | |||
| 
 | |||
|         public bool? GetComparison(string a_token) | |||
|         { | |||
|             if (ValidateToken(a_token) == AuthEnums.Valid) | |||
|             { | |||
|                 string token = a_token.Substring(6).Trim(); | |||
|                 var handler = new JwtSecurityTokenHandler(); | |||
|                 JwtSecurityToken jwtToken = (JwtSecurityToken)handler.ReadToken(token); | |||
|                 return bool.Parse(jwtToken.Claims.First(claim => claim.Type == "ComparisonMode").Value); | |||
|             } | |||
|             return null; | |||
|         } | |||
|         /// <summary>
 | |||
|         ///Deserializes the token string if valid to return the specified list of branches a user has access to in the token string
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_token"></param>
 | |||
|         /// <returns>Username</returns>
 | |||
|         public string? GetAllBranch(string a_token) | |||
|         { | |||
|             if (ValidateToken(a_token) == AuthEnums.Valid) | |||
|             { | |||
|                 string token = a_token.Substring(6).Trim(); | |||
|                 var handler = new JwtSecurityTokenHandler(); | |||
|                 JwtSecurityToken jwtToken = (JwtSecurityToken)handler.ReadToken(token); | |||
|                 return jwtToken.Claims.First(claim => claim.Type == "BranchAccess").Value; | |||
|             } | |||
|             return null; | |||
|         } | |||
|         /// <summary>
 | |||
|         /// Return a specified list of branches a user has access if comparison mode is set otherwise returns only the 
 | |||
|         /// active branch on the list
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_token"></param>
 | |||
|         /// <returns></returns>
 | |||
|         public IEnumerable<string> BranchIds(string a_token) | |||
|         { | |||
|             List<string> branchIds = new List<string>(); | |||
|             if (ValidateToken(a_token) == AuthEnums.Valid) | |||
|             { | |||
|                 bool comparison = GetComparison(a_token)!.Value; | |||
|                 if (comparison) | |||
|                 { | |||
|                     string? branches = GetAllBranch(a_token); | |||
|                     if (branches != null) | |||
|                     { | |||
|                         string[] branchArray = branches!.Split(); | |||
|                         branchIds.AddRange(branchArray); | |||
|                     } | |||
|                 } | |||
|                 else | |||
|                 { | |||
|                     string? baseBranch = GetBaseBranch(a_token); | |||
|                     branchIds.Add(baseBranch!); | |||
|                 } | |||
|             } | |||
|             return branchIds.AsEnumerable(); | |||
|         } | |||
|     } | |||
| } | |||
| @ -0,0 +1,103 @@ | |||
| using Microsoft.EntityFrameworkCore; | |||
| using Microsoft.IdentityModel.Tokens; | |||
| using Microsoft.OpenApi.Models; | |||
| using System.Text.Json.Serialization; | |||
| using System.Text; | |||
| using Cloud_Manager.Models.Interfaces; | |||
| using Cloud_Manager; | |||
| using Cloud_Manager.Services; | |||
| using Cloud_Manager.Models.ServiceRepo; | |||
| 
 | |||
| var builder = WebApplication.CreateBuilder(args); | |||
| 
 | |||
| // Add services to the container.
 | |||
| builder.Services.AddSignalR(); | |||
| builder.Services.AddControllers().AddJsonOptions(x => x.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles); | |||
| builder.Logging.ClearProviders(); | |||
| builder.Logging.AddConsole(); | |||
| builder.Services.AddEntityFrameworkMySql().AddDbContext<BiskilogContext>(options => | |||
| { | |||
|     options.UseMySql(builder.Configuration.GetConnectionString("Connection"), new MariaDbServerVersion(new Version())); | |||
| }); | |||
| builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); | |||
| builder.Services.AddDbContext<BiskAcdbContext>(); | |||
| builder.Services.AddScoped<ICompanyInfo, CompanyService>(); | |||
| builder.Services.AddScoped<IAuthService, AuthenticationService>(); | |||
| builder.Services.AddScoped<ITokenService, TokenService>(); | |||
| builder.Services.AddScoped<IConnectionService, ConnectionService>(); | |||
| builder.Services.AddScoped<IProduct, ProductRepo>(); | |||
| builder.Services.AddScoped<ISalesInterface, SalesService>(); | |||
| builder.Services.AddScoped<IUser, UserService>(); | |||
| builder.Services.AddScoped<ICustomer, CustomerService>(); | |||
| 
 | |||
| //builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>
 | |||
| //{
 | |||
| //    options.RequireHttpsMetadata = false;
 | |||
| //    options.SaveToken = true;
 | |||
| //    options.TokenValidationParameters = new TokenValidationParameters()
 | |||
| //    {
 | |||
| //        ValidateIssuer = true,
 | |||
| //        ValidateAudience = true,
 | |||
| //        ValidAudience = builder.Configuration["Jwt:Audience"],
 | |||
| //        ValidIssuer = builder.Configuration["Jwt:Issuer"],
 | |||
| //        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]))
 | |||
| //    };
 | |||
| //});
 | |||
| builder.Services.AddSwaggerGen(c => | |||
| { | |||
|     c.SwaggerDoc("v1", new OpenApiInfo { Title = "MyBlazor", Version = "v1" }); | |||
|     c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme | |||
|     { | |||
|         In = ParameterLocation.Header, | |||
|         Description = "Please enter a valid token", | |||
|         Name = "Authorization", | |||
|         Type = SecuritySchemeType.Http, | |||
|         BearerFormat = "JWT", | |||
|         Scheme = "Bearer" | |||
|     }); | |||
|     c.AddSecurityRequirement(new OpenApiSecurityRequirement | |||
|     { | |||
|         { | |||
|             new OpenApiSecurityScheme | |||
|             { | |||
|                 Reference = new OpenApiReference | |||
|                 { | |||
|                     Type=ReferenceType.SecurityScheme, | |||
|                     Id="Bearer" | |||
|                 } | |||
|             }, | |||
|             new string[]{} | |||
|         } | |||
|     }); | |||
| }); | |||
| builder.Services.AddControllersWithViews(); | |||
| 
 | |||
| var app = builder.Build(); | |||
| 
 | |||
| // Configure the HTTP request pipeline.
 | |||
| if (app.Environment.IsDevelopment()) | |||
| { | |||
| 
 | |||
|     app.UseSwagger(); | |||
|     app.UseSwaggerUI(c => | |||
|     { | |||
|         c.SwaggerEndpoint("/swagger/v1/swagger.json", "MyBlazor v1"); | |||
|         c.RoutePrefix = "api/docs"; | |||
|     }); | |||
| } | |||
| else | |||
| { | |||
|     app.UseExceptionHandler("/Error"); | |||
|     // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
 | |||
|     app.UseHsts(); | |||
| } | |||
| app.UseHttpsRedirection(); | |||
| 
 | |||
| app.UseRouting(); | |||
| 
 | |||
| app.UseAuthentication(); | |||
| app.UseAuthorization(); | |||
| 
 | |||
| app.MapControllers(); | |||
| 
 | |||
| app.Run(); | |||
| @ -0,0 +1,41 @@ | |||
| { | |||
|   "$schema": "https://json.schemastore.org/launchsettings.json", | |||
|   "iisSettings": { | |||
|     "windowsAuthentication": false, | |||
|     "anonymousAuthentication": true, | |||
|     "iisExpress": { | |||
|       "applicationUrl": "http://localhost:57096", | |||
|       "sslPort": 44350 | |||
|     } | |||
|   }, | |||
|   "profiles": { | |||
|     "http": { | |||
|       "commandName": "Project", | |||
|       "dotnetRunMessages": true, | |||
|       "launchBrowser": true, | |||
|       "launchUrl": "swagger", | |||
|       "applicationUrl": "http://localhost:5232", | |||
|       "environmentVariables": { | |||
|         "ASPNETCORE_ENVIRONMENT": "Development" | |||
|       } | |||
|     }, | |||
|     "https": { | |||
|       "commandName": "Project", | |||
|       "dotnetRunMessages": true, | |||
|       "launchBrowser": true, | |||
|       "launchUrl": "swagger", | |||
|       "applicationUrl": "https://localhost:7122;http://localhost:5232", | |||
|       "environmentVariables": { | |||
|         "ASPNETCORE_ENVIRONMENT": "Development" | |||
|       } | |||
|     }, | |||
|     "IIS Express": { | |||
|       "commandName": "IISExpress", | |||
|       "launchBrowser": true, | |||
|       "launchUrl": "swagger", | |||
|       "environmentVariables": { | |||
|         "ASPNETCORE_ENVIRONMENT": "Development" | |||
|       } | |||
|     } | |||
|   } | |||
| } | |||
| @ -0,0 +1,146 @@ | |||
| using Cloud_Manager; | |||
| using Cloud_Manager.Models.ClientContractModels; | |||
| using Cloud_Manager.Models.Enums; | |||
| using Cloud_Manager.Models.Interfaces; | |||
| using Microsoft.EntityFrameworkCore; | |||
| 
 | |||
| namespace Cloud_Manager.Services | |||
| { | |||
|     public class AuthenticationService : IAuthService | |||
|     { | |||
|         private readonly BiskilogContext m_context; | |||
|         private readonly ITokenService m_tokenService; | |||
| 
 | |||
|         public AuthenticationService(BiskilogContext a_context, ITokenService a_tokenService) | |||
|         { | |||
|             m_context = a_context; | |||
|             m_tokenService = a_tokenService; | |||
|         } | |||
| 
 | |||
|         /// <summary>
 | |||
|         /// Returns the status of a user account
 | |||
|         /// </summary>
 | |||
|         /// <returns>AuthEnums</returns>
 | |||
|         public AuthEnums AccountStatus(int? a_id, string? a_username) | |||
|         { | |||
|             if (m_context.Userauths.Any(i => i.UserId == a_id || i.Username == a_username)) | |||
|             { | |||
|                 return AuthEnums.Found; | |||
|             } | |||
|             else | |||
|             { | |||
|                 return AuthEnums.NotFound; | |||
|             } | |||
|         } | |||
|         /// <summary>
 | |||
|         /// Autenticates a user and returns a tokenized string
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_username"></param>
 | |||
|         /// <param name="a_password"></param>
 | |||
|         /// <returns>strings</returns>
 | |||
| 
 | |||
|         public async Task<string> AuthenticateClient(string a_username, string a_password) | |||
|         { | |||
|             var user = await GetUserAsync(a_username, a_password); | |||
| 
 | |||
|             if (user == null) | |||
|             { | |||
|                 return null; | |||
|             } | |||
|             user.LastLogin = DateTime.Now; | |||
|             m_context.Userauths.Update(user); | |||
|             m_context.SaveChanges(); | |||
| 
 | |||
| 
 | |||
|             Databasemap databasemap = GetClientDB(user.ClientId); | |||
| 
 | |||
|             List<int> businessIds = GetSiteaccesspermission(user.ClientId, user.UserId).Select(t => t.BusinessId).ToList(); | |||
|             Contract? contract = GetContract(user.ClientId, businessIds); | |||
|             List<string> businesses = GetClientbusiness(user.ClientId, user.UserId).Select(t => t.BusinessExternalId).ToList(); | |||
| 
 | |||
|             if (contract == null) | |||
|                 return AuthEnums.Invalid.ToString(); | |||
| 
 | |||
|             return m_tokenService.GenerateToken(user, contract, databasemap, businesses, false); | |||
|         } | |||
| 
 | |||
|         /// <summary>
 | |||
|         /// Creates a new user account
 | |||
|         /// </summary>
 | |||
|         /// returns AuthEnums.successful if the account was created successfully
 | |||
|         public AuthEnums CreateUser(Userauth a_user) | |||
|         { | |||
|             throw new NotImplementedException(); | |||
|             //if (AccountStatus(null, a_user.Username) == AuthEnums.Found)
 | |||
|             //    return AuthEnums.Registered;
 | |||
| 
 | |||
|             //a_user.Role = m_context.UserRoles.First(i => i.RoleId== a_user.RoleId);
 | |||
|             //a_user.Password = BCrypt.Net.BCrypt.HashPassword(a_user.Password);
 | |||
|             //m_context.Users.Add(a_user);
 | |||
| 
 | |||
|             //var result = m_context.SaveChangesAsync();
 | |||
|             //result.Wait();
 | |||
|             //if(result.Result > 0)
 | |||
|             //{
 | |||
|             //    return AuthEnums.Successful;
 | |||
|             //}
 | |||
|             //return AuthEnums.Error;
 | |||
|         } | |||
| 
 | |||
|         /// <summary>
 | |||
|         /// Deletes a user account
 | |||
|         /// </summary>
 | |||
|         /// <exception cref="NotImplementedException"></exception>
 | |||
|         public void DeleteUser(int a_id) | |||
|         { | |||
|             throw new NotImplementedException(); | |||
|         } | |||
| 
 | |||
|         public List<Clientbusiness> GetClientbusiness(int a_clientId, int userId) | |||
|         { | |||
|             return (from b in m_context.Clientbusinesses | |||
|                     join p in m_context.Siteaccesspermissions on new { b.ClientId, b.BusinessId } equals new { p.ClientId, p.BusinessId } | |||
|                     where p.UserId == userId && p.ClientId == a_clientId | |||
|                     select b).ToList(); | |||
|         } | |||
| 
 | |||
|         public Databasemap GetClientDB(int a_clientId) | |||
|         { | |||
|             return m_context.Databasemaps.First(t => t.ClientId == a_clientId); | |||
|         } | |||
| 
 | |||
|         public Contract? GetContract(int a_clientId, List<int> a_businessId) | |||
|         { | |||
|             return m_context.Contracts.FirstOrDefault(c => c.ClientId == a_clientId && a_businessId.Contains(c.BusinessId!.Value) && c.EndDate >= DateTime.Now); | |||
|         } | |||
| 
 | |||
|         public List<Siteaccesspermission> GetSiteaccesspermission(int a_clientId, int a_userId) | |||
|         { | |||
|             return m_context.Siteaccesspermissions.Where(t => t.ClientId == a_clientId && t.UserId == a_userId).ToList(); | |||
|         } | |||
| 
 | |||
|         private async Task<Userauth> GetUserAsync(string username, string password) | |||
|         { | |||
|             //Todo have complete implementation after means of creating user is done
 | |||
|             //try
 | |||
|             //{
 | |||
|             //    string pa = await m_context.Userauths.Where(u => u.Username == username).Select(u => u.Password).FirstAsync();
 | |||
|             //    bool verified = BCrypt.Net.BCrypt.Verify(password, pa);
 | |||
|             //    if (verified)
 | |||
|             //    {
 | |||
| 
 | |||
|             //TODO have a complete implementation
 | |||
|             return await m_context.Userauths.FirstAsync(u => u.Username == username && u.Passsword == password); | |||
|             //    }
 | |||
|             //    else
 | |||
|             //    {
 | |||
|             //        return null;
 | |||
|             //    }
 | |||
|             //}catch(Exception ex)
 | |||
|             //{
 | |||
|             //    //possible is user not found 
 | |||
|             //    return null;
 | |||
|             //}
 | |||
|         } | |||
|     } | |||
| } | |||
| @ -0,0 +1,227 @@ | |||
| using Cloud_Manager; | |||
| using Cloud_Manager.Models.Enums; | |||
| using Cloud_Manager.Models.Interfaces; | |||
| using Cloud_Manager.Models.POSModels; | |||
| using Microsoft.EntityFrameworkCore; | |||
| using Microsoft.Net.Http.Headers; | |||
| using MySqlConnector; | |||
| using System.Text.Json; | |||
| 
 | |||
| namespace Cloud_Manager.Services | |||
| { | |||
|     public class CompanyService : ICompanyInfo | |||
|     { | |||
|         private readonly BiskAcdbContext m_context; | |||
|         private readonly ITokenService m_tokenService; | |||
|         private readonly HttpContext m_httpContext; | |||
| 
 | |||
|         private Tblcompanydetail m_companyInfo { get; set; } | |||
|         private IEnumerable<Tblbranch> m_companyBranches { get; set; } | |||
|         public CompanyService(BiskAcdbContext a_context, ITokenService a_tokenService, IHttpContextAccessor a_httpContextAccessor) | |||
|         { | |||
|             m_context = a_context; | |||
|             m_tokenService = a_tokenService; | |||
|             m_httpContext = a_httpContextAccessor?.HttpContext; | |||
|             m_companyInfo = new Tblcompanydetail(); | |||
|             m_companyBranches = new List<Tblbranch>(); | |||
| 
 | |||
|             GetCompanyInfoAsync(); | |||
|             GetBranches(); | |||
|         } | |||
|         public IEnumerable<Tblbranch> FetchBranches() | |||
|         { | |||
|             return m_companyBranches; | |||
|         } | |||
| 
 | |||
|         public async Task<IEnumerable<Tblbranch>> GetBranches() | |||
|         { | |||
|             m_companyBranches = m_context.Tblbranches; | |||
|             return await Task.FromResult(m_companyBranches); | |||
|         } | |||
| 
 | |||
|         public string GetBranchName(string a_branchId) | |||
|         { | |||
|             return m_companyBranches.FirstOrDefault(b => b.BranchId == a_branchId).BranchName; | |||
|         } | |||
| 
 | |||
|         public Task<Tblcompanydetail> GetCompanyInfoAsync() | |||
|         { | |||
|             m_companyInfo = m_context.Tblcompanydetails.FirstOrDefault(); | |||
|             return Task.FromResult(m_companyInfo); | |||
|         } | |||
| 
 | |||
|         public string GetCompanyName() | |||
|         { | |||
|             return m_companyInfo.CompanyName; | |||
|         } | |||
|         public async Task SyncBranches(List<Tblbranch> a_items) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string jsonString = JsonSerializer.Serialize(a_items); | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     command.CommandText = "CALL BranchSync(@p0)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", jsonString)); | |||
|                     command.ExecuteNonQuery(); | |||
|                 } | |||
|             } | |||
|         } | |||
|         public DateTime GetLastSyncDate(string a_tablename) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string activeBranch = m_tokenService.GetBaseBranch(token)!; | |||
|                 DateTime? lastSync = m_context.Tblsyncinfos.FirstOrDefault(p => p.TableName == a_tablename && p.BranchId == activeBranch!)?.LastSyncDate; | |||
| 
 | |||
|                 if (lastSync != null) | |||
|                 { | |||
|                     return (DateTime)lastSync!; | |||
|                 } | |||
|             } | |||
|             return new DateTime(2000, 01, 01); | |||
|         } | |||
| 
 | |||
|         public void SetLastSyncDate(string a_tableName, DateTime a_timestamp) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string activeBranch = m_tokenService.GetBaseBranch(token)!; | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     command.CommandText = "CALL SetTableLastSync(@p0,@p1,@p2)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", a_tableName)); | |||
|                     command.Parameters.Add(new MySqlParameter("@p1", activeBranch)); | |||
|                     command.Parameters.Add(new MySqlParameter("@p2", a_timestamp)); | |||
|                     command.ExecuteNonQuery(); | |||
|                 } | |||
|             } | |||
| 
 | |||
|         } | |||
| 
 | |||
|         public async Task SyncSystemRoles(List<Systemuserrole> a_roles) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string jsonString = JsonSerializer.Serialize(a_roles); | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     command.CommandText = "CALL SystemUserRolesSync(@p0)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", jsonString)); | |||
|                     command.ExecuteNonQuery(); | |||
|                 } | |||
|             } | |||
|         } | |||
|         public async Task SyncCompanyDetails(List<Tblcompanydetail> a_details) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string jsonString = JsonSerializer.Serialize(a_details); | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     command.CommandText = "CALL CompanyDetailSync(@p0)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", jsonString)); | |||
|                     command.ExecuteNonQuery(); | |||
|                 } | |||
|             } | |||
|         } | |||
| 
 | |||
|         public async Task SyncDriverDetails(List<Tbldriver> a_details) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string jsonString = JsonSerializer.Serialize(a_details); | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     command.CommandText = "CALL DriverSync(@p0)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", jsonString)); | |||
|                     command.ExecuteNonQuery(); | |||
|                 } | |||
|             } | |||
|         } | |||
| 
 | |||
|         public async Task SyncTrucks(List<Tbltruck> a_trucks) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string jsonString = JsonSerializer.Serialize(a_trucks); | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     command.CommandText = "CALL TruckSync(@p0)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", jsonString)); | |||
|                     command.ExecuteNonQuery(); | |||
|                 } | |||
|             } | |||
|         } | |||
| 
 | |||
|         public async Task SyncTruckAssignments(List<Tbltruckassignment> a_assignments) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string jsonString = JsonSerializer.Serialize(a_assignments); | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     command.CommandText = "CALL TruckAssignmentSync(@p0)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", jsonString)); | |||
|                     command.ExecuteNonQuery(); | |||
|                 } | |||
|             } | |||
|         } | |||
| 
 | |||
|         public async Task SyncTruckMappings(List<TbltruckDrivermapping> a_mapping) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string jsonString = JsonSerializer.Serialize(a_mapping); | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     command.CommandText = "CALL TruckDriverMappingSync(@p0)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", jsonString)); | |||
|                     command.ExecuteNonQuery(); | |||
|                 } | |||
|             } | |||
|         } | |||
| 
 | |||
|         public async Task SyncTruckInventory(List<Tbltruckinventory> a_inventories) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string jsonString = JsonSerializer.Serialize(a_inventories); | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     command.CommandText = "CALL TruckInventorySync(@p0)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", jsonString)); | |||
|                     command.ExecuteNonQuery(); | |||
|                 } | |||
|             } | |||
|         } | |||
|     } | |||
| } | |||
| @ -0,0 +1,50 @@ | |||
| using Cloud_Manager; | |||
| using Cloud_Manager.Models.ClientContractModels; | |||
| using Cloud_Manager.Models.Enums; | |||
| using Cloud_Manager.Models.Interfaces; | |||
| using Microsoft.EntityFrameworkCore; | |||
| using Microsoft.Extensions.Configuration; | |||
| 
 | |||
| namespace Cloud_Manager.Services | |||
| { | |||
|     public class ConnectionService : IConnectionService | |||
|     { | |||
|         private readonly BiskilogContext m_context; | |||
|         private readonly IConfiguration m_configuration; | |||
| 
 | |||
|         public ConnectionService(BiskilogContext a_context, IConfiguration configuration) | |||
|         { | |||
|             m_context = a_context; | |||
|             m_configuration = configuration; | |||
|         } | |||
|         /// <summary>
 | |||
|         /// Prepares and returns the connection string for a client using the specified database id
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_databaseId">Specified database id to use</param>
 | |||
|         /// <returns></returns>
 | |||
|         public string GetClientConnectionString(int a_databaseId) | |||
|         { | |||
|             Databasemap? dbMap = m_context.Databasemaps.Find(a_databaseId); | |||
|             if (dbMap != null) | |||
|             { | |||
|                 string rawConString = m_configuration.GetConnectionString("PrivateConnection")!.ToString(); | |||
|                 return string.Format(rawConString, dbMap.Domain, dbMap.DbName); | |||
|             } | |||
|             return ConnectionEnums.ConnectionNotEstablished.ToString(); | |||
|         } | |||
|         /// <summary>
 | |||
|         /// Prepare the DB context from the specified connection string
 | |||
|         /// </summary>
 | |||
|         /// <param name="a_context"></param>
 | |||
|         /// <param name="a_connectionString"></param>
 | |||
|         /// <returns>A configured BiskAcdbContext</returns>
 | |||
|         public object PrepareDBContext(string a_connectionString) | |||
|         { | |||
|             throw new NotImplementedException(); | |||
|             //DbContextOptionsBuilder<BiskAcdbContext> acdbContext = new DbContextOptionsBuilder<BiskAcdbContext>();
 | |||
|             //acdbContext.UseMySql(a_connectionString, new MariaDbServerVersion(new Version()));
 | |||
| 
 | |||
|             //return new BiskAcdbContext(acdbContext.Options);
 | |||
|         } | |||
|     } | |||
| } | |||
| @ -0,0 +1,89 @@ | |||
| using Cloud_Manager; | |||
| using Cloud_Manager.Models.CustomModels; | |||
| using Cloud_Manager.Models.Enums; | |||
| using Cloud_Manager.Models.Interfaces; | |||
| using Cloud_Manager.Models.POSModels; | |||
| using Microsoft.EntityFrameworkCore; | |||
| using Microsoft.Net.Http.Headers; | |||
| using MySqlConnector; | |||
| using System.Text.Json; | |||
| 
 | |||
| namespace Cloud_Manager.Services | |||
| { | |||
|     public class CustomerService : ICustomer | |||
|     { | |||
|         private readonly BiskAcdbContext m_context; | |||
|         private readonly ITokenService m_tokenService; | |||
|         private readonly HttpContext m_httpContext; | |||
| 
 | |||
|         public CustomerService(BiskAcdbContext a_context, ITokenService a_tokenService, IHttpContextAccessor a_httpContextAccessor) | |||
|         { | |||
|             m_context = a_context; | |||
|             m_tokenService = a_tokenService; | |||
|             m_httpContext = a_httpContextAccessor?.HttpContext; | |||
|         } | |||
|         public IEnumerable<CustomerAccounts> FetchCustomers() | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
| 
 | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 IEnumerable<string> accessiblebranches = m_tokenService.BranchIds(token); | |||
| 
 | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     command.CommandText = "CALL GetCustomers(@p0)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", string.Join(", ", accessiblebranches.ToArray()))); | |||
| 
 | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     using (var reader = command.ExecuteReader()) | |||
|                     { | |||
|                         while (reader.Read()) | |||
|                         { | |||
|                             yield return new CustomerAccounts | |||
|                             { | |||
|                                 Customer = new Tblcustomer | |||
|                                 { | |||
|                                     CustomerId = reader.GetString(0), | |||
|                                     BranchId = reader.GetString(1), | |||
|                                     Firstname = reader.GetString(2), | |||
|                                     Surname = reader.GetString(3), | |||
|                                     Address = reader.GetString(4), | |||
|                                     Telephone = reader.GetString(5), | |||
|                                     DateAdded = reader.GetDateTime(6), | |||
|                                     Status = reader.GetString(7), | |||
|                                     Email = reader.GetString(8), | |||
|                                     FinancialStatus = reader.GetString(9), | |||
|                                 }, | |||
|                                 Debt = reader.GetDecimal(10) | |||
|                             }; | |||
|                         } | |||
|                     } | |||
|                 } | |||
|             } | |||
|         } | |||
| 
 | |||
|         public Task<IEnumerable<CustomerAccounts>> GetCustomers() | |||
|         { | |||
|             throw new NotImplementedException(); | |||
|         } | |||
| 
 | |||
|         public async Task SyncCustomers(List<Tblcustomer> a_details) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string jsonString = JsonSerializer.Serialize(a_details); | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     command.CommandText = "CALL CustomerSync(@p0)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", jsonString)); | |||
|                     command.ExecuteNonQuery(); | |||
|                 } | |||
|             } | |||
|         } | |||
|     } | |||
| } | |||
| @ -0,0 +1,411 @@ | |||
| using Cloud_Manager; | |||
| using Cloud_Manager.Models.CustomModels; | |||
| using Cloud_Manager.Models.Enums; | |||
| using Cloud_Manager.Models.Interfaces; | |||
| using Cloud_Manager.Models.POSModels; | |||
| using Microsoft.EntityFrameworkCore; | |||
| using Microsoft.Net.Http.Headers; | |||
| using MySqlConnector; | |||
| using System.Data; | |||
| using System.Data.Common; | |||
| using System.Text.Json; | |||
| 
 | |||
| namespace Cloud_Manager.Services | |||
| { | |||
|     public class ProductRepo : IProduct | |||
|     { | |||
|         private readonly BiskAcdbContext m_context; | |||
|         private readonly ITokenService m_tokenService; | |||
|         private readonly HttpContext m_httpContext; | |||
| 
 | |||
|         public event EventHandler ProductsChanged; | |||
|         public event EventHandler UnitsChanged; | |||
|         public event EventHandler BrandsChanged; | |||
|         public event EventHandler CategoriesChanged; | |||
| 
 | |||
|         public ProductRepo(BiskAcdbContext a_context, ITokenService a_tokenService, IHttpContextAccessor a_httpContextAccessor) | |||
|         { | |||
|             m_context = a_context; | |||
|             m_tokenService = a_tokenService; | |||
|             m_httpContext = a_httpContextAccessor?.HttpContext; | |||
|         } | |||
|         /// <summary>
 | |||
|         /// Gets all products from the server
 | |||
|         /// </summary>
 | |||
|         /// <returns></returns>
 | |||
|         public IEnumerable<ProductItem> GetProducts(string a_productKey = "") | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
| 
 | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 IEnumerable<string> accessiblebranches = m_tokenService.BranchIds(token); | |||
| 
 | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     command.CommandText = "CALL GetProducts(@p0)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", string.Join(", ", accessiblebranches.ToArray()))); | |||
| 
 | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     using (var reader = command.ExecuteReader()) | |||
|                     { | |||
|                         while (reader.Read()) | |||
|                         { | |||
|                             List<ProductUnits> pUnits = new List<ProductUnits>(); | |||
| 
 | |||
|                             yield return new ProductItem | |||
|                             { | |||
|                                 Product = new Tblproduct | |||
|                                 { | |||
|                                     Pcode = reader.GetString(0), | |||
|                                     ProductName = reader.GetString(1), | |||
|                                     Pdesc = reader.GetString(2), | |||
|                                     BaseUnit = reader.GetString(3), | |||
|                                     Costprice = reader.GetDecimal(4), | |||
|                                     Status = reader.GetString(5), | |||
|                                     Price = reader.GetDecimal(6), | |||
|                                     BranchId = reader.GetString(7), | |||
|                                 }, | |||
|                                 BaseUnit = reader.GetString(3), | |||
|                                 Stock = new Tblinventory | |||
|                                 { | |||
|                                     Quantity = reader.GetInt32(8) | |||
|                                 }, | |||
|                                 Restocklevel = new Restocklevel | |||
|                                 { | |||
|                                     WarnLevel = reader.GetInt32(9), | |||
|                                     Unit = reader.GetString(10), | |||
|                                 }, | |||
|                                 Units = GetAltUnits(reader) | |||
|                             }; | |||
|                         } | |||
|                     } | |||
|                 } | |||
|             } | |||
|         } | |||
|         private List<ProductUnits> GetAltUnits(DbDataReader a_reader) | |||
|         { | |||
|             List<ProductUnits> pUnits = new List<ProductUnits>(); | |||
|             for (int i = 1; i < 5; i++) | |||
|             { | |||
|                 if (!a_reader.IsDBNull(a_reader.GetOrdinal($"AltUnit{i}"))) | |||
|                 { | |||
|                     pUnits.Add(new ProductUnits | |||
|                     { | |||
|                         UnitCode = a_reader.GetFieldValue<string>($"AltUnit{i}"), | |||
|                         QuantityUnit = a_reader.GetFieldValue<int>($"AltUnit{i}QTY"), | |||
|                         PriceUnit = a_reader.GetFieldValue<decimal>($"AltUnit{i}Price"), | |||
|                         DistinctiveCode = a_reader.GetFieldValue<string>($"AltUnit{i}distinctiveCode") | |||
|                     }); | |||
|                 } | |||
|                 else | |||
|                 { | |||
|                     return pUnits; | |||
|                 } | |||
|             } | |||
|             return pUnits; | |||
|         } | |||
| 
 | |||
|         public IEnumerable<Unitofmeasure> GetUnitofmeasures() | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
| 
 | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 IEnumerable<string> accessiblebranches = m_tokenService.BranchIds(token); | |||
| 
 | |||
|                 return m_context.Unitofmeasures.Where(b => accessiblebranches.Contains(b.BranchId)); | |||
|             } | |||
|             return new List<Unitofmeasure>(); | |||
|         } | |||
| 
 | |||
| 
 | |||
| 
 | |||
|         public IEnumerable<Tblbrand> GetBrands(string a_brandKey = "") | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
| 
 | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 IEnumerable<string> accessiblebranches = m_tokenService.BranchIds(token); | |||
| 
 | |||
|                 return m_context.Tblbrands.Where(b => accessiblebranches.Contains(b.BranchId)); | |||
|             } | |||
|             return new List<Tblbrand>(); | |||
|         } | |||
| 
 | |||
|         public IEnumerable<Tblcategory> GetCategories(string a_categoryKey = "") | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
| 
 | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 IEnumerable<string> accessiblebranches = m_tokenService.BranchIds(token); | |||
| 
 | |||
|                 return m_context.Tblcategories.Where(b => accessiblebranches.Contains(b.BranchId)); | |||
|             } | |||
|             return new List<Tblcategory>(); | |||
|         } | |||
|         public async Task SyncProducts(List<Tblproduct> a_item) | |||
|         { | |||
|             try | |||
|             { | |||
|                 string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|                 if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|                 { | |||
|                     string jsonString = JsonSerializer.Serialize(a_item); | |||
|                     using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                     { | |||
|                         m_context.Database.OpenConnection(); | |||
| 
 | |||
|                         command.CommandText = "CALL ProductSync(@p0)"; | |||
|                         command.Parameters.Add(new MySqlParameter("@p0", jsonString)); | |||
|                         command.ExecuteNonQuery(); | |||
|                     } | |||
|                 } | |||
|             } | |||
|             catch (Exception ex) | |||
|             { | |||
|                 throw new Exception(ex.Message, ex); | |||
|             } | |||
|         } | |||
| 
 | |||
|         public async Task SyncInventory(List<Tblinventory> a_item) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string jsonString = JsonSerializer.Serialize(a_item); | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     command.CommandText = "CALL InventorySync(@p0)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", jsonString)); | |||
|                     command.ExecuteNonQuery(); | |||
|                 } | |||
|             } | |||
|         } | |||
| 
 | |||
|         public async Task SyncInventoryEntries(List<Tblinventoryentry> a_item) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string jsonString = JsonSerializer.Serialize(a_item); | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     command.CommandText = "CALL InventoryEntriesSync(@p0)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", jsonString)); | |||
|                     command.ExecuteNonQuery(); | |||
|                 } | |||
|             } | |||
|         } | |||
| 
 | |||
|         public async Task SyncPriceChanges(List<Tblpricechange> a_items) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string jsonString = JsonSerializer.Serialize(a_items); | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     command.CommandText = "CALL PriceChangeSync(@p0)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", jsonString)); | |||
|                     command.ExecuteNonQuery(); | |||
|                 } | |||
|             } | |||
|         } | |||
| 
 | |||
|         public async Task SyncProductAltUnit(List<Productaltunit> a_items) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string jsonString = JsonSerializer.Serialize(a_items); | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     command.CommandText = "CALL ProductAltUnitSync(@p0)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", jsonString)); | |||
|                     command.ExecuteNonQuery(); | |||
|                 } | |||
|             } | |||
|         } | |||
| 
 | |||
|         public async Task SyncRestockAsync(List<Restocklevel> a_items) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string jsonString = JsonSerializer.Serialize(a_items); | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     command.CommandText = "CALL RestockLevelsSync(@p0)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", jsonString)); | |||
|                     command.ExecuteNonQuery(); | |||
|                 } | |||
|             } | |||
|         } | |||
| 
 | |||
|         public async Task SyncUnitOfMeasureAsync(List<Unitofmeasure> a_items) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string jsonString = JsonSerializer.Serialize(a_items); | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     command.CommandText = "CALL UnitOfMeasureSync(@p0)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", jsonString)); | |||
|                     command.ExecuteNonQuery(); | |||
|                 } | |||
|             } | |||
|         } | |||
| 
 | |||
|         public async Task SyncStockAsync(List<Tbstock> a_items) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string jsonString = JsonSerializer.Serialize(a_items); | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     command.CommandText = "CALL StockSync(@p0)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", jsonString)); | |||
|                     command.ExecuteNonQuery(); | |||
|                 } | |||
|             } | |||
|         } | |||
| 
 | |||
|         public async Task SyncBrandsAsync(List<Tblbrand> a_items) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string jsonString = JsonSerializer.Serialize(a_items); | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     command.CommandText = "CALL BrandSync(@p0)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", jsonString)); | |||
|                     command.ExecuteNonQuery(); | |||
|                 } | |||
|             } | |||
|         } | |||
| 
 | |||
|         public async Task SyncCategoriesAsync(List<Tblcategory> a_items) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string jsonString = JsonSerializer.Serialize(a_items); | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     command.CommandText = "CALL CategorySync(@p0)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", jsonString)); | |||
|                     command.ExecuteNonQuery(); | |||
|                 } | |||
|             } | |||
|         } | |||
|         public DateTime GetLastSyncDate(string a_tablename) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string activeBranch = m_tokenService.GetBaseBranch(token)!; | |||
|                 DateTime? lastSync = m_context.Tblsyncinfos.FirstOrDefault(p => p.TableName == a_tablename && p.BranchId == activeBranch!)?.LastSyncDate; | |||
| 
 | |||
|                 if (lastSync != null) | |||
|                 { | |||
|                     return (DateTime)lastSync!; | |||
|                 } | |||
|             } | |||
|             return new DateTime(2000, 01, 01); | |||
|         } | |||
| 
 | |||
|         public void SetLastSyncDate(string a_tableName, DateTime a_timestamp) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string activeBranch = m_tokenService.GetBaseBranch(token)!; | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     command.CommandText = "CALL SetTableLastSync(@p0,@p1,@p2)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", a_tableName)); | |||
|                     command.Parameters.Add(new MySqlParameter("@p1", activeBranch)); | |||
|                     command.Parameters.Add(new MySqlParameter("@p2", a_timestamp)); | |||
|                     command.ExecuteNonQuery(); | |||
|                 } | |||
|             } | |||
| 
 | |||
|         } | |||
|         #region Only Need to implement in the client Side
 | |||
|         public Task FetchUnits() | |||
|         { | |||
|             throw new NotImplementedException(); | |||
|         } | |||
|         public Task FetchProducts() | |||
|         { | |||
|             throw new NotImplementedException(); | |||
|         } | |||
| 
 | |||
|         public ProductItem GetProductById(string a_id) | |||
|         { | |||
|             throw new NotImplementedException(); | |||
|         } | |||
| 
 | |||
|         public ProductItem GetProductByName(string name) | |||
|         { | |||
|             throw new NotImplementedException(); | |||
|         } | |||
| 
 | |||
|         public void RefreshList() | |||
|         { | |||
|             throw new NotImplementedException(); | |||
|         } | |||
| 
 | |||
|         public string GetUnitName(string a_unitCode) | |||
|         { | |||
|             throw new NotImplementedException(); | |||
|         } | |||
|         public Task FetchBrands() | |||
|         { | |||
|             throw new NotImplementedException(); | |||
|         } | |||
| 
 | |||
|         public Task FetchCategories() | |||
|         { | |||
|             throw new NotImplementedException(); | |||
|         } | |||
| 
 | |||
|         public IEnumerable<ProductItem> GetLowstockItems() | |||
|         { | |||
|             throw new NotImplementedException(); | |||
|         } | |||
| 
 | |||
|         public Task FetchLowStockProducts() | |||
|         { | |||
|             throw new NotImplementedException(); | |||
|         } | |||
|     } | |||
|     #endregion
 | |||
| } | |||
| @ -0,0 +1,381 @@ | |||
| using Cloud_Manager.CloudHubs; | |||
| using Cloud_Manager.Models.CustomModels; | |||
| using Cloud_Manager.Models.Enums; | |||
| using Cloud_Manager.Models.Interfaces; | |||
| using Cloud_Manager.Models.POSModels; | |||
| using Microsoft.AspNetCore.SignalR; | |||
| using Microsoft.EntityFrameworkCore; | |||
| using Microsoft.Net.Http.Headers; | |||
| using MySqlConnector; | |||
| using System.Text.Json; | |||
| 
 | |||
| namespace Cloud_Manager.Services | |||
| { | |||
|     public class SalesService : ISalesInterface | |||
|     { | |||
|         private readonly BiskAcdbContext m_context; | |||
|         private readonly ITokenService m_tokenService; | |||
|         private readonly HttpContext m_httpContext; | |||
|         private readonly IHubContext<SalesHub, ISalesHub> m_salesHub; | |||
| 
 | |||
|         public event EventHandler TransactionsChanged; | |||
|         public event EventHandler FetchComplete; | |||
|         public event EventHandler FetchStart; | |||
| 
 | |||
|         public SalesService(BiskAcdbContext a_context, ITokenService a_tokenService, | |||
|             IHttpContextAccessor a_httpContextAccessor, IHubContext<SalesHub, ISalesHub> a_salesHub) | |||
|         { | |||
|             m_context = a_context; | |||
|             m_tokenService = a_tokenService; | |||
|             m_httpContext = a_httpContextAccessor?.HttpContext; | |||
|             m_salesHub = a_salesHub; | |||
|         } | |||
| 
 | |||
|         public Task FetchRecentTransaction(int a_limit) | |||
|         { | |||
|             throw new NotImplementedException(); | |||
|         } | |||
| 
 | |||
|         public IEnumerable<SaleItem> GetRecentTransaction() | |||
|         { | |||
|             throw new NotImplementedException(); | |||
|         } | |||
| 
 | |||
|         public IEnumerable<SaleItem> GetTransactions(DateTime a_start, DateTime a_end) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
| 
 | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 IEnumerable<string> accessiblebranches = m_tokenService.BranchIds(token); | |||
| 
 | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     command.CommandText = "CALL GetTransactionsByDate(@p0,@p1,@p2)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", a_start.ToString("yyyy-MM-dd"))); | |||
|                     command.Parameters.Add(new MySqlParameter("@p1", a_end.ToString("yyyy-MM-dd"))); | |||
|                     command.Parameters.Add(new MySqlParameter("@p2", string.Join(", ", accessiblebranches.ToArray()))); | |||
| 
 | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     using (var reader = command.ExecuteReader()) | |||
|                     { | |||
|                         while (reader.Read()) | |||
|                         { | |||
|                             yield return new SaleItem | |||
|                             { | |||
|                                 Transno = reader.GetString(0), | |||
|                                 Total = (decimal)reader.GetDouble(1), | |||
|                                 Date = reader.GetDateTime(2), | |||
|                                 Cashier = reader.GetString(3), | |||
|                                 BranchId = reader.GetString(4), | |||
|                                 Customer = reader.GetString(5), | |||
|                                 Status = reader.GetString(6), | |||
|                             }; | |||
|                         } | |||
|                     } | |||
|                 } | |||
|             } | |||
|         } | |||
| 
 | |||
|         public Task FetchTransaction(DateTime a_start, DateTime a_end) | |||
|         { | |||
|             throw new NotImplementedException(); | |||
|         } | |||
| 
 | |||
|         public Task FetchReceipt(string a_receiptId) | |||
|         { | |||
|             throw new NotImplementedException(); | |||
|         } | |||
| 
 | |||
|         public IEnumerable<SaleItem> GetReceipt(string a_receiptId) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
| 
 | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 IEnumerable<string> accessiblebranches = m_tokenService.BranchIds(token); | |||
| 
 | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     command.CommandText = "CALL GetTransactionsById(@p0,@p1)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", a_receiptId)); | |||
|                     command.Parameters.Add(new MySqlParameter("@p1", string.Join(", ", accessiblebranches.ToArray()))); | |||
| 
 | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     using (var reader = command.ExecuteReader()) | |||
|                     { | |||
|                         while (reader.Read()) | |||
|                         { | |||
|                             yield return new SaleItem | |||
|                             { | |||
|                                 Transno = reader.GetString(0), | |||
|                                 Total = (decimal)reader.GetDouble(1), | |||
|                                 Date = reader.GetDateTime(2), | |||
|                                 Cashier = reader.GetString(3), | |||
|                                 BranchId = reader.GetString(4), | |||
|                                 Customer = reader.GetString(5), | |||
|                                 Status = reader.GetString(6), | |||
|                             }; | |||
|                         } | |||
|                     } | |||
|                     // Close the connection explicitly
 | |||
|                     m_context.Database.CloseConnection(); | |||
|                 } | |||
|             } | |||
|         } | |||
| 
 | |||
|         public Task<IEnumerable<Tblcart>> GetReceiptDetail(string a_receiptId) | |||
|         { | |||
|             List<Tblcart> details = new List<Tblcart>(); | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
| 
 | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 IEnumerable<string> accessiblebranches = m_tokenService.BranchIds(token); | |||
| 
 | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     command.CommandText = "CALL GetReceiptDetails(@p0,@p1)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", a_receiptId)); | |||
|                     command.Parameters.Add(new MySqlParameter("@p1", string.Join(", ", accessiblebranches.ToArray()))); | |||
| 
 | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     using (var reader = command.ExecuteReader()) | |||
|                     { | |||
|                         while (reader.Read()) | |||
|                         { | |||
|                             details.Add(new Tblcart | |||
|                             { | |||
|                                 Transno = a_receiptId, | |||
|                                 Id = reader.GetString(0), | |||
|                                 Quantity = reader.GetInt32(1), | |||
|                                 Date = reader.GetDateTime(2), | |||
|                                 Price = reader.GetDecimal(3), | |||
|                                 Cashier = reader.GetString(4), | |||
|                                 Status = reader.GetString(5), | |||
|                                 Total = (decimal)reader.GetDouble(6), | |||
|                                 Unit = reader.GetString(7), | |||
|                                 Costprice = reader.GetDecimal(8), | |||
|                                 BranchId = reader.GetString(9), | |||
|                                 CountId = reader.GetString(10), | |||
|                                 Tendered = reader.GetDecimal(11), | |||
|                                 Balance = reader.GetDecimal(12), | |||
|                                 ValueAddTax = reader.GetDecimal(13) | |||
|                             }); | |||
|                         } | |||
|                     } | |||
|                 } | |||
|             } | |||
|             return Task.FromResult(details.AsEnumerable()); | |||
|         } | |||
| 
 | |||
|         public async Task SyncCart(List<Tblcart> a_item) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string jsonString = JsonSerializer.Serialize(a_item); | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     command.CommandText = "CALL SaleSyncUpstream(@p0)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", jsonString)); | |||
|                     command.ExecuteNonQuery(); | |||
|                 } | |||
|             } | |||
|         } | |||
| 
 | |||
|         public DateTime GetLastSyncDate(string a_tablename) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string activeBranch = m_tokenService.GetBaseBranch(token)!; | |||
|                 DateTime? lastSync = m_context.Tblsyncinfos.FirstOrDefault(p => p.TableName == a_tablename && p.BranchId == activeBranch!)?.LastSyncDate; | |||
| 
 | |||
|                 if (lastSync != null) | |||
|                 { | |||
|                     return (DateTime)lastSync!; | |||
|                 } | |||
|             } | |||
|             return new DateTime(2000, 01, 01); | |||
|         } | |||
| 
 | |||
|         public void SetLastSyncDate(string a_tableName, DateTime a_timestamp) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string activeBranch = m_tokenService.GetBaseBranch(token)!; | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     command.CommandText = "CALL SetTableLastSync(@p0,@p1,@p2)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", a_tableName)); | |||
|                     command.Parameters.Add(new MySqlParameter("@p1", activeBranch)); | |||
|                     command.Parameters.Add(new MySqlParameter("@p2", a_timestamp)); | |||
|                     command.ExecuteNonQuery(); | |||
|                 } | |||
|             } | |||
| 
 | |||
|         } | |||
| 
 | |||
|         public async Task SyncCancelledTransaction(List<Tblcancelledtransaction> a_item) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string jsonString = JsonSerializer.Serialize(a_item); | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     command.CommandText = "CALL CancelledSaleSync(@p0)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", jsonString)); | |||
|                     command.ExecuteNonQuery(); | |||
|                 } | |||
|             } | |||
|         } | |||
| 
 | |||
|         public async Task SyncCreditPurchase(List<Creditpurchase> a_item) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string jsonString = JsonSerializer.Serialize(a_item); | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     command.CommandText = "CALL CreditPurchaseSync(@p0)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", jsonString)); | |||
|                     command.ExecuteNonQuery(); | |||
|                 } | |||
|             } | |||
|         } | |||
| 
 | |||
|         public async Task SyncCustomerAccount(List<Customeraccount> a_customerAccounts) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string jsonString = JsonSerializer.Serialize(a_customerAccounts); | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     command.CommandText = "CALL CustomerAccountSync(@p0)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", jsonString)); | |||
|                     command.ExecuteNonQuery(); | |||
|                 } | |||
|             } | |||
|         } | |||
| 
 | |||
|         public async Task SyncCustomerPurchase(List<Tblcustomerpurchase> a_customerPurchase) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string jsonString = JsonSerializer.Serialize(a_customerPurchase); | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     command.CommandText = "CALL CustomerPurchasesSync(@p0)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", jsonString)); | |||
|                     command.ExecuteNonQuery(); | |||
|                 } | |||
|             } | |||
|         } | |||
| 
 | |||
|         public async Task SyncDiscountLogs(List<Tbldiscountlog> a_discountLog) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string jsonString = JsonSerializer.Serialize(a_discountLog); | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     command.CommandText = "CALL DiscountLogsSync(@p0)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", jsonString)); | |||
|                     command.ExecuteNonQuery(); | |||
|                 } | |||
|             } | |||
|         } | |||
| 
 | |||
|         public async Task SyncDeliveryDetails(List<Tbldeliverydetail> a_details) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string jsonString = JsonSerializer.Serialize(a_details); | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     command.CommandText = "CALL DeliveryDetailsSync(@p0)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", jsonString)); | |||
|                     command.ExecuteNonQuery(); | |||
|                 } | |||
|             } | |||
|         } | |||
| 
 | |||
|         public async Task SyncDeliveryHead(List<Tbldeliveryhead> a_heads) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string jsonString = JsonSerializer.Serialize(a_heads); | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     command.CommandText = "CALL DeliveryheadSync(@p0)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", jsonString)); | |||
|                     command.ExecuteNonQuery(); | |||
|                 } | |||
|             } | |||
|         } | |||
| 
 | |||
|         public async Task SyncDeliveryRecipients(List<Tbldeliveryrecipient> a_recipients) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string jsonString = JsonSerializer.Serialize(a_recipients); | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     command.CommandText = "CALL DeliveryRecipientSync(@p0)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", jsonString)); | |||
|                     command.ExecuteNonQuery(); | |||
|                 } | |||
|             } | |||
|         } | |||
| 
 | |||
|         public async Task SyncInvoice(List<Tblinvoice> a_invoice) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string jsonString = JsonSerializer.Serialize(a_invoice); | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     command.CommandText = "CALL InvoiceSync(@p0)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", jsonString)); | |||
|                     command.ExecuteNonQuery(); | |||
|                 } | |||
|             } | |||
|         } | |||
|     } | |||
| } | |||
| @ -0,0 +1,59 @@ | |||
| using Cloud_Manager; | |||
| using Cloud_Manager.Models.Enums; | |||
| using Cloud_Manager.Models.Interfaces; | |||
| using Cloud_Manager.Models.POSModels; | |||
| using Microsoft.EntityFrameworkCore; | |||
| using Microsoft.Net.Http.Headers; | |||
| using MySqlConnector; | |||
| using System.Text.Json; | |||
| 
 | |||
| namespace Cloud_Manager.Services | |||
| { | |||
|     public class UserService : IUser | |||
|     { | |||
|         private readonly BiskAcdbContext m_context; | |||
|         private readonly ITokenService m_tokenService; | |||
|         private readonly HttpContext m_httpContext; | |||
| 
 | |||
|         public UserService(BiskAcdbContext a_context, ITokenService a_tokenService, IHttpContextAccessor a_httpContextAccessor) | |||
|         { | |||
|             m_context = a_context; | |||
|             m_tokenService = a_tokenService; | |||
|             m_httpContext = a_httpContextAccessor?.HttpContext; | |||
|         } | |||
|         public IEnumerable<Tbluser> FetchUsers() | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
| 
 | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 IEnumerable<string> accessiblebranches = m_tokenService.BranchIds(token); | |||
| 
 | |||
|                 return m_context.Tblusers.Where(b => accessiblebranches.Contains(b.BranchId)); | |||
|             } | |||
|             return new List<Tbluser>(); | |||
|         } | |||
| 
 | |||
|         public Task<IEnumerable<Tbluser>> GetUsers() | |||
|         { | |||
|             throw new NotImplementedException(); | |||
|         } | |||
| 
 | |||
|         public async Task SyncUserAsync(List<Tbluser> a_users) | |||
|         { | |||
|             string token = m_httpContext.Request.Headers[HeaderNames.Authorization]!; | |||
|             if (AuthEnums.Valid == m_tokenService.ValidateToken(token)) | |||
|             { | |||
|                 string jsonString = JsonSerializer.Serialize(a_users); | |||
|                 using (var command = m_context.Database.GetDbConnection().CreateCommand()) | |||
|                 { | |||
|                     m_context.Database.OpenConnection(); | |||
| 
 | |||
|                     command.CommandText = "CALL UsersSync(@p0)"; | |||
|                     command.Parameters.Add(new MySqlParameter("@p0", jsonString)); | |||
|                     command.ExecuteNonQuery(); | |||
|                 } | |||
|             } | |||
|         } | |||
|     } | |||
| } | |||
| @ -0,0 +1,13 @@ | |||
| namespace Cloud_Manager | |||
| { | |||
|     public class WeatherForecast | |||
|     { | |||
|         public DateOnly Date { get; set; } | |||
| 
 | |||
|         public int TemperatureC { get; set; } | |||
| 
 | |||
|         public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); | |||
| 
 | |||
|         public string? Summary { get; set; } | |||
|     } | |||
| } | |||
| @ -0,0 +1,8 @@ | |||
| { | |||
|   "Logging": { | |||
|     "LogLevel": { | |||
|       "Default": "Information", | |||
|       "Microsoft.AspNetCore": "Warning" | |||
|     } | |||
|   } | |||
| } | |||
| @ -0,0 +1,18 @@ | |||
| { | |||
|   "Logging": { | |||
|     "LogLevel": { | |||
|       "Default": "Information", | |||
|       "Microsoft.AspNetCore": "Warning" | |||
|     } | |||
|   }, | |||
|   "ConnectionStrings": { | |||
|     "Connection": "server=54.37.19.162;database=dev_biskilogclients;user=biskilog;password=mefbuk-6niFsu-fytrew;AllowZeroDateTime=True;", | |||
|     "PrivateConnection": "server={0};database={1};user=biskilog;password=mefbuk-6niFsu-fytrew;default command timeout=0;AllowZeroDateTime=True;" | |||
|   }, | |||
|   "AllowedHosts": "*", | |||
|   "JWT": { | |||
|     "Key": "@@BISKILOGACCOUNTING2023DEV??//##$", | |||
|     "Issuer": "AUTH SERVER", | |||
|     "Audience": "BISKILOG" | |||
|   } | |||
| } | |||
					Loading…
					
					
				
		Reference in new issue