barhen-pfw
1 year ago
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