diff --git a/Biskilog_Cloud.sln b/Biskilog_Cloud.sln index 63b5b11..860b22f 100644 --- a/Biskilog_Cloud.sln +++ b/Biskilog_Cloud.sln @@ -3,9 +3,9 @@ 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}") = "ClientManager", "ClientManager\ClientManager.csproj", "{AD0879FE-FBA8-4CD1-B95A-93E0277FD40F}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ServerManager", "ServerManager\ServerManager.csproj", "{48786C44-14A8-4510-9DC2-167C431DDE95}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServerManager", "ServerManager\ServerManager.csproj", "{7A6AAC33-5ED1-4CAD-AA67-E107245354B3}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Biskilog_Cloud.Shared", "Shared\Biskilog_Cloud.Shared.csproj", "{1D368EE7-D1D3-4D50-83ED-57B0EB9CC6F4}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -13,14 +13,14 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {AD0879FE-FBA8-4CD1-B95A-93E0277FD40F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AD0879FE-FBA8-4CD1-B95A-93E0277FD40F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AD0879FE-FBA8-4CD1-B95A-93E0277FD40F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AD0879FE-FBA8-4CD1-B95A-93E0277FD40F}.Release|Any CPU.Build.0 = Release|Any CPU - {7A6AAC33-5ED1-4CAD-AA67-E107245354B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7A6AAC33-5ED1-4CAD-AA67-E107245354B3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7A6AAC33-5ED1-4CAD-AA67-E107245354B3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7A6AAC33-5ED1-4CAD-AA67-E107245354B3}.Release|Any CPU.Build.0 = Release|Any CPU + {48786C44-14A8-4510-9DC2-167C431DDE95}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {48786C44-14A8-4510-9DC2-167C431DDE95}.Debug|Any CPU.Build.0 = Debug|Any CPU + {48786C44-14A8-4510-9DC2-167C431DDE95}.Release|Any CPU.ActiveCfg = Release|Any CPU + {48786C44-14A8-4510-9DC2-167C431DDE95}.Release|Any CPU.Build.0 = Release|Any CPU + {1D368EE7-D1D3-4D50-83ED-57B0EB9CC6F4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1D368EE7-D1D3-4D50-83ED-57B0EB9CC6F4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1D368EE7-D1D3-4D50-83ED-57B0EB9CC6F4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1D368EE7-D1D3-4D50-83ED-57B0EB9CC6F4}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/ClientManager/ClientManager.csproj b/ClientManager/ClientManager.csproj deleted file mode 100644 index 2299ab1..0000000 --- a/ClientManager/ClientManager.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - - net7.0 - enable - enable - dotnet-ClientManager-173f3572-8fd4-498f-addd-d620cda23800 - - - - - - diff --git a/ClientManager/Program.cs b/ClientManager/Program.cs deleted file mode 100644 index e0525fe..0000000 --- a/ClientManager/Program.cs +++ /dev/null @@ -1,10 +0,0 @@ -using ClientManager; - -IHost host = Host.CreateDefaultBuilder(args) - .ConfigureServices(services => - { - services.AddHostedService(); - }) - .Build(); - -host.Run(); diff --git a/ClientManager/Properties/launchSettings.json b/ClientManager/Properties/launchSettings.json deleted file mode 100644 index 45d6b52..0000000 --- a/ClientManager/Properties/launchSettings.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "profiles": { - "ClientManager": { - "commandName": "Project", - "dotnetRunMessages": true, - "environmentVariables": { - "DOTNET_ENVIRONMENT": "Development" - } - } - } -} diff --git a/ClientManager/Worker.cs b/ClientManager/Worker.cs deleted file mode 100644 index c26a964..0000000 --- a/ClientManager/Worker.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace ClientManager -{ - public class Worker : BackgroundService - { - private readonly ILogger _logger; - - public Worker(ILogger logger) - { - _logger = logger; - } - - protected override async Task ExecuteAsync(CancellationToken stoppingToken) - { - while (!stoppingToken.IsCancellationRequested) - { - _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); - await Task.Delay(1000, stoppingToken); - } - } - } -} \ No newline at end of file diff --git a/ClientManager/appsettings.Development.json b/ClientManager/appsettings.Development.json deleted file mode 100644 index b2dcdb6..0000000 --- a/ClientManager/appsettings.Development.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.Hosting.Lifetime": "Information" - } - } -} diff --git a/ClientManager/appsettings.json b/ClientManager/appsettings.json deleted file mode 100644 index b2dcdb6..0000000 --- a/ClientManager/appsettings.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.Hosting.Lifetime": "Information" - } - } -} diff --git a/ServerManager/BiskPosContext.cs b/ServerManager/BiskPosContext.cs new file mode 100644 index 0000000..8dcde20 --- /dev/null +++ b/ServerManager/BiskPosContext.cs @@ -0,0 +1,1175 @@ +using System; +using System.Collections.Generic; +using Biskilog_Cloud.Shared.Models; +using Microsoft.EntityFrameworkCore; + +namespace ServerManager; + +public partial class BiskPosContext : DbContext +{ + public BiskPosContext() + { + } + + public BiskPosContext(DbContextOptions options) + : base(options) + { + } + + public virtual DbSet CreditPurchases { get; set; } + + public virtual DbSet CustomerAccounts { get; set; } + + public virtual DbSet ProductAltUnits { get; set; } + + public virtual DbSet RestockLevels { get; set; } + + public virtual DbSet SystemUserRoles { get; set; } + + public virtual DbSet TbStocks { get; set; } + + public virtual DbSet TblBranches { get; set; } + + public virtual DbSet TblBrands { get; set; } + + public virtual DbSet TblCancelledTransactions { get; set; } + + public virtual DbSet TblCarts { get; set; } + + public virtual DbSet TblCategories { get; set; } + + public virtual DbSet TblCompanyDetails { get; set; } + + public virtual DbSet TblCustomers { get; set; } + + public virtual DbSet TblCustomerPurchases { get; set; } + + public virtual DbSet TblDeliveryDetails { get; set; } + + public virtual DbSet TblDeliveryHeads { get; set; } + + public virtual DbSet TblDeliveryRecipients { get; set; } + + public virtual DbSet TblDiscountLogs { get; set; } + + public virtual DbSet TblDrivers { get; set; } + + public virtual DbSet TblHeldTransactions { get; set; } + + public virtual DbSet TblInventories { get; set; } + + public virtual DbSet TblInventoryEntries { get; set; } + + public virtual DbSet TblInvoices { get; set; } + + public virtual DbSet TblPriceChanges { get; set; } + + public virtual DbSet TblProducts { get; set; } + + public virtual DbSet TblTrucks { get; set; } + + public virtual DbSet TblTruckAssignments { get; set; } + + public virtual DbSet TblTruckDriverMappings { get; set; } + + public virtual DbSet TblTruckInventories { get; set; } + + public virtual DbSet TblUsers { get; set; } + + public virtual DbSet TblUserActivities { get; set; } + + public virtual DbSet UnitOfMeasures { get; set; } + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.ReceiptId); + + entity.ToTable(tb => tb.HasTrigger("trg_UpdateLastModifiedOnCreditPurchases")); + + entity.Property(e => e.ReceiptId) + .HasMaxLength(120) + .HasColumnName("receiptID"); + entity.Property(e => e.BranchId) + .HasMaxLength(10) + .IsUnicode(false) + .HasColumnName("branchID"); + entity.Property(e => e.CustomerId) + .HasMaxLength(120) + .HasColumnName("customerID"); + entity.Property(e => e.Date).HasColumnName("date"); + entity.Property(e => e.LastModified) + .HasDefaultValueSql("(getdate())") + .HasColumnName("lastmodified"); + entity.Property(e => e.Paid) + .HasColumnType("decimal(19, 2)") + .HasColumnName("paid"); + entity.Property(e => e.Status) + .HasMaxLength(10) + .IsUnicode(false) + .HasColumnName("status"); + entity.Property(e => e.TotalBill) + .HasColumnType("decimal(19, 2)") + .HasColumnName("totalBill"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.CountId); + + entity.ToTable(tb => tb.HasTrigger("trg_UpdateLastModifiedOnCustomerAccounts")); + + entity.Property(e => e.CountId) + .HasMaxLength(120) + .HasColumnName("countID"); + entity.Property(e => e.Balance) + .HasColumnType("decimal(19, 2)") + .HasColumnName("balance"); + entity.Property(e => e.BranchId) + .HasMaxLength(10) + .IsUnicode(false) + .HasColumnName("branchID"); + entity.Property(e => e.Comments) + .IsUnicode(false) + .HasColumnName("comments"); + entity.Property(e => e.Credit) + .HasColumnType("decimal(19, 2)") + .HasColumnName("credit"); + entity.Property(e => e.CustomerId) + .HasMaxLength(120) + .HasColumnName("customerID"); + entity.Property(e => e.Date).HasColumnName("date"); + entity.Property(e => e.Debit) + .HasColumnType("decimal(19, 2)") + .HasColumnName("debit"); + entity.Property(e => e.LastModified) + .HasDefaultValueSql("(getdate())") + .HasColumnName("lastmodified"); + entity.Property(e => e.TransactionId) + .HasMaxLength(120) + .HasColumnName("transactionID"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.DistinctiveCode).HasName("PK_ProductUnitPricing"); + + entity.ToTable("ProductAltUnit", tb => tb.HasTrigger("trg_UpdateLastModifiedOnProductAltUnit")); + + entity.Property(e => e.DistinctiveCode) + .HasMaxLength(120) + .IsUnicode(false) + .HasColumnName("distinctiveCode"); + entity.Property(e => e.BranchId) + .HasMaxLength(120) + .IsUnicode(false) + .HasColumnName("branchID"); + entity.Property(e => e.LastModified) + .HasDefaultValueSql("(getdate())") + .HasColumnName("lastmodified"); + entity.Property(e => e.Pcode) + .HasMaxLength(120) + .IsUnicode(false) + .HasColumnName("pcode"); + entity.Property(e => e.PriceUnit) + .HasColumnType("decimal(19, 2)") + .HasColumnName("price/unit"); + entity.Property(e => e.QuantityUnit).HasColumnName("quantity/unit"); + entity.Property(e => e.UnitBarcode) + .HasMaxLength(20) + .IsUnicode(false) + .HasColumnName("unitBarcode"); + entity.Property(e => e.UnitCode) + .HasMaxLength(120) + .IsUnicode(false) + .HasColumnName("unitCode"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.ProductId).HasName("PK_ProductRestockLevels"); + + entity.ToTable(tb => tb.HasTrigger("trg_UpdateLastModifiedOnRestockLevels")); + + entity.Property(e => e.ProductId) + .HasMaxLength(150) + .IsUnicode(false) + .HasColumnName("productID"); + entity.Property(e => e.BranchId) + .HasMaxLength(20) + .IsUnicode(false) + .HasColumnName("branchID"); + entity.Property(e => e.LastModified) + .HasDefaultValueSql("(getdate())") + .HasColumnName("lastmodified"); + entity.Property(e => e.Unit) + .HasMaxLength(150) + .IsUnicode(false) + .HasColumnName("unit"); + entity.Property(e => e.WarnLevel).HasColumnName("warnLevel"); + }); + + modelBuilder.Entity(entity => + { + entity.ToTable("systemUserRoles", tb => tb.HasTrigger("trg_UpdateLastModifiedOnsystemUserRoles")); + + entity.Property(e => e.Id) + .ValueGeneratedNever() + .HasColumnName("id"); + entity.Property(e => e.Assist).HasColumnName("assist"); + entity.Property(e => e.Cashier).HasColumnName("cashier"); + entity.Property(e => e.LastModified) + .HasDefaultValueSql("(getdate())") + .HasColumnName("lastmodified"); + entity.Property(e => e.Manager).HasColumnName("manager"); + entity.Property(e => e.Owner).HasColumnName("owner"); + entity.Property(e => e.Roles) + .IsUnicode(false) + .HasColumnName("roles"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.CountId); + + entity.ToTable("tbStock", tb => tb.HasTrigger("trg_UpdateLastModifiedOntbStock")); + + entity.Property(e => e.CountId) + .HasMaxLength(50) + .HasColumnName("countID"); + entity.Property(e => e.BranchId) + .HasMaxLength(12) + .HasColumnName("branchID"); + entity.Property(e => e.LastModified) + .HasDefaultValueSql("(getdate())") + .HasColumnName("lastmodified"); + entity.Property(e => e.Pcode) + .HasMaxLength(50) + .HasColumnName("pcode"); + entity.Property(e => e.Qty).HasColumnName("qty"); + entity.Property(e => e.Refno) + .HasMaxLength(50) + .HasColumnName("refno"); + entity.Property(e => e.Sdate) + .HasColumnType("date") + .HasColumnName("sdate"); + entity.Property(e => e.Stockinby) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("stockinby"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.BranchId); + + entity.ToTable("tblBranches", tb => tb.HasTrigger("trg_UpdateLastModifiedOntblBranches")); + + entity.Property(e => e.BranchId) + .HasMaxLength(12) + .HasColumnName("branchID"); + entity.Property(e => e.Address) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("address"); + entity.Property(e => e.BranchName) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("branchName"); + entity.Property(e => e.BranchTelephone) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("branch_telephone"); + entity.Property(e => e.City) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("city"); + entity.Property(e => e.LastModified) + .HasDefaultValueSql("(getdate())") + .HasColumnName("lastmodified"); + entity.Property(e => e.StateOrProvince) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("state_or_province"); + }); + + modelBuilder.Entity(entity => + { + entity.ToTable("tblBrand", tb => tb.HasTrigger("trg_UpdateLastModifiedOntblBrand")); + + entity.Property(e => e.Id) + .HasMaxLength(50) + .HasColumnName("id"); + entity.Property(e => e.BranchId) + .HasMaxLength(12) + .HasColumnName("branchID"); + entity.Property(e => e.Brand) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("brand"); + entity.Property(e => e.LastModified) + .HasDefaultValueSql("(getdate())") + .HasColumnName("lastmodified"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.CountId); + + entity.ToTable("tblCancelledTransactions", tb => tb.HasTrigger("trg_UpdateLastModifiedOntblCancelledTransactions")); + + entity.Property(e => e.CountId) + .HasMaxLength(50) + .HasColumnName("countID"); + entity.Property(e => e.BranchId) + .HasMaxLength(50) + .HasColumnName("branchID"); + entity.Property(e => e.CancelledBy) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("cancelledBy"); + entity.Property(e => e.DateCancelled) + .HasColumnType("datetime") + .HasColumnName("dateCancelled"); + entity.Property(e => e.LastModified) + .HasDefaultValueSql("(getdate())") + .HasColumnName("lastmodified"); + entity.Property(e => e.Transno) + .IsUnicode(false) + .HasColumnName("transno"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.CountId); + + entity.ToTable("tblCart", tb => tb.HasTrigger("trg_UpdateLastModifiedOntblCart")); + + entity.Property(e => e.CountId) + .HasMaxLength(200) + .IsUnicode(false) + .HasColumnName("countID"); + entity.Property(e => e.Balance) + .HasDefaultValueSql("((0))") + .HasColumnType("decimal(19, 2)") + .HasColumnName("balance"); + entity.Property(e => e.BranchId) + .HasMaxLength(12) + .HasColumnName("branchID"); + entity.Property(e => e.Cashier) + .HasMaxLength(50) + .HasColumnName("cashier"); + entity.Property(e => e.Costprice) + .HasColumnType("decimal(19, 2)") + .HasColumnName("costprice"); + entity.Property(e => e.Date).HasColumnName("date"); + entity.Property(e => e.Id) + .HasMaxLength(50) + .HasColumnName("id"); + entity.Property(e => e.LastModified) + .HasDefaultValueSql("(getdate())") + .HasColumnName("lastmodified"); + entity.Property(e => e.Price) + .HasColumnType("decimal(19, 2)") + .HasColumnName("price"); + entity.Property(e => e.Quantity).HasColumnName("quantity"); + entity.Property(e => e.Status) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("status"); + entity.Property(e => e.Tendered) + .HasDefaultValueSql("((0))") + .HasColumnType("decimal(19, 2)") + .HasColumnName("tendered"); + entity.Property(e => e.Total) + .HasColumnType("decimal(19, 2)") + .HasColumnName("total"); + entity.Property(e => e.Transno).HasColumnName("transno"); + entity.Property(e => e.Unit) + .HasMaxLength(120) + .IsUnicode(false) + .HasColumnName("unit"); + entity.Property(e => e.ValueAddTax) + .HasColumnType("decimal(19, 2)") + .HasColumnName("valueAddTax"); + }); + + modelBuilder.Entity(entity => + { + entity.ToTable("tblCategory", tb => tb.HasTrigger("trg_UpdateLastModifiedOntblCategory")); + + entity.Property(e => e.Id) + .HasMaxLength(50) + .HasColumnName("id"); + entity.Property(e => e.BranchId) + .HasMaxLength(12) + .HasColumnName("branchID"); + entity.Property(e => e.Category) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("category"); + entity.Property(e => e.LastModified) + .HasDefaultValueSql("(getdate())") + .HasColumnName("lastmodified"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Tin); + + entity.ToTable("tblCompanyDetails", tb => tb.HasTrigger("trg_UpdateLastModifiedOntblCompanyDetails")); + + entity.Property(e => e.Tin) + .HasMaxLength(60) + .HasColumnName("tin"); + entity.Property(e => e.Address) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("address"); + entity.Property(e => e.CompanyName) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("company_name"); + entity.Property(e => e.Email) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("email"); + entity.Property(e => e.LastModified) + .HasDefaultValueSql("(getdate())") + .HasColumnName("lastmodified"); + entity.Property(e => e.MainTelephone) + .HasMaxLength(50) + .HasColumnName("main_telephone"); + entity.Property(e => e.Vatno) + .HasMaxLength(60) + .HasColumnName("vatno"); + entity.Property(e => e.Website) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("website"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.CustomerId); + + entity.ToTable("tblCustomers", tb => tb.HasTrigger("trg_UpdateLastModifiedOntblCustomers")); + + entity.Property(e => e.CustomerId) + .HasMaxLength(30) + .HasColumnName("customerID"); + entity.Property(e => e.Address) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("address"); + entity.Property(e => e.BranchId) + .HasMaxLength(50) + .HasColumnName("branchID"); + entity.Property(e => e.DateAdded) + .HasColumnType("date") + .HasColumnName("dateAdded"); + entity.Property(e => e.DateExit) + .HasColumnType("date") + .HasColumnName("dateExit"); + entity.Property(e => e.Email) + .HasMaxLength(50) + .HasColumnName("email"); + entity.Property(e => e.FinancialStatus) + .HasMaxLength(20) + .IsUnicode(false) + .HasColumnName("financialStatus"); + entity.Property(e => e.Firstname) + .HasMaxLength(50) + .IsUnicode(false); + entity.Property(e => e.LastModified) + .HasDefaultValueSql("(getdate())") + .HasColumnName("lastmodified"); + entity.Property(e => e.NameKey1) + .HasMaxLength(120) + .IsUnicode(false) + .HasColumnName("name_key1"); + entity.Property(e => e.NameKey2) + .HasMaxLength(120) + .IsUnicode(false) + .HasColumnName("name_key2"); + entity.Property(e => e.Status) + .HasMaxLength(20) + .IsUnicode(false) + .HasColumnName("status"); + entity.Property(e => e.Surname) + .HasMaxLength(50) + .IsUnicode(false); + entity.Property(e => e.Telephone) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("telephone"); + entity.Property(e => e.Tin) + .HasMaxLength(50) + .HasColumnName("tin"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.CountId); + + entity.ToTable("tblCustomerPurchases", tb => tb.HasTrigger("trg_UpdateLastModifiedOntblCustomerPurchases")); + + entity.Property(e => e.CountId) + .HasMaxLength(50) + .HasColumnName("countID"); + entity.Property(e => e.BranchId) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("branchID"); + entity.Property(e => e.CustomerId) + .HasMaxLength(50) + .HasColumnName("customerID"); + entity.Property(e => e.LastModified) + .HasDefaultValueSql("(getdate())") + .HasColumnName("lastmodified"); + entity.Property(e => e.TransactionId) + .HasMaxLength(50) + .HasColumnName("transactionID"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.CountId); + + entity.ToTable("tblDeliveryDetails", tb => tb.HasTrigger("trg_UpdateLastModifiedOntblDeliveryDetails")); + + entity.Property(e => e.CountId) + .HasMaxLength(100) + .HasColumnName("countID"); + entity.Property(e => e.Cost) + .HasColumnType("decimal(19, 2)") + .HasColumnName("cost"); + entity.Property(e => e.DeliveryId) + .HasMaxLength(60) + .HasColumnName("deliveryID"); + entity.Property(e => e.LastModified) + .HasDefaultValueSql("(getdate())") + .HasColumnName("lastmodified"); + entity.Property(e => e.Pcode) + .HasMaxLength(60) + .HasColumnName("pcode"); + entity.Property(e => e.Quantity).HasColumnName("quantity"); + entity.Property(e => e.Unit) + .HasMaxLength(120) + .IsUnicode(false) + .HasColumnName("unit"); + entity.Property(e => e.BranchId) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("branchID"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.DeliveryId); + + entity.ToTable("tblDeliveryHead", tb => tb.HasTrigger("trg_UpdateLastModifiedOntblDeliveryHead")); + + entity.Property(e => e.DeliveryId) + .HasMaxLength(60) + .HasColumnName("deliveryID"); + entity.Property(e => e.BranchId) + .HasMaxLength(20) + .HasColumnName("branchID"); + entity.Property(e => e.CustomerId) + .HasMaxLength(60) + .HasColumnName("customerID"); + entity.Property(e => e.DateCompleted).HasColumnName("dateCompleted"); + entity.Property(e => e.DateInitiated).HasColumnName("dateInitiated"); + entity.Property(e => e.Destination) + .HasMaxLength(60) + .HasColumnName("destination"); + entity.Property(e => e.GeneratedBy) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("generatedBy"); + entity.Property(e => e.LastModified) + .HasDefaultValueSql("(getdate())") + .HasColumnName("lastmodified"); + entity.Property(e => e.Status) + .HasMaxLength(20) + .IsUnicode(false) + .HasColumnName("status"); + entity.Property(e => e.TotalCost) + .HasColumnType("decimal(19, 2)") + .HasColumnName("totalCost"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.DeliveryId); + + entity.ToTable("tblDeliveryRecipients", tb => tb.HasTrigger("trg_UpdateLastModifiedOntblDeliveryRecipients")); + + entity.Property(e => e.DeliveryId) + .HasMaxLength(60) + .HasColumnName("deliveryID"); + entity.Property(e => e.Address) + .HasMaxLength(60) + .HasColumnName("address"); + entity.Property(e => e.CustomerId) + .HasMaxLength(60) + .HasColumnName("customerID"); + entity.Property(e => e.Email) + .HasMaxLength(60) + .HasColumnName("email"); + entity.Property(e => e.FromDate) + .HasColumnType("date") + .HasColumnName("fromDate"); + entity.Property(e => e.Fullname) + .IsUnicode(false) + .HasColumnName("fullname"); + entity.Property(e => e.LastModified) + .HasDefaultValueSql("(getdate())") + .HasColumnName("lastmodified"); + entity.Property(e => e.Telephone) + .HasMaxLength(15) + .IsUnicode(false) + .HasColumnName("telephone"); + entity.Property(e => e.ToDate) + .HasColumnType("date") + .HasColumnName("toDate"); + entity.Property(e => e.BranchId) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("branchID"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.CountId); + + entity.ToTable("tblDiscountLogs", tb => tb.HasTrigger("trg_UpdateLastModifiedOntblDiscountLogs")); + + entity.Property(e => e.CountId) + .HasMaxLength(120) + .IsUnicode(false) + .HasColumnName("countID"); + entity.Property(e => e.BranchId) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("branchID"); + entity.Property(e => e.Cashier) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("cashier"); + entity.Property(e => e.Date).HasColumnName("date"); + entity.Property(e => e.Discount) + .HasColumnType("decimal(19, 2)") + .HasColumnName("discount"); + entity.Property(e => e.LastModified) + .HasDefaultValueSql("(getdate())") + .HasColumnName("lastmodified"); + entity.Property(e => e.ReceiptId) + .HasMaxLength(50) + .HasColumnName("receiptID"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.DriverId); + + entity.ToTable("tblDrivers", tb => tb.HasTrigger("trg_UpdateLastModifiedOntblDrivers")); + + entity.Property(e => e.DriverId) + .HasMaxLength(50) + .HasColumnName("driverID"); + entity.Property(e => e.Address1) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("address1"); + entity.Property(e => e.Address2) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("address2"); + entity.Property(e => e.BranchId) + .HasMaxLength(50) + .HasColumnName("branchID"); + entity.Property(e => e.City) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("city"); + entity.Property(e => e.DateOfBirth) + .HasColumnType("date") + .HasColumnName("dateOfBirth"); + entity.Property(e => e.Email) + .HasMaxLength(120) + .IsUnicode(false) + .HasColumnName("email"); + entity.Property(e => e.Firstname) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("firstname"); + entity.Property(e => e.LastModified) + .HasDefaultValueSql("(getdate())") + .HasColumnName("lastmodified"); + entity.Property(e => e.Middlename) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("middlename"); + entity.Property(e => e.State) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("state"); + entity.Property(e => e.Status) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("status"); + entity.Property(e => e.Surname) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("surname"); + entity.Property(e => e.Telephone) + .HasMaxLength(20) + .IsUnicode(false) + .HasColumnName("telephone"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.CountId); + + entity.ToTable("tblHeldTransaction", tb => tb.HasTrigger("trg_UpdateLastModifiedOntblHeldTransaction")); + + entity.Property(e => e.CountId) + .HasMaxLength(200) + .IsUnicode(false) + .HasColumnName("countID"); + entity.Property(e => e.BranchId) + .HasMaxLength(12) + .HasColumnName("branchID"); + entity.Property(e => e.Cashier) + .HasMaxLength(50) + .HasColumnName("cashier"); + entity.Property(e => e.Costprice) + .HasColumnType("decimal(19, 2)") + .HasColumnName("costprice"); + entity.Property(e => e.CustomerId) + .HasMaxLength(200) + .IsUnicode(false) + .HasColumnName("customerID"); + entity.Property(e => e.Date).HasColumnName("date"); + entity.Property(e => e.Discount) + .HasColumnType("decimal(19, 2)") + .HasColumnName("discount"); + entity.Property(e => e.Distinctive) + .HasMaxLength(200) + .IsUnicode(false) + .HasColumnName("distinctive"); + entity.Property(e => e.InvoiceId) + .HasMaxLength(200) + .IsUnicode(false) + .HasColumnName("invoiceID"); + entity.Property(e => e.LastModified) + .HasDefaultValueSql("(getdate())") + .HasColumnName("lastmodified"); + entity.Property(e => e.Price) + .HasColumnType("decimal(19, 2)") + .HasColumnName("price"); + entity.Property(e => e.ProductId) + .HasMaxLength(50) + .HasColumnName("productId"); + entity.Property(e => e.Quantity).HasColumnName("quantity"); + entity.Property(e => e.Status) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("status"); + entity.Property(e => e.Total) + .HasColumnType("decimal(19, 2)") + .HasColumnName("total"); + entity.Property(e => e.TransactionId) + .HasMaxLength(200) + .IsUnicode(false) + .HasColumnName("transactionID"); + entity.Property(e => e.Unit) + .HasMaxLength(120) + .IsUnicode(false) + .HasColumnName("unit"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.CountId); + + entity.ToTable("tblInventory", tb => tb.HasTrigger("trg_UpdateLastModifiedOntblInventory")); + + entity.Property(e => e.CountId) + .HasMaxLength(50) + .HasColumnName("countID"); + entity.Property(e => e.BranchId) + .HasMaxLength(50) + .HasColumnName("branchID"); + entity.Property(e => e.LastModified) + .HasDefaultValueSql("(getdate())") + .HasColumnName("lastmodified"); + entity.Property(e => e.Pcode) + .HasMaxLength(50) + .HasColumnName("pcode"); + entity.Property(e => e.Quantity).HasColumnName("quantity"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.CountId); + + entity.ToTable("tblInventoryEntries", tb => tb.HasTrigger("trg_UpdateLastModifiedOntblInventoryEntries")); + + entity.Property(e => e.CountId) + .HasMaxLength(120) + .HasColumnName("countID"); + entity.Property(e => e.BranchId) + .HasMaxLength(60) + .HasColumnName("branchID"); + entity.Property(e => e.Date).HasColumnName("date"); + entity.Property(e => e.LastModified) + .HasDefaultValueSql("(getdate())") + .HasColumnName("lastmodified"); + entity.Property(e => e.Pcode) + .HasMaxLength(50) + .HasColumnName("pcode"); + entity.Property(e => e.Quantity).HasColumnName("quantity"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.CountId).HasName("PK_tblinvoice"); + + entity.ToTable("tblInvoice", tb => tb.HasTrigger("trg_UpdateLastModifiedOntblInvoice")); + + entity.Property(e => e.CountId) + .HasMaxLength(50) + .HasColumnName("countID"); + entity.Property(e => e.BranchId) + .HasMaxLength(50) + .HasColumnName("branchID"); + entity.Property(e => e.DateGenerated) + .HasColumnType("date") + .HasColumnName("dateGenerated"); + entity.Property(e => e.GeneratedBy) + .HasMaxLength(50) + .HasColumnName("generatedBy"); + entity.Property(e => e.InvoiceId) + .HasMaxLength(60) + .HasColumnName("invoiceID"); + entity.Property(e => e.LastModified) + .HasDefaultValueSql("(getdate())") + .HasColumnName("lastmodified"); + entity.Property(e => e.Pcode) + .HasMaxLength(50) + .HasColumnName("pcode"); + entity.Property(e => e.Quantity).HasColumnName("quantity"); + entity.Property(e => e.Status) + .HasMaxLength(16) + .IsUnicode(false) + .HasColumnName("status"); + entity.Property(e => e.Totalprice) + .HasColumnType("decimal(19, 2)") + .HasColumnName("totalprice"); + entity.Property(e => e.Unit) + .HasMaxLength(120) + .IsUnicode(false) + .HasColumnName("unit"); + entity.Property(e => e.Unitprice) + .HasColumnType("decimal(19, 2)") + .HasColumnName("unitprice"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.CountId); + + entity.ToTable("tblPriceChanges", tb => tb.HasTrigger("trg_UpdateLastModifiedOntblPriceChanges")); + + entity.Property(e => e.CountId) + .HasMaxLength(70) + .HasColumnName("countID"); + entity.Property(e => e.BranchId) + .HasMaxLength(50) + .HasColumnName("branchID"); + entity.Property(e => e.ChangeDate).HasColumnName("change_date"); + entity.Property(e => e.CurrentPrice) + .HasColumnType("decimal(19, 2)") + .HasColumnName("current_price"); + entity.Property(e => e.LastModified) + .HasDefaultValueSql("(getdate())") + .HasColumnName("lastmodified"); + entity.Property(e => e.Pcode) + .HasMaxLength(120) + .HasColumnName("pcode"); + entity.Property(e => e.PreviousPrice) + .HasColumnType("decimal(19, 2)") + .HasColumnName("previous_price"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.CountId); + + entity.ToTable("tblProduct", tb => tb.HasTrigger("trg_UpdateLastModifiedOntblProduct")); + + entity.Property(e => e.CountId) + .HasMaxLength(50) + .HasColumnName("countID"); + entity.Property(e => e.Barcode) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("barcode"); + entity.Property(e => e.BaseUnit) + .HasMaxLength(120) + .IsUnicode(false) + .HasColumnName("baseUnit"); + entity.Property(e => e.Bid) + .HasMaxLength(50) + .HasColumnName("bid"); + entity.Property(e => e.BranchId) + .HasMaxLength(12) + .HasColumnName("branchID"); + entity.Property(e => e.Cid) + .HasMaxLength(50) + .HasColumnName("cid"); + entity.Property(e => e.Costprice) + .HasColumnType("decimal(19, 2)") + .HasColumnName("costprice"); + entity.Property(e => e.LastModified) + .HasDefaultValueSql("(getdate())") + .HasColumnName("lastmodified"); + entity.Property(e => e.Pcode) + .HasMaxLength(50) + .HasColumnName("pcode"); + entity.Property(e => e.Pdesc).HasColumnName("pdesc"); + entity.Property(e => e.Price) + .HasColumnType("decimal(19, 2)") + .HasColumnName("price"); + entity.Property(e => e.ProductName) + .IsUnicode(false) + .HasColumnName("product_name"); + entity.Property(e => e.Status) + .HasMaxLength(20) + .IsUnicode(false) + .HasColumnName("status"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.TruckId); + + entity.ToTable("tblTrucks", tb => tb.HasTrigger("trg_UpdateLastModifiedOntblTrucks")); + + entity.Property(e => e.TruckId) + .HasMaxLength(60) + .HasColumnName("truckID"); + entity.Property(e => e.BranchId) + .HasMaxLength(50) + .HasColumnName("branchID"); + entity.Property(e => e.Brand) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("brand"); + entity.Property(e => e.Driver) + .HasMaxLength(50) + .HasColumnName("driver"); + entity.Property(e => e.LastModified) + .HasDefaultValueSql("(getdate())") + .HasColumnName("lastmodified"); + entity.Property(e => e.LicensePlate) + .HasMaxLength(60) + .HasColumnName("licensePlate"); + entity.Property(e => e.Weight) + .HasColumnType("decimal(19, 2)") + .HasColumnName("weight"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.CountId); + + entity.ToTable("tblTruckAssignments", tb => tb.HasTrigger("trg_UpdateLastModifiedOntblTruckAssignments")); + + entity.Property(e => e.CountId) + .HasMaxLength(100) + .IsUnicode(false) + .HasColumnName("countID"); + entity.Property(e => e.Cost) + .HasColumnType("decimal(19, 2)") + .HasColumnName("cost"); + entity.Property(e => e.DateAssigned).HasColumnName("dateAssigned"); + entity.Property(e => e.LastModified) + .HasDefaultValueSql("(getdate())") + .HasColumnName("lastmodified"); + entity.Property(e => e.OrderId) + .HasMaxLength(50) + .HasColumnName("orderID"); + entity.Property(e => e.Status) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("status"); + entity.Property(e => e.TruckId) + .HasMaxLength(50) + .HasColumnName("truckID"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.CountId); + + entity.ToTable("tblTruck_DriverMapping", tb => tb.HasTrigger("trg_UpdateLastModifiedOntblTruck_DriverMapping")); + + entity.Property(e => e.CountId) + .HasMaxLength(60) + .HasColumnName("countID"); + entity.Property(e => e.DateEntry).HasColumnName("dateEntry"); + entity.Property(e => e.DriverId) + .HasMaxLength(50) + .HasColumnName("driverID"); + entity.Property(e => e.LastModified) + .HasDefaultValueSql("(getdate())") + .HasColumnName("lastmodified"); + entity.Property(e => e.Operation) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("operation"); + entity.Property(e => e.TruckId) + .HasMaxLength(50) + .HasColumnName("truckID"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.CountId); + + entity.ToTable("tblTruckInventory", tb => tb.HasTrigger("trg_UpdateLastModifiedOntblTruckInventory")); + + entity.Property(e => e.CountId) + .HasMaxLength(50) + .HasColumnName("countID"); + entity.Property(e => e.LastModified) + .HasDefaultValueSql("(getdate())") + .HasColumnName("lastmodified"); + entity.Property(e => e.Pcode) + .HasMaxLength(50) + .HasColumnName("pcode"); + entity.Property(e => e.Quantity).HasColumnName("quantity"); + entity.Property(e => e.TruckId) + .HasMaxLength(50) + .HasColumnName("truckID"); + entity.Property(e => e.Unit) + .HasMaxLength(120) + .IsUnicode(false) + .HasColumnName("unit"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Username); + + entity.ToTable("tblUsers", tb => tb.HasTrigger("trg_UpdateLastModifiedOntblUsers")); + + entity.Property(e => e.Username) + .HasMaxLength(50) + .HasColumnName("username"); + entity.Property(e => e.AccessLevel) + .HasMaxLength(10) + .IsUnicode(false) + .HasColumnName("access_level"); + entity.Property(e => e.BranchId) + .HasMaxLength(50) + .HasColumnName("branchID"); + entity.Property(e => e.City) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("city"); + entity.Property(e => e.Email) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("email"); + entity.Property(e => e.Firstname) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("firstname"); + entity.Property(e => e.LastLogin).HasColumnName("last_login"); + entity.Property(e => e.LastModified) + .HasDefaultValueSql("(getdate())") + .HasColumnName("lastmodified"); + entity.Property(e => e.Password) + .IsUnicode(false) + .HasColumnName("password"); + entity.Property(e => e.StateOrProvince) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("state_or_province"); + entity.Property(e => e.StreetAddress1) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("street_address1"); + entity.Property(e => e.StreetAddress2) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("street_address2"); + entity.Property(e => e.Surname) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("surname"); + entity.Property(e => e.Telephone) + .HasMaxLength(15) + .IsUnicode(false) + .HasColumnName("telephone"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Username); + + entity.ToTable("tblUser_activity", tb => tb.HasTrigger("trg_UpdateLastModifiedOntblUser_activity")); + + entity.Property(e => e.Username) + .HasMaxLength(50) + .HasColumnName("username"); + entity.Property(e => e.LastActive).HasColumnName("last_active"); + entity.Property(e => e.LastModified) + .HasDefaultValueSql("(getdate())") + .HasColumnName("lastmodified"); + entity.Property(e => e.Workstation) + .HasMaxLength(100) + .HasColumnName("workstation"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.UnitCode); + + entity.ToTable("UnitOfMeasure", tb => tb.HasTrigger("trg_UpdateLastModifiedOnUnitOfMeasure")); + + entity.Property(e => e.UnitCode) + .HasMaxLength(120) + .HasColumnName("unitCode"); + entity.Property(e => e.BranchId) + .HasMaxLength(120) + .IsUnicode(false) + .HasColumnName("branchID"); + entity.Property(e => e.LastModified) + .HasDefaultValueSql("(getdate())") + .HasColumnName("lastmodified"); + entity.Property(e => e.Status) + .HasMaxLength(50) + .IsUnicode(false) + .HasColumnName("status"); + entity.Property(e => e.Unitname) + .HasMaxLength(120) + .IsUnicode(false) + .HasColumnName("unitname"); + entity.Property(e => e.Unitshort) + .HasMaxLength(120) + .IsUnicode(false) + .HasColumnName("unitshort"); + }); + + OnModelCreatingPartial(modelBuilder); + } + + partial void OnModelCreatingPartial(ModelBuilder modelBuilder); +} diff --git a/ServerManager/Controllers/WeatherForecastController.cs b/ServerManager/Controllers/WeatherForecastController.cs new file mode 100644 index 0000000..f720c70 --- /dev/null +++ b/ServerManager/Controllers/WeatherForecastController.cs @@ -0,0 +1,32 @@ +using Microsoft.AspNetCore.Mvc; + +namespace ServerManager.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 _logger; + + public WeatherForecastController(ILogger logger) + { + _logger = logger; + } + + [HttpGet(Name = "GetWeatherForecast")] + public IEnumerable 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(); + } +} diff --git a/ServerManager/Program.cs b/ServerManager/Program.cs index 15b1d11..05fe14b 100644 --- a/ServerManager/Program.cs +++ b/ServerManager/Program.cs @@ -1,10 +1,44 @@ +using Biskilog_Cloud.Shared.Interfaces; +using Microsoft.EntityFrameworkCore; using ServerManager; +using ServerManager.ServiceRepo; +using ServerManager.SyncMethods; -IHost host = Host.CreateDefaultBuilder(args) - .ConfigureServices(services => - { - services.AddHostedService(); - }) - .Build(); +var builder = WebApplication.CreateBuilder(args); -host.Run(); +// Add services to the container. +builder.Services.AddSignalR(); +builder.Services.AddControllers(); +// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle +builder.Services.AddEndpointsApiExplorer(); +builder.Services.AddSwaggerGen(); +builder.Services.AddEntityFrameworkMySql().AddDbContext(options => +{ + options.UseSqlServer(builder.Configuration.GetConnectionString("Connection")); +}); + +builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddHostedService(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); +var app = builder.Build(); + +// Configure the HTTP request pipeline. +if (app.Environment.IsDevelopment()) +{ + app.UseSwagger(); + app.UseSwaggerUI(); +} + +app.UseHttpsRedirection(); + +app.UseAuthorization(); + +app.MapControllers(); + +app.Run(); diff --git a/ServerManager/Properties/launchSettings.json b/ServerManager/Properties/launchSettings.json index 5699968..e3833aa 100644 --- a/ServerManager/Properties/launchSettings.json +++ b/ServerManager/Properties/launchSettings.json @@ -1,10 +1,40 @@ { + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:21664", + "sslPort": 44321 + } + }, "profiles": { - "ServerManager": { + "http": { "commandName": "Project", "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "swagger", + "applicationUrl": "http://localhost:5110", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "swagger", + "applicationUrl": "https://localhost:7022;http://localhost:5110", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "swagger", "environmentVariables": { - "DOTNET_ENVIRONMENT": "Development" + "ASPNETCORE_ENVIRONMENT": "Development" } } } diff --git a/ServerManager/ServerManager.csproj b/ServerManager/ServerManager.csproj index 3095783..cacdde6 100644 --- a/ServerManager/ServerManager.csproj +++ b/ServerManager/ServerManager.csproj @@ -1,13 +1,34 @@ - + - - net7.0 - enable - enable - dotnet-ServerManager-52a85e73-fd4f-461a-8b7b-99494934c716 - + + net7.0 + enable + enable + - - - + + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + diff --git a/ServerManager/ServiceRepo/CompanyService.cs b/ServerManager/ServiceRepo/CompanyService.cs new file mode 100644 index 0000000..11dfa26 --- /dev/null +++ b/ServerManager/ServiceRepo/CompanyService.cs @@ -0,0 +1,287 @@ +using Biskilog_Cloud.Shared.CustomModels; +using Biskilog_Cloud.Shared.Interfaces; +using Biskilog_Cloud.Shared.Models; +using Dapper; +using Microsoft.Diagnostics.Tracing.Parsers.Kernel; +using Microsoft.EntityFrameworkCore; +using System; +using System.Data; +using System.Data.SqlClient; + +namespace ServerManager.ServiceRepo +{ + public class CompanyService : ICompanyInfo, ICustomer, IUser + { + private readonly BiskPosContext m_context; + public CompanyService(BiskPosContext a_context) + { + m_context = a_context; + } + + #region Unimplemented + public IEnumerable FetchUsers() + { + throw new NotImplementedException(); + } + + public Task> GetUsers() + { + throw new NotImplementedException(); + } + + public IEnumerable FetchCustomers() + { + throw new NotImplementedException(); + } + + public Task> GetCustomers() + { + throw new NotImplementedException(); + } + + public Task> GetBranches() + { + throw new NotImplementedException(); + } + + public string GetBranchName(string a_branchId) + { + throw new NotImplementedException(); + } + + public Task GetCompanyInfoAsync() + { + throw new NotImplementedException(); + } + + public string GetCompanyName() + { + throw new NotImplementedException(); + } + + public IEnumerable FetchBranches() + { + throw new NotImplementedException(); + } + #endregion + public async Task> FetchBranch(DateTime a_dateTime, string a_branch) + { + string connection = m_context.Database.GetConnectionString(); + using (IDbConnection dbConnection = new SqlConnection(connection)) + { + dbConnection.Open(); + + // Using Dapper to call a stored procedure with parameters + var parameters = new + { + a_tableName = "tblbranch", + a_branchId = a_branch, + lastModified = a_dateTime + }; + List result = (await dbConnection.QueryAsync( + "FetchTableRows", + parameters, + commandType: CommandType.StoredProcedure)).AsList(); + + return result; + } + } + + public async Task> FetchCompanyInfoAsync(DateTime a_dateTime, string a_branch) + { + using (IDbConnection dbConnection = new SqlConnection(m_context.Database.GetConnectionString())) + { + dbConnection.Open(); + + // Using Dapper to call a stored procedure with parameters + var parameters = new + { + a_tableName = "tblcompanydetails", + a_branchId = a_branch, + lastModified = a_dateTime + }; + List result = (await dbConnection.QueryAsync( + "FetchTableRows", + parameters, + commandType: CommandType.StoredProcedure)).AsList(); + + return result; + } + } + + public async Task> FetchDriverMappingAsync(DateTime a_syncDate, string a_branch) + { + using (IDbConnection dbConnection = new SqlConnection(m_context.Database.GetConnectionString())) + { + dbConnection.Open(); + + // Using Dapper to call a stored procedure with parameters + var parameters = new + { + a_tableName = "tbltruck_drivermapping", + a_branchId = a_branch, + lastModified = a_syncDate + }; + List result = (await dbConnection.QueryAsync( + "FetchTableRows", + parameters, + commandType: CommandType.StoredProcedure)).AsList(); + + return result; + } + } + + public async Task> FetchDriversAsync(DateTime a_syncDate, string a_branch) + { + using (IDbConnection dbConnection = new SqlConnection(m_context.Database.GetConnectionString())) + { + dbConnection.Open(); + + // Using Dapper to call a stored procedure with parameters + var parameters = new + { + a_tableName = "tbldrivers", + a_branchId = a_branch, + lastModified = a_syncDate + }; + List result = (await dbConnection.QueryAsync( + "FetchTableRows", + parameters, + commandType: CommandType.StoredProcedure)).AsList(); + + return result; + } + } + + public async Task> FetchSystemRoles(DateTime a_dateTime, string a_branch) + { + using (IDbConnection dbConnection = new SqlConnection(m_context.Database.GetConnectionString())) + { + dbConnection.Open(); + + // Using Dapper to call a stored procedure with parameters + var parameters = new + { + a_tableName = "systemuserroles", + a_branchId = a_branch, + lastModified = a_dateTime + }; + List result = (await dbConnection.QueryAsync( + "FetchTableRows", + parameters, + commandType: CommandType.StoredProcedure)).AsList(); + + return result; + } + } + + public async Task> FetchTruckAsync(DateTime a_syncDate, string a_branch) + { + using (IDbConnection dbConnection = new SqlConnection(m_context.Database.GetConnectionString())) + { + dbConnection.Open(); + + // Using Dapper to call a stored procedure with parameters + var parameters = new + { + a_tableName = "tbltruck", + a_branchId = a_branch, + lastModified = a_syncDate + }; + List result = (await dbConnection.QueryAsync( + "FetchTableRows", + parameters, + commandType: CommandType.StoredProcedure)).AsList(); + + return result; + } + } + + public async Task> FetchTruckInventoryAsync(DateTime a_syncDate, string a_branch) + { + using (IDbConnection dbConnection = new SqlConnection(m_context.Database.GetConnectionString())) + { + dbConnection.Open(); + + // Using Dapper to call a stored procedure with parameters + var parameters = new + { + a_tableName = "tbltruckinventory", + a_branchId = a_branch, + lastModified = a_syncDate + }; + List result = (await dbConnection.QueryAsync( + "FetchTableRows", + parameters, + commandType: CommandType.StoredProcedure)).AsList(); + + return result; + } + } + + public async Task> FetchCustomers(DateTime a_lastSync, string a_branch) + { + using (IDbConnection dbConnection = new SqlConnection(m_context.Database.GetConnectionString())) + { + dbConnection.Open(); + + // Using Dapper to call a stored procedure with parameters + var parameters = new + { + a_tableName = "tblcustomers", + a_branchId = a_branch, + lastModified = a_lastSync + }; + List result = (await dbConnection.QueryAsync( + "FetchTableRows", + parameters, + commandType: CommandType.StoredProcedure)).AsList(); + + return result; + } + } + + public async Task> FetchTruckAssignmentAsync(DateTime a_syncDate, string a_branch) + { + using (IDbConnection dbConnection = new SqlConnection(m_context.Database.GetConnectionString())) + { + dbConnection.Open(); + + // Using Dapper to call a stored procedure with parameters + var parameters = new + { + a_tableName = "tbltruckassignments", + a_branchId = a_branch, + lastModified = a_syncDate + }; + List result = (await dbConnection.QueryAsync( + "FetchTableRows", + parameters, + commandType: CommandType.StoredProcedure)).AsList(); + + return result; + } + } + public async Task> FetchUsers(DateTime a_syncDate, string a_branch) + { + using (IDbConnection dbConnection = new SqlConnection(m_context.Database.GetConnectionString())) + { + dbConnection.Open(); + + // Using Dapper to call a stored procedure with parameters + var parameters = new + { + a_tableName = "tblusers", + a_branchId = a_branch, + lastModified = a_syncDate + }; + List result = (await dbConnection.QueryAsync( + "FetchTableRows", + parameters, + commandType: CommandType.StoredProcedure)).AsList(); + + return result; + } + } + } +} diff --git a/ServerManager/ServiceRepo/ProductsService.cs b/ServerManager/ServiceRepo/ProductsService.cs new file mode 100644 index 0000000..2b3d0ab --- /dev/null +++ b/ServerManager/ServiceRepo/ProductsService.cs @@ -0,0 +1,390 @@ +using Biskilog_Cloud.Shared.CustomModels; +using Biskilog_Cloud.Shared.Interfaces; +using Biskilog_Cloud.Shared.Models; +using Dapper; +using Microsoft.EntityFrameworkCore; +using System.Data; +using System.Data.SqlClient; + +namespace ServerManager.ServiceRepo +{ + public class ProductsService : IProduct + { + private readonly BiskPosContext m_context; + private string m_connection; + public ProductsService(BiskPosContext a_context, IConfiguration configuration) + { + m_context = a_context; + m_connection = configuration.GetConnectionString("connection")!.ToString(); + } + + public event EventHandler ProductsChanged; + public event EventHandler UnitsChanged; + public event EventHandler BrandsChanged; + public event EventHandler CategoriesChanged; + + public async Task> FetchBrandsAsync(DateTime a_lastSync, string a_branch) + { + try + { + using (IDbConnection dbConnection = new SqlConnection(m_connection)) + { + dbConnection.Open(); + + // Using Dapper to call a stored procedure with parameters + var parameters = new + { + a_tableName = "TblBrand", + a_branchId = a_branch, + lastModified = a_lastSync + }; + List result = (await dbConnection.QueryAsync( + "FetchTableRows", + parameters, + commandType: CommandType.StoredProcedure)).AsList(); + + return result; + } + } + catch (Exception ex) + { + Console.WriteLine(ex.ToString()); + return new List(); + } + } + + public async Task> FetchCategoriesAsync(DateTime a_lastSync, string a_branch) + { + try + { + using (IDbConnection dbConnection = new SqlConnection(m_connection)) + { + dbConnection.Open(); + + // Using Dapper to call a stored procedure with parameters + var parameters = new + { + a_tableName = "tblcategory", + a_branchId = a_branch, + lastModified = a_lastSync + }; + List result = (await dbConnection.QueryAsync( + "FetchTableRows", + parameters, + commandType: CommandType.StoredProcedure)).AsList(); + + return result; + } + } + catch (Exception ex) + { + Console.WriteLine(ex.ToString()); + return new List(); + } + } + + public async Task> FetchInventory(DateTime a_lastSync, string a_branch) + { + try + { + using (IDbConnection dbConnection = new SqlConnection(m_connection)) + { + dbConnection.Open(); + + // Using Dapper to call a stored procedure with parameters + var parameters = new + { + a_tableName = "TblInventory", + a_branchId = a_branch, + lastModified = a_lastSync + }; + List result = (await dbConnection.QueryAsync( + "FetchTableRows", + parameters, + commandType: CommandType.StoredProcedure)).AsList(); + + return result; + } + } + catch (Exception ex) + { + Console.WriteLine(ex.ToString()); + return new List(); + } + } + + public async Task> FetchInventoryEntries(DateTime a_lastSync, string a_branch) + { + try + { + using (IDbConnection dbConnection = new SqlConnection(m_connection)) + { + dbConnection.Open(); + + // Using Dapper to call a stored procedure with parameters + var parameters = new + { + a_tableName = "TblInventoryentries", + a_branchId = a_branch, + lastModified = a_lastSync + }; + List result = (await dbConnection.QueryAsync( + "FetchTableRows", + parameters, + commandType: CommandType.StoredProcedure)).AsList(); + + return result; + } + } + catch (Exception ex) + { + Console.WriteLine(ex.ToString()); + return new List(); + } + } + + public async Task> FetchPriceChanges(DateTime a_lastSync, string a_branch) + { + try + { + using (IDbConnection dbConnection = new SqlConnection(m_connection)) + { + dbConnection.Open(); + + // Using Dapper to call a stored procedure with parameters + var parameters = new + { + a_tableName = "tblpricechanges", + a_branchId = a_branch, + lastModified = a_lastSync + }; + List result = (await dbConnection.QueryAsync( + "FetchTableRows", + parameters, + commandType: CommandType.StoredProcedure)).AsList(); + + return result; + } + } + catch (Exception ex) + { + Console.WriteLine(ex.ToString()); + return new List(); + } + } + + public async Task> FetchProductAltUnit(DateTime a_lastSync, string a_branch) + { + try + { + using (IDbConnection dbConnection = new SqlConnection(m_connection)) + { + dbConnection.Open(); + + // Using Dapper to call a stored procedure with parameters + var parameters = new + { + a_tableName = "productaltunit", + a_branchId = a_branch, + lastModified = a_lastSync + }; + List result = (await dbConnection.QueryAsync( + "FetchTableRows", + parameters, + commandType: CommandType.StoredProcedure)).AsList(); + + return result; + } + } + catch (Exception ex) + { + Console.WriteLine(ex.ToString()); + return new List(); + } + } + + public async Task> FetchProducts(DateTime a_lastSync, string a_branch) + { + try + { + using (IDbConnection dbConnection = new SqlConnection(m_connection)) + { + dbConnection.Open(); + + // Using Dapper to call a stored procedure with parameters + var parameters = new + { + branchID = a_branch, + lastModified = a_lastSync + }; + List result = (await dbConnection.QueryAsync( + "FetchProductTableRows", + parameters, + commandType: CommandType.StoredProcedure)).AsList(); + + return result; + } + } + catch (Exception ex) + { + Console.WriteLine(ex.ToString()); + return new List(); + } + } + + public async Task> FetchRestockAsync(DateTime a_lastSync, string a_branch) + { + try + { + using (IDbConnection dbConnection = new SqlConnection(m_connection)) + { + dbConnection.Open(); + + // Using Dapper to call a stored procedure with parameters + var parameters = new + { + a_tableName = "Restocklevels", + a_branchId = a_branch, + lastModified = a_lastSync + }; + List result = (await dbConnection.QueryAsync( + "FetchTableRows", + parameters, + commandType: CommandType.StoredProcedure)).AsList(); + + return result; + } + } + catch (Exception ex) + { + Console.WriteLine(ex.ToString()); + return new List(); + } + } + + public async Task> FetchStockAsync(DateTime a_lastSync, string a_branch) + { + try + { + using (IDbConnection dbConnection = new SqlConnection(m_connection)) + { + dbConnection.Open(); + + // Using Dapper to call a stored procedure with parameters + var parameters = new + { + a_tableName = "Tbstock", + a_branchId = a_branch, + lastModified = a_lastSync + }; + List result = (await dbConnection.QueryAsync( + "FetchTableRows", + parameters, + commandType: CommandType.StoredProcedure)).AsList(); + + return result; + } + } + catch (Exception ex) + { + Console.WriteLine(ex.ToString()); + return new List(); + } + } + + public async Task> FetchUnitOfMeasureAsync(DateTime a_lastSync, string a_branch) + { + try + { + using (IDbConnection dbConnection = new SqlConnection(m_connection)) + { + dbConnection.Open(); + + // Using Dapper to call a stored procedure with parameters + var parameters = new + { + a_tableName = "unitofmeasure", + a_branchId = a_branch, + lastModified = a_lastSync + }; + List result = (await dbConnection.QueryAsync( + "FetchTableRows", + parameters, + commandType: CommandType.StoredProcedure)).AsList(); + + return result; + } + } + catch (Exception ex) + { + Console.WriteLine(ex.ToString()); + return new List(); + } + } + public Task FetchBrands() + { + throw new NotImplementedException(); + } + public Task FetchLowStockProducts() + { + throw new NotImplementedException(); + } + public Task FetchCategories() + { + throw new NotImplementedException(); + } + public Task FetchProducts() + { + throw new NotImplementedException(); + } + public Task FetchUnits() + { + throw new NotImplementedException(); + } + + public IEnumerable GetBrands(string a_brandKey = "") + { + throw new NotImplementedException(); + } + + public IEnumerable GetCategories(string a_categoryKey = "") + { + throw new NotImplementedException(); + } + + public IEnumerable GetLowstockItems() + { + throw new NotImplementedException(); + } + + public ProductItem GetProductById(string a_id) + { + throw new NotImplementedException(); + } + + public ProductItem GetProductByName(string name) + { + throw new NotImplementedException(); + } + + public IEnumerable GetProducts(string a_productKey = "") + { + throw new NotImplementedException(); + } + + public string GetUnitName(string a_unitCode) + { + throw new NotImplementedException(); + } + + public IEnumerable GetUnitofmeasures() + { + throw new NotImplementedException(); + } + + public void RefreshList() + { + throw new NotImplementedException(); + } + } +} diff --git a/ServerManager/ServiceRepo/SalesService.cs b/ServerManager/ServiceRepo/SalesService.cs new file mode 100644 index 0000000..f93a88d --- /dev/null +++ b/ServerManager/ServiceRepo/SalesService.cs @@ -0,0 +1,282 @@ +using Biskilog_Cloud.Shared.CustomModels; +using Biskilog_Cloud.Shared.Interfaces; +using Biskilog_Cloud.Shared.Models; +using Dapper; +using Microsoft.EntityFrameworkCore; +using System.Data; +using System.Data.SqlClient; + +namespace ServerManager.ServiceRepo +{ + public class SalesService : ISalesInterface + { + private readonly BiskPosContext m_context; + private readonly string m_connection; + + public SalesService(BiskPosContext a_context, IConfiguration configuration) + { + m_context = a_context; + m_connection = configuration.GetConnectionString("connection")!.ToString(); + } + + public event EventHandler TransactionsChanged; + public event EventHandler FetchComplete; + public event EventHandler FetchStart; + + public async Task> FetchCancelledTransaction(DateTime a_lastSync, string a_branch) + { + using (IDbConnection dbConnection = new SqlConnection(m_connection)) + { + dbConnection.Open(); + + // Using Dapper to call a stored procedure with parameters + var parameters = new + { + a_tableName = "tblcancelledtransaction", + a_branchId = a_branch, + lastModified = a_lastSync + }; + List result = (await dbConnection.QueryAsync( + "FetchTableRows", + parameters, + commandType: CommandType.StoredProcedure)).AsList(); + + return result; + } + + } + + public async Task> FetchCartTbl(DateTime a_lastSync,string a_branch) + { + using (IDbConnection dbConnection = new SqlConnection(m_connection)) + { + dbConnection.Open(); + + // Using Dapper to call a stored procedure with parameters + var parameters = new + { + a_tableName = "tblcart", + a_branchId = a_branch, + lastModified = a_lastSync + }; + List result = (await dbConnection.QueryAsync( + "FetchTableRows", + parameters, + commandType: CommandType.StoredProcedure)).AsList(); + + return result; + } + } + + public async Task> FetchCreditPurchase(DateTime a_lastSync, string a_branch) + { + using (IDbConnection dbConnection = new SqlConnection(m_connection)) + { + dbConnection.Open(); + + // Using Dapper to call a stored procedure with parameters + var parameters = new + { + a_tableName = "CreditPurchases", + a_branchId = a_branch, + lastModified = a_lastSync + }; + List result = (await dbConnection.QueryAsync( + "FetchTableRows", + parameters, + commandType: CommandType.StoredProcedure)).AsList(); + + return result; + } + } + + public async Task> FetchCustomerAccount(DateTime a_lastSync, string a_branch) + { + using (IDbConnection dbConnection = new SqlConnection(m_connection)) + { + dbConnection.Open(); + + // Using Dapper to call a stored procedure with parameters + var parameters = new + { + a_tableName = "customeraccounts", + a_branchId = a_branch, + lastModified = a_lastSync + }; + List result = (await dbConnection.QueryAsync( + "FetchTableRows", + parameters, + commandType: CommandType.StoredProcedure)).AsList(); + + return result; + } + } + + public async Task> FetchCustomerPurchase(DateTime a_lastSync, string a_branch) + { + using (IDbConnection dbConnection = new SqlConnection(m_connection)) + { + dbConnection.Open(); + + // Using Dapper to call a stored procedure with parameters + var parameters = new + { + a_tableName = "tblcustomerpurchases", + a_branchId = a_branch, + lastModified = a_lastSync + }; + List result = (await dbConnection.QueryAsync( + "FetchTableRows", + parameters, + commandType: CommandType.StoredProcedure)).AsList(); + + return result; + } + } + + public async Task> FetchDeliveryDetails(DateTime a_lastSync, string a_branch) + { + using (IDbConnection dbConnection = new SqlConnection(m_connection)) + { + dbConnection.Open(); + + // Using Dapper to call a stored procedure with parameters + var parameters = new + { + a_tableName = "tbldeliverydetails", + a_branchId = a_branch, + lastModified = a_lastSync + }; + List result = (await dbConnection.QueryAsync( + "FetchTableRows", + parameters, + commandType: CommandType.StoredProcedure)).AsList(); + + return result; + } + } + + public async Task> FetchDeliveryHead(DateTime a_lastSync, string a_branch) + { + using (IDbConnection dbConnection = new SqlConnection(m_connection)) + { + dbConnection.Open(); + + // Using Dapper to call a stored procedure with parameters + var parameters = new + { + a_tableName = "TblDeliveryHeads", + a_branchId = a_branch, + lastModified = a_lastSync + }; + List result = (await dbConnection.QueryAsync( + "FetchTableRows", + parameters, + commandType: CommandType.StoredProcedure)).AsList(); + + return result; + } + } + + public async Task> FetchDeliveryRecipients(DateTime a_lastSync, string a_branch) + { + using (IDbConnection dbConnection = new SqlConnection(m_connection)) + { + dbConnection.Open(); + + // Using Dapper to call a stored procedure with parameters + var parameters = new + { + a_tableName = "TblDeliveryRecipients", + a_branchId = a_branch, + lastModified = a_lastSync + }; + List result = (await dbConnection.QueryAsync( + "FetchTableRows", + parameters, + commandType: CommandType.StoredProcedure)).AsList(); + + return result; + } + } + + public async Task> FetchDiscountLogs(DateTime a_lastSync, string a_branch) + { + using (IDbConnection dbConnection = new SqlConnection(m_connection)) + { + dbConnection.Open(); + + // Using Dapper to call a stored procedure with parameters + var parameters = new + { + a_tableName = "TblDiscountLogs", + a_branchId = a_branch, + lastModified = a_lastSync + }; + List result = (await dbConnection.QueryAsync( + "FetchTableRows", + parameters, + commandType: CommandType.StoredProcedure)).AsList(); + + return result; + } + } + + public async Task> FetchInvoice(DateTime a_lastSync, string a_branch) + { + using (IDbConnection dbConnection = new SqlConnection(m_connection)) + { + dbConnection.Open(); + + // Using Dapper to call a stored procedure with parameters + var parameters = new + { + a_tableName = "TblInvoices", + a_branchId = a_branch, + lastModified = a_lastSync + }; + List result = (await dbConnection.QueryAsync( + "FetchTableRows", + parameters, + commandType: CommandType.StoredProcedure)).AsList(); + + return result; + } + } + + public Task FetchReceipt(string a_receiptId) + { + throw new NotImplementedException(); + } + + public Task FetchRecentTransaction(int a_limit) + { + throw new NotImplementedException(); + } + + public Task FetchTransaction(DateTime a_start, DateTime a_end) + { + throw new NotImplementedException(); + } + + public IEnumerable GetReceipt(string a_receiptId) + { + throw new NotImplementedException(); + } + + public Task> GetReceiptDetail(string a_receiptId) + { + throw new NotImplementedException(); + } + + public IEnumerable GetRecentTransaction() + { + throw new NotImplementedException(); + } + + public IEnumerable GetTransactions(DateTime a_start, DateTime a_end) + { + throw new NotImplementedException(); + } + } +} diff --git a/ServerManager/SyncMethods/CompanySync.cs b/ServerManager/SyncMethods/CompanySync.cs new file mode 100644 index 0000000..a81c20e --- /dev/null +++ b/ServerManager/SyncMethods/CompanySync.cs @@ -0,0 +1,346 @@ +using Biskilog_Cloud.Shared.CustomModels; +using Biskilog_Cloud.Shared.Interfaces; +using Biskilog_Cloud.Shared.Models; +using System.Net.Http; +using System.Net.Http.Headers; + +namespace ServerManager.SyncMethods +{ + public class CompanySync + { + + private readonly ICompanyInfo m_companyService; + private readonly IUser m_userService; + private readonly ICustomer m_customerService; + private HttpClient m_httpClient; + public CompanySync(ICompanyInfo companyService, IUser userService, ICustomer customerService) + { + m_companyService = companyService; + m_userService = userService; + m_customerService = customerService; + m_httpClient = new HttpClient(); + } + /// + /// Returns a collection of tasks to perform a sync in the ICompanyInterface + /// + /// + public IEnumerable GetCompanySyncTask(HttpClient httpClient) + { + m_httpClient = httpClient; + return new Task[] { + SyncCompanyTable(), + SyncBranchTable(), + SyncCustomer(), + SyncDrivers(), + SyncTruckAssignments(), + SyncTruckDriverMappingSync(), + SyncTruckInventorySync(), + SyncUsersSync(), + SyncTruckSync(), + SyncSystemUserRoles() + }; + } + private async Task SyncCompanyTable() + { + var responseMessage = await m_httpClient.GetAsync("/api/SyncCompanyInfo/lastsyncdate/tblcompanydetails"); + if (!responseMessage.IsSuccessStatusCode) + { + return; + } + + DateTime date = await responseMessage.Content.ReadFromJsonAsync(); + IEnumerable modifiedCart = await m_companyService.FetchCompanyInfoAsync(date, "BRID0"); + SyncTimestamp syncTimestamp = new SyncTimestamp + { + TableName = "tblcompanydetails", + Timestamp = DateTime.Now.AddSeconds(-10), + }; + int batchSize = 200; + int totalItems = modifiedCart.Count(); + int batches = (totalItems + batchSize - 1) / batchSize; // Calculate total batches + + for (int batchIndex = 0; batchIndex < batches; batchIndex++) + { + List batch = modifiedCart.Skip(batchIndex * batchSize).Take(batchSize).ToList(); + + var response = await m_httpClient.PostAsJsonAsync("/api/SyncCompanyInfo/publish/tblcompanydetails", batch); + if (response.IsSuccessStatusCode) + { + Console.WriteLine($"Sent batch {batchIndex + 1}, Count: {batch.Count}"); + } + } + + //Set last sync date + await m_httpClient.PostAsJsonAsync("/api/SyncCompanyInfo/setsyncdate", syncTimestamp); + } + private async Task SyncBranchTable() + { + var responseMessage = await m_httpClient.GetAsync("/api/SyncCompanyInfo/lastsyncdate/tblbranch"); + if (!responseMessage.IsSuccessStatusCode) + { + return; + } + + DateTime date = await responseMessage.Content.ReadFromJsonAsync(); + IEnumerable modifiedCart = await m_companyService.FetchBranch(date, "BRID0"); + SyncTimestamp syncTimestamp = new SyncTimestamp + { + TableName = "tblbranch", + Timestamp = DateTime.Now.AddSeconds(-10), + }; + int batchSize = 200; + int totalItems = modifiedCart.Count(); + int batches = (totalItems + batchSize - 1) / batchSize; // Calculate total batches + + for (int batchIndex = 0; batchIndex < batches; batchIndex++) + { + List batch = modifiedCart.Skip(batchIndex * batchSize).Take(batchSize).ToList(); + + var response = await m_httpClient.PostAsJsonAsync("/api/SyncCompanyInfo/publish/tblbranch", batch); + if (response.IsSuccessStatusCode) + { + Console.WriteLine($"Sent batch {batchIndex + 1}, Count: {batch.Count}"); + } + } + + //Set last sync date + await m_httpClient.PostAsJsonAsync("/api/SyncCompanyInfo/setsyncdate", syncTimestamp); + } + private async Task SyncCustomer() + { + var responseMessage = await m_httpClient.GetAsync("/api/SyncCompanyInfo/lastsyncdate/tblCustomers"); + if (!responseMessage.IsSuccessStatusCode) + { + return; + } + + DateTime date = await responseMessage.Content.ReadFromJsonAsync(); + IEnumerable modifiedCart = await m_customerService.FetchCustomers(date, "BRID0"); + SyncTimestamp syncTimestamp = new SyncTimestamp + { + TableName = "tblCustomers", + Timestamp = DateTime.Now.AddSeconds(-10), + }; + int batchSize = 200; + int totalItems = modifiedCart.Count(); + int batches = (totalItems + batchSize - 1) / batchSize; // Calculate total batches + + for (int batchIndex = 0; batchIndex < batches; batchIndex++) + { + List batch = modifiedCart.Skip(batchIndex * batchSize).Take(batchSize).ToList(); + + var response = await m_httpClient.PostAsJsonAsync("/api/SyncCompanyInfo/publish/tblCustomers", batch); + if (response.IsSuccessStatusCode) + { + Console.WriteLine($"Sent batch {batchIndex + 1}, Count: {batch.Count}"); + } + } + + //Set last sync date + await m_httpClient.PostAsJsonAsync("/api/SyncCompanyInfo/setsyncdate", syncTimestamp); + } + private async Task SyncDrivers() + { + var responseMessage = await m_httpClient.GetAsync("/api/SyncCompanyInfo/lastsyncdate/tbldrivers"); + if (!responseMessage.IsSuccessStatusCode) + { + return; + } + + DateTime date = await responseMessage.Content.ReadFromJsonAsync(); + IEnumerable modifiedCart = await m_companyService.FetchDriversAsync(date, "BRID0"); + SyncTimestamp syncTimestamp = new SyncTimestamp { TableName = "tbldrivers", Timestamp = DateTime.Now.AddSeconds(-10) }; + int batchSize = 200; + int totalItems = modifiedCart.Count(); + int batches = (totalItems + batchSize - 1) / batchSize; // Calculate total batches + + for (int batchIndex = 0; batchIndex < batches; batchIndex++) + { + List batch = modifiedCart.Skip(batchIndex * batchSize).Take(batchSize).ToList(); + + var response = await m_httpClient.PostAsJsonAsync("/api/SyncCompanyInfo/publish/tbldriver", batch); + if (response.IsSuccessStatusCode) + { + Console.WriteLine($"Sent batch {batchIndex + 1}, Count: {batch.Count}"); + } + } + + //Set last sync date + await m_httpClient.PostAsJsonAsync("/api/SyncCompanyInfo/setsyncdate", syncTimestamp); + } + private async Task SyncSystemUserRoles() + { + var responseMessage = await m_httpClient.GetAsync("/api/SyncCompanyInfo/lastsyncdate/systemuserroles"); + if (!responseMessage.IsSuccessStatusCode) + { + return; + } + + DateTime date = await responseMessage.Content.ReadFromJsonAsync(); + IEnumerable modifiedCart = await m_companyService.FetchSystemRoles(date, "BRID0"); + SyncTimestamp syncTimestamp = new SyncTimestamp { TableName = "systemuserroles", Timestamp = DateTime.Now.AddSeconds(-10) }; + int batchSize = 200; + int totalItems = modifiedCart.Count(); + int batches = (totalItems + batchSize - 1) / batchSize; // Calculate total batches + + for (int batchIndex = 0; batchIndex < batches; batchIndex++) + { + List batch = modifiedCart.Skip(batchIndex * batchSize).Take(batchSize).ToList(); + + var response = await m_httpClient.PostAsJsonAsync("/api/SyncCompanyInfo/publish/SystemRoles", batch); + if (response.IsSuccessStatusCode) + { + Console.WriteLine($"Sent batch {batchIndex + 1}, Count: {batch.Count}"); + } + } + + //Set last sync date + await m_httpClient.PostAsJsonAsync("/api/SyncCompanyInfo/setsyncdate", syncTimestamp); + } + private async Task SyncTruckAssignments() + { + var responseMessage = await m_httpClient.GetAsync("/api/SyncCompanyInfo/lastsyncdate/tbltruckassignments"); + if (!responseMessage.IsSuccessStatusCode) + { + return; + } + + DateTime date = await responseMessage.Content.ReadFromJsonAsync(); + IEnumerable modifiedCart = await m_companyService.FetchTruckAssignmentAsync(date, "BRID0"); + SyncTimestamp syncTimestamp = new SyncTimestamp { TableName = "tbltruckassignments", Timestamp = DateTime.Now.AddSeconds(-10) }; + int batchSize = 200; + int totalItems = modifiedCart.Count(); + int batches = (totalItems + batchSize - 1) / batchSize; // Calculate total batches + + for (int batchIndex = 0; batchIndex < batches; batchIndex++) + { + List batch = modifiedCart.Skip(batchIndex * batchSize).Take(batchSize).ToList(); + + var response = await m_httpClient.PostAsJsonAsync("/api/SyncCompanyInfo/publish/tblTruckAssignment", batch); + if (response.IsSuccessStatusCode) + { + Console.WriteLine($"Sent batch {batchIndex + 1}, Count: {batch.Count}"); + } + } + + //Set last sync date + await m_httpClient.PostAsJsonAsync("/api/SyncCompanyInfo/setsyncdate", syncTimestamp); + } + private async Task SyncTruckDriverMappingSync() + { + var responseMessage = await m_httpClient.GetAsync("/api/SyncCompanyInfo/lastsyncdate/tbltruck_drivermapping"); + if (!responseMessage.IsSuccessStatusCode) + { + return; + } + + DateTime date = await responseMessage.Content.ReadFromJsonAsync(); + IEnumerable modifiedCart = await m_companyService.FetchDriverMappingAsync(date, "BRID0"); + SyncTimestamp syncTimestamp = new SyncTimestamp { TableName = "tbltruck_drivermapping", Timestamp = DateTime.Now.AddSeconds(-10) }; + int batchSize = 200; + int totalItems = modifiedCart.Count(); + int batches = (totalItems + batchSize - 1) / batchSize; // Calculate total batches + + for (int batchIndex = 0; batchIndex < batches; batchIndex++) + { + List batch = modifiedCart.Skip(batchIndex * batchSize).Take(batchSize).ToList(); + + var response = await m_httpClient.PostAsJsonAsync("/api/SyncCompanyInfo/publish/tbldrivermappings", batch); + if (response.IsSuccessStatusCode) + { + Console.WriteLine($"Sent batch {batchIndex + 1}, Count: {batch.Count}"); + } + } + + //Set last sync date + await m_httpClient.PostAsJsonAsync("/api/SyncCompanyInfo/setsyncdate", syncTimestamp); + } + private async Task SyncTruckInventorySync() + { + var responseMessage = await m_httpClient.GetAsync("/api/SyncCompanyInfo/lastsyncdate/tbltruckinventory"); + if (!responseMessage.IsSuccessStatusCode) + { + return; + } + + DateTime date = await responseMessage.Content.ReadFromJsonAsync(); + IEnumerable modifiedCart = await m_companyService.FetchTruckInventoryAsync(date, "BRID0"); + SyncTimestamp syncTimestamp = new SyncTimestamp { TableName = "tbltruckinventory", Timestamp = DateTime.Now.AddSeconds(-10) }; + int batchSize = 200; + int totalItems = modifiedCart.Count(); + int batches = (totalItems + batchSize - 1) / batchSize; // Calculate total batches + + for (int batchIndex = 0; batchIndex < batches; batchIndex++) + { + List batch = modifiedCart.Skip(batchIndex * batchSize).Take(batchSize).ToList(); + + var response = await m_httpClient.PostAsJsonAsync("/api/SyncCompanyInfo/publish/tbltruckinventory", batch); + if (response.IsSuccessStatusCode) + { + Console.WriteLine($"Sent batch {batchIndex + 1}, Count: {batch.Count}"); + } + } + + //Set last sync date + await m_httpClient.PostAsJsonAsync("/api/SyncCompanyInfo/setsyncdate", syncTimestamp); + } + private async Task SyncTruckSync() + { + var responseMessage = await m_httpClient.GetAsync("/api/SyncCompanyInfo/lastsyncdate/tbltrucks"); + if (!responseMessage.IsSuccessStatusCode) + { + return; + } + + DateTime date = await responseMessage.Content.ReadFromJsonAsync(); + IEnumerable modifiedCart = await m_companyService.FetchTruckAsync(date, "BRID0"); + SyncTimestamp syncTimestamp = new SyncTimestamp { TableName = "tbltrucks", Timestamp = DateTime.Now.AddSeconds(-10) }; + int batchSize = 200; + int totalItems = modifiedCart.Count(); + int batches = (totalItems + batchSize - 1) / batchSize; // Calculate total batches + + for (int batchIndex = 0; batchIndex < batches; batchIndex++) + { + List batch = modifiedCart.Skip(batchIndex * batchSize).Take(batchSize).ToList(); + + var response = await m_httpClient.PostAsJsonAsync("/api/SyncCompanyInfo/publish/tbltrucks", batch); + if (response.IsSuccessStatusCode) + { + Console.WriteLine($"Sent batch {batchIndex + 1}, Count: {batch.Count}"); + } + } + + //Set last sync date + await m_httpClient.PostAsJsonAsync("/api/SyncCompanyInfo/setsyncdate", syncTimestamp); + } + private async Task SyncUsersSync() + { + var responseMessage = await m_httpClient.GetAsync("/api/SyncCompanyInfo/lastsyncdate/tblusers"); + if (!responseMessage.IsSuccessStatusCode) + { + return; + } + + DateTime date = await responseMessage.Content.ReadFromJsonAsync(); + IEnumerable modifiedCart = await m_userService.FetchUsers(date, "BRID0"); + SyncTimestamp syncTimestamp = new SyncTimestamp { TableName = "tblusers", Timestamp = DateTime.Now.AddSeconds(-10) }; + int batchSize = 200; + int totalItems = modifiedCart.Count(); + int batches = (totalItems + batchSize - 1) / batchSize; // Calculate total batches + + for (int batchIndex = 0; batchIndex < batches; batchIndex++) + { + List batch = modifiedCart.Skip(batchIndex * batchSize).Take(batchSize).ToList(); + + var response = await m_httpClient.PostAsJsonAsync("/api/SyncCompanyInfo/publish/tblusers", batch); + if (response.IsSuccessStatusCode) + { + Console.WriteLine($"Sent batch {batchIndex + 1}, Count: {batch.Count}"); + } + } + + //Set last sync date + await m_httpClient.PostAsJsonAsync("/api/SyncCompanyInfo/setsyncdate", syncTimestamp); + } + } +} \ No newline at end of file diff --git a/ServerManager/SyncMethods/ProductSync.cs b/ServerManager/SyncMethods/ProductSync.cs new file mode 100644 index 0000000..5275867 --- /dev/null +++ b/ServerManager/SyncMethods/ProductSync.cs @@ -0,0 +1,327 @@ +using Biskilog_Cloud.Shared.CustomModels; +using Biskilog_Cloud.Shared.Interfaces; +using Biskilog_Cloud.Shared.Models; +using System.Net.Http.Headers; + +namespace ServerManager.SyncMethods +{ + public class ProductSync + { + private readonly IProduct m_productService; + private HttpClient m_httpClient; + public ProductSync(IProduct a_produtService) + { + m_productService = a_produtService; + m_httpClient = new HttpClient(); + } + /// + /// Returns a collection of tasks to perform a sync in the SalesInterface + /// + /// + public IEnumerable GetProductSyncTask(HttpClient httpClient) + { + m_httpClient = httpClient; + return new Task[] { + SyncProductsAsync(), + SyncInventoryAsync(), + SyncInventoryEntriesAsync(), + SyncRestockAsync(), + SyncPriceChangesAsync(), + SyncProductAltUnitAsync(), + SyncStockAsync(), + SyncBrandsAsync(), + SyncCategoriesAsync(), + SyncUnitOfMeasureAsync(), + }; + } + private async Task SyncProductsAsync() + { + var responseMessage = await m_httpClient.GetAsync("/api/SyncProducts/lastsyncdate/tblproduct"); + if (!responseMessage.IsSuccessStatusCode) + { + return; + } + + DateTime date = await responseMessage.Content.ReadFromJsonAsync(); + IEnumerable modifiedCart = await m_productService.FetchProducts(date, "BRID0"); + SyncTimestamp syncTimestamp = new SyncTimestamp { TableName = "tblproduct", Timestamp = DateTime.Now.AddSeconds(-10) }; + int batchSize = 200; + int totalItems = modifiedCart.Count(); + int batches = (totalItems + batchSize - 1) / batchSize; // Calculate total batches + + for (int batchIndex = 0; batchIndex < batches; batchIndex++) + { + List batch = modifiedCart.Skip(batchIndex * batchSize).Take(batchSize).ToList(); + + var response = await m_httpClient.PostAsJsonAsync("/api/SyncProducts/publish/tblproducts", batch); + if (response.IsSuccessStatusCode) + { + Console.WriteLine($"Sent batch {batchIndex + 1}, Count: {batch.Count}"); + } + } + + //Set last sync date + await m_httpClient.PostAsJsonAsync("/api/SyncProducts/setsyncdate", syncTimestamp); + } + private async Task SyncInventoryAsync() + { + var responseMessage = await m_httpClient.GetAsync("/api/SyncProducts/lastsyncdate/tblInventory"); + if (!responseMessage.IsSuccessStatusCode) + { + return; + } + + DateTime date = await responseMessage.Content.ReadFromJsonAsync(); + IEnumerable modifiedCart = await m_productService.FetchInventory(date, "BRID0"); + SyncTimestamp syncTimestamp = new SyncTimestamp { TableName = "tblInventory", Timestamp = DateTime.Now.AddSeconds(-10) }; + int batchSize = 200; + int totalItems = modifiedCart.Count(); + int batches = (totalItems + batchSize - 1) / batchSize; // Calculate total batches + + for (int batchIndex = 0; batchIndex < batches; batchIndex++) + { + List batch = modifiedCart.Skip(batchIndex * batchSize).Take(batchSize).ToList(); + + var response = await m_httpClient.PostAsJsonAsync("/api/SyncProducts/publish/tblInventory", batch); + if (response.IsSuccessStatusCode) + { + Console.WriteLine($"Sent batch {batchIndex + 1}, Count: {batch.Count}"); + } + } + + //Set last sync date + await m_httpClient.PostAsJsonAsync("/api/SyncProducts/setsyncdate", syncTimestamp); + } + private async Task SyncInventoryEntriesAsync() + { + var responseMessage = await m_httpClient.GetAsync("/api/SyncProducts/lastsyncdate/tblInventoryentries"); + if (!responseMessage.IsSuccessStatusCode) + { + return; + } + + DateTime date = await responseMessage.Content.ReadFromJsonAsync(); + IEnumerable modifiedCart = await m_productService.FetchInventoryEntries(date, "BRID0"); + SyncTimestamp syncTimestamp = new SyncTimestamp { TableName = "tblInventoryentries", Timestamp = DateTime.Now.AddSeconds(-10) }; + int batchSize = 200; + int totalItems = modifiedCart.Count(); + int batches = (totalItems + batchSize - 1) / batchSize; // Calculate total batches + + for (int batchIndex = 0; batchIndex < batches; batchIndex++) + { + List batch = modifiedCart.Skip(batchIndex * batchSize).Take(batchSize).ToList(); + + var response = await m_httpClient.PostAsJsonAsync("/api/SyncProducts/publish/tblInventoryentry", batch); + if (response.IsSuccessStatusCode) + { + Console.WriteLine($"Sent batch {batchIndex + 1}, Count: {batch.Count}"); + } + } + + //Set last sync date + await m_httpClient.PostAsJsonAsync("/api/SyncProducts/setsyncdate", syncTimestamp); + } + private async Task SyncRestockAsync() + { + var responseMessage = await m_httpClient.GetAsync("/api/SyncProducts/lastsyncdate/restocklevels"); + if (!responseMessage.IsSuccessStatusCode) + { + return; + } + + DateTime date = await responseMessage.Content.ReadFromJsonAsync(); + IEnumerable modifiedCart = await m_productService.FetchRestockAsync(date, "BRID0"); + SyncTimestamp syncTimestamp = new SyncTimestamp { TableName = "restocklevels", Timestamp = DateTime.Now.AddSeconds(-10) }; + int batchSize = 200; + int totalItems = modifiedCart.Count(); + int batches = (totalItems + batchSize - 1) / batchSize; // Calculate total batches + + for (int batchIndex = 0; batchIndex < batches; batchIndex++) + { + List batch = modifiedCart.Skip(batchIndex * batchSize).Take(batchSize).ToList(); + + var response = await m_httpClient.PostAsJsonAsync("/api/SyncProducts/publish/tblRestock", batch); + if (response.IsSuccessStatusCode) + { + Console.WriteLine($"Sent batch {batchIndex + 1}, Count: {batch.Count}"); + } + } + + //Set last sync date + await m_httpClient.PostAsJsonAsync("/api/SyncProducts/setsyncdate", syncTimestamp); + } + private async Task SyncPriceChangesAsync() + { + var responseMessage = await m_httpClient.GetAsync("/api/SyncProducts/lastsyncdate/tblpricechanges"); + if (!responseMessage.IsSuccessStatusCode) + { + return; + } + + DateTime date = await responseMessage.Content.ReadFromJsonAsync(); + IEnumerable modifiedCart = await m_productService.FetchPriceChanges(date, "BRID0"); + SyncTimestamp syncTimestamp = new SyncTimestamp { TableName = "tblpricechanges", Timestamp = DateTime.Now.AddSeconds(-10) }; + int batchSize = 200; + int totalItems = modifiedCart.Count(); + int batches = (totalItems + batchSize - 1) / batchSize; // Calculate total batches + + for (int batchIndex = 0; batchIndex < batches; batchIndex++) + { + List batch = modifiedCart.Skip(batchIndex * batchSize).Take(batchSize).ToList(); + + var response = await m_httpClient.PostAsJsonAsync("/api/SyncProducts/publish/tlpricechanges", batch); + if (response.IsSuccessStatusCode) + { + Console.WriteLine($"Sent batch {batchIndex + 1}, Count: {batch.Count}"); + } + } + + //Set last sync date + await m_httpClient.PostAsJsonAsync("/api/SyncProducts/setsyncdate", syncTimestamp); + } + private async Task SyncProductAltUnitAsync() + { + var responseMessage = await m_httpClient.GetAsync("/api/SyncProducts/lastsyncdate/productaltunit"); + if (!responseMessage.IsSuccessStatusCode) + { + return; + } + + DateTime date = await responseMessage.Content.ReadFromJsonAsync(); + IEnumerable modifiedCart = await m_productService.FetchRestockAsync(date, "BRID0"); + SyncTimestamp syncTimestamp = new SyncTimestamp { TableName = "productaltunit", Timestamp = DateTime.Now.AddSeconds(-10) }; + int batchSize = 200; + int totalItems = modifiedCart.Count(); + int batches = (totalItems + batchSize - 1) / batchSize; // Calculate total batches + + for (int batchIndex = 0; batchIndex < batches; batchIndex++) + { + List batch = modifiedCart.Skip(batchIndex * batchSize).Take(batchSize).ToList(); + + var response = await m_httpClient.PostAsJsonAsync("/api/SyncProducts/publish/tblProductAltUnit", batch); + if (response.IsSuccessStatusCode) + { + Console.WriteLine($"Sent batch {batchIndex + 1}, Count: {batch.Count}"); + } + } + + //Set last sync date + await m_httpClient.PostAsJsonAsync("/api/SyncProducts/setsyncdate", syncTimestamp); + } + private async Task SyncStockAsync() + {var responseMessage = await m_httpClient.GetAsync("/api/SyncProducts/lastsyncdate/tbstock"); + if (!responseMessage.IsSuccessStatusCode) + { + return; + } + + DateTime date = await responseMessage.Content.ReadFromJsonAsync(); + IEnumerable modifiedCart = await m_productService.FetchStockAsync(date, "BRID0"); + SyncTimestamp syncTimestamp = new SyncTimestamp { TableName = "tbstock", Timestamp = DateTime.Now.AddSeconds(-10) }; + int batchSize = 200; + int totalItems = modifiedCart.Count(); + int batches = (totalItems + batchSize - 1) / batchSize; // Calculate total batches + + for (int batchIndex = 0; batchIndex < batches; batchIndex++) + { + List batch = modifiedCart.Skip(batchIndex * batchSize).Take(batchSize).ToList(); + + var response = await m_httpClient.PostAsJsonAsync("/api/SyncProducts/publish/tblStock", batch); + if (response.IsSuccessStatusCode) + { + Console.WriteLine($"Sent batch {batchIndex + 1}, Count: {batch.Count}"); + } + } + + //Set last sync date + await m_httpClient.PostAsJsonAsync("/api/SyncProducts/setsyncdate", syncTimestamp); + } + private async Task SyncBrandsAsync() + { + var responseMessage = await m_httpClient.GetAsync("/api/SyncProducts/lastsyncdate/tblbrands"); + if (!responseMessage.IsSuccessStatusCode) + { + return; + } + + DateTime date = await responseMessage.Content.ReadFromJsonAsync(); + IEnumerable modifiedCart = await m_productService.FetchBrandsAsync(date, "BRID0"); + SyncTimestamp syncTimestamp = new SyncTimestamp { TableName = "tblbrands", Timestamp = DateTime.Now.AddSeconds(-10) }; + int batchSize = 200; + int totalItems = modifiedCart.Count(); + int batches = (totalItems + batchSize - 1) / batchSize; // Calculate total batches + + for (int batchIndex = 0; batchIndex < batches; batchIndex++) + { + List batch = modifiedCart.Skip(batchIndex * batchSize).Take(batchSize).ToList(); + + var response = await m_httpClient.PostAsJsonAsync("/api/SyncProducts/publish/tblbrands", batch); + if (response.IsSuccessStatusCode) + { + Console.WriteLine($"Sent batch {batchIndex + 1}, Count: {batch.Count}"); + } + } + + //Set last sync date + await m_httpClient.PostAsJsonAsync("/api/SyncProducts/setsyncdate", syncTimestamp); + } + private async Task SyncCategoriesAsync() + { + var responseMessage = await m_httpClient.GetAsync("/api/SyncProducts/lastsyncdate/tblcategory"); + if (!responseMessage.IsSuccessStatusCode) + { + return; + } + + DateTime date = await responseMessage.Content.ReadFromJsonAsync(); + IEnumerable modifiedCart = await m_productService.FetchCategoriesAsync(date, "BRID0"); + SyncTimestamp syncTimestamp = new SyncTimestamp { TableName = "tblcategory", Timestamp = DateTime.Now.AddSeconds(-10) }; + int batchSize = 200; + int totalItems = modifiedCart.Count(); + int batches = (totalItems + batchSize - 1) / batchSize; // Calculate total batches + + for (int batchIndex = 0; batchIndex < batches; batchIndex++) + { + List batch = modifiedCart.Skip(batchIndex * batchSize).Take(batchSize).ToList(); + + var response = await m_httpClient.PostAsJsonAsync("/api/SyncProducts/publish/tblCategories", batch); + if (response.IsSuccessStatusCode) + { + Console.WriteLine($"Sent batch {batchIndex + 1}, Count: {batch.Count}"); + } + } + + //Set last sync date + await m_httpClient.PostAsJsonAsync("/api/SyncProducts/setsyncdate", syncTimestamp); + } + private async Task SyncUnitOfMeasureAsync() + { + var responseMessage = await m_httpClient.GetAsync("/api/SyncProducts/lastsyncdate/unitofmeasure"); + if (!responseMessage.IsSuccessStatusCode) + { + return; + } + + DateTime date = await responseMessage.Content.ReadFromJsonAsync(); + IEnumerable modifiedCart = await m_productService.FetchUnitOfMeasureAsync(date, "BRID0"); + SyncTimestamp syncTimestamp = new SyncTimestamp { TableName = "unitofmeasure", Timestamp = DateTime.Now.AddSeconds(-10) }; + int batchSize = 200; + int totalItems = modifiedCart.Count(); + int batches = (totalItems + batchSize - 1) / batchSize; // Calculate total batches + + for (int batchIndex = 0; batchIndex < batches; batchIndex++) + { + List batch = modifiedCart.Skip(batchIndex * batchSize).Take(batchSize).ToList(); + + var response = await m_httpClient.PostAsJsonAsync("/api/SyncProducts/publish/tblunitofmeasure", batch); + if (response.IsSuccessStatusCode) + { + Console.WriteLine($"Sent batch {batchIndex + 1}, Count: {batch.Count}"); + } + } + + //Set last sync date + await m_httpClient.PostAsJsonAsync("/api/SyncProducts/setsyncdate", syncTimestamp); + } + } +} diff --git a/ServerManager/SyncMethods/SalesSync.cs b/ServerManager/SyncMethods/SalesSync.cs new file mode 100644 index 0000000..9cf8bd2 --- /dev/null +++ b/ServerManager/SyncMethods/SalesSync.cs @@ -0,0 +1,341 @@ +using System.Net.Http.Headers; +using Biskilog_Cloud.Shared.Interfaces; +using Biskilog_Cloud.Shared.Models; +using Biskilog_Cloud.Shared.CustomModels; + +namespace ServerManager.SyncMethods +{ + public class SalesSync + { + private readonly ISalesInterface m_salesService; + private HttpClient m_httpClient; + + public SalesSync(ISalesInterface a_salesService) + { + m_salesService = a_salesService; + m_httpClient = new HttpClient(); + } + /// + /// Returns a collection of tasks to perform a sync in the SalesInterface + /// + /// + public IEnumerable GetSalesSyncTask(HttpClient httpClient) + { + m_httpClient = httpClient; + return new Task[] { + SyncCartTable(), + SyncInvoice(), + SyncDiscountLogs(), + SyncCancelledTransactionTable(), + SyncDeliveryRecipient(), + SyncCreditPurchase(), + SyncCustomerAccounts(), + SyncCustomerPurchases(), + SyncDeliveryDetails(), + SynctblDeliveryhead(), + }; + } + private async Task SyncCartTable() + { + var responseMessage = await m_httpClient.GetAsync("/api/SyncSales/lastsyncdate/tblcart"); + if (!responseMessage.IsSuccessStatusCode) + { + return; + } + + DateTime date = await responseMessage.Content.ReadFromJsonAsync(); + IEnumerable modifiedCart = await m_salesService.FetchCartTbl(date, "BRID0"); + SyncTimestamp syncTimestamp = new SyncTimestamp + { + TableName = "TblCart", + Timestamp = DateTime.Now.AddSeconds(-10), + }; + int batchSize = 200; + int totalItems = modifiedCart.Count(); + int batches = (totalItems + batchSize - 1) / batchSize; // Calculate total batches + + for (int batchIndex = 0; batchIndex < batches; batchIndex++) + { + List batch = modifiedCart.Skip(batchIndex * batchSize).Take(batchSize).ToList(); + + var response = await m_httpClient.PostAsJsonAsync("/api/SyncSales/publish/tblCart", batch); + if (response.IsSuccessStatusCode) + { + Console.WriteLine($"Sent batch {batchIndex + 1}, Count: {batch.Count}"); + } + } + + //Set last sync date + await m_httpClient.PostAsJsonAsync("/api/SyncSales/setsyncdate", syncTimestamp); + } + private async Task SyncCancelledTransactionTable() + { + var responseMessage = await m_httpClient.GetAsync("/api/SyncSales/lastsyncdate/tblcancelledtransactions"); + if (!responseMessage.IsSuccessStatusCode) + { + return; + } + + DateTime date = await responseMessage.Content.ReadFromJsonAsync(); + IEnumerable modifiedCart = await m_salesService.FetchCancelledTransaction(date, "BRID0"); + SyncTimestamp syncTimestamp = new SyncTimestamp + { + TableName = "tblcancelledtransactions", + Timestamp = DateTime.Now.AddSeconds(-10), + }; + int batchSize = 200; + int totalItems = modifiedCart.Count(); + int batches = (totalItems + batchSize - 1) / batchSize; // Calculate total batches + + for (int batchIndex = 0; batchIndex < batches; batchIndex++) + { + List batch = modifiedCart.Skip(batchIndex * batchSize).Take(batchSize).ToList(); + + var response = await m_httpClient.PostAsJsonAsync("/api/SyncSales/publish/tblcancelledtransaction", batch); + if (response.IsSuccessStatusCode) + { + Console.WriteLine($"Sent batch {batchIndex + 1}, Count: {batch.Count}"); + } + } + + //Set last sync date + await m_httpClient.PostAsJsonAsync("/api/SyncSales/setsyncdate", syncTimestamp); + } + private async Task SyncCreditPurchase() + { + var responseMessage = await m_httpClient.GetAsync("/api/SyncSales/lastsyncdate/CreditPurchases"); + if (!responseMessage.IsSuccessStatusCode) + { + return; + } + + DateTime date = await responseMessage.Content.ReadFromJsonAsync(); + IEnumerable modifiedCart = await m_salesService.FetchCreditPurchase(date, "BRID0"); + SyncTimestamp syncTimestamp = new SyncTimestamp + { + TableName = "CreditPurchases", + Timestamp = DateTime.Now.AddSeconds(-10), + }; + int batchSize = 200; + int totalItems = modifiedCart.Count(); + int batches = (totalItems + batchSize - 1) / batchSize; // Calculate total batches + + for (int batchIndex = 0; batchIndex < batches; batchIndex++) + { + List batch = modifiedCart.Skip(batchIndex * batchSize).Take(batchSize).ToList(); + + var response = await m_httpClient.PostAsJsonAsync("/api/SyncSales/publish/tblCreditpurchase", batch); + if (response.IsSuccessStatusCode) + { + Console.WriteLine($"Sent batch {batchIndex + 1}, Count: {batch.Count}"); + } + } + + //Set last sync date + await m_httpClient.PostAsJsonAsync("/api/SyncSales/setsyncdate", syncTimestamp); + } + private async Task SyncCustomerAccounts() + { + var responseMessage = await m_httpClient.GetAsync("/api/SyncSales/lastsyncdate/customeraccounts"); + if (!responseMessage.IsSuccessStatusCode) + { + return; + } + + DateTime date = await responseMessage.Content.ReadFromJsonAsync(); + IEnumerable modifiedCart = await m_salesService.FetchCustomerAccount(date, "BRID0"); + SyncTimestamp syncTimestamp = new SyncTimestamp { TableName = "customeraccounts", Timestamp = DateTime.Now.AddSeconds(-10) }; + int batchSize = 200; + int totalItems = modifiedCart.Count(); + int batches = (totalItems + batchSize - 1) / batchSize; // Calculate total batches + + for (int batchIndex = 0; batchIndex < batches; batchIndex++) + { + List batch = modifiedCart.Skip(batchIndex * batchSize).Take(batchSize).ToList(); + + var response = await m_httpClient.PostAsJsonAsync("/api/SyncSales/publish/tblCustomerAccount", batch); + if (response.IsSuccessStatusCode) + { + Console.WriteLine($"Sent batch {batchIndex + 1}, Count: {batch.Count}"); + } + } + + //Set last sync date + await m_httpClient.PostAsJsonAsync("/api/SyncSales/setsyncdate", syncTimestamp); + } + private async Task SyncCustomerPurchases() + { + var responseMessage = await m_httpClient.GetAsync("/api/SyncSales/lastsyncdate/tblcustomerpurchases"); + if (!responseMessage.IsSuccessStatusCode) + { + return; + } + + DateTime date = await responseMessage.Content.ReadFromJsonAsync(); + IEnumerable modifiedCart = await m_salesService.FetchCustomerPurchase(date, "BRID0"); + SyncTimestamp syncTimestamp = new SyncTimestamp { TableName = "tblcustomerpurchases", Timestamp = DateTime.Now.AddSeconds(-10) }; + int batchSize = 200; + int totalItems = modifiedCart.Count(); + int batches = (totalItems + batchSize - 1) / batchSize; // Calculate total batches + + for (int batchIndex = 0; batchIndex < batches; batchIndex++) + { + List batch = modifiedCart.Skip(batchIndex * batchSize).Take(batchSize).ToList(); + + var response = await m_httpClient.PostAsJsonAsync("/api/SyncSales/publish/CustomerPurchase", batch); + if (response.IsSuccessStatusCode) + { + Console.WriteLine($"Sent batch {batchIndex + 1}, Count: {batch.Count}"); + } + } + + //Set last sync date + await m_httpClient.PostAsJsonAsync("/api/SyncSales/setsyncdate", syncTimestamp); + } + private async Task SyncDiscountLogs() + { + var responseMessage = await m_httpClient.GetAsync("/api/SyncSales/lastsyncdate/tbldiscountlogs"); + if (!responseMessage.IsSuccessStatusCode) + { + return; + } + + DateTime date = await responseMessage.Content.ReadFromJsonAsync(); + IEnumerable modifiedCart = await m_salesService.FetchDiscountLogs(date, "BRID0"); + SyncTimestamp syncTimestamp = new SyncTimestamp { TableName = "tbldiscountlogs", Timestamp = DateTime.Now.AddSeconds(-10) }; + int batchSize = 200; + int totalItems = modifiedCart.Count(); + int batches = (totalItems + batchSize - 1) / batchSize; // Calculate total batches + + for (int batchIndex = 0; batchIndex < batches; batchIndex++) + { + List batch = modifiedCart.Skip(batchIndex * batchSize).Take(batchSize).ToList(); + + var response = await m_httpClient.PostAsJsonAsync("/api/SyncSales/publish/DiscountLogs", batch); + if (response.IsSuccessStatusCode) + { + Console.WriteLine($"Sent batch {batchIndex + 1}, Count: {batch.Count}"); + } + } + + //Set last sync date + await m_httpClient.PostAsJsonAsync("/api/SyncSales/setsyncdate", syncTimestamp); + } + private async Task SyncDeliveryDetails() + { + var responseMessage = await m_httpClient.GetAsync("/api/SyncSales/lastsyncdate/tblDeliverydetails"); + if (!responseMessage.IsSuccessStatusCode) + { + return; + } + + DateTime date = await responseMessage.Content.ReadFromJsonAsync(); + IEnumerable modifiedCart = await m_salesService.FetchDeliveryDetails(date, "BRID0"); + SyncTimestamp syncTimestamp = new SyncTimestamp { TableName = "tbldeliverydetails", Timestamp = DateTime.Now.AddSeconds(-10) }; + int batchSize = 200; + int totalItems = modifiedCart.Count(); + int batches = (totalItems + batchSize - 1) / batchSize; // Calculate total batches + + for (int batchIndex = 0; batchIndex < batches; batchIndex++) + { + List batch = modifiedCart.Skip(batchIndex * batchSize).Take(batchSize).ToList(); + + var response = await m_httpClient.PostAsJsonAsync("/api/SyncSales/publish/tblDeliverydetails", batch); + if (response.IsSuccessStatusCode) + { + Console.WriteLine($"Sent batch {batchIndex + 1}, Count: {batch.Count}"); + } + } + + //Set last sync date + await m_httpClient.PostAsJsonAsync("/api/SyncSales/setsyncdate", syncTimestamp); + } + private async Task SynctblDeliveryhead() + { + var responseMessage = await m_httpClient.GetAsync("/api/SyncSales/lastsyncdate/tblDeliveryhead"); + if (!responseMessage.IsSuccessStatusCode) + { + return; + } + + DateTime date = await responseMessage.Content.ReadFromJsonAsync(); + IEnumerable modifiedCart = await m_salesService.FetchDeliveryHead(date, "BRID0"); + SyncTimestamp syncTimestamp = new SyncTimestamp { TableName = "tbldeliveryhead", Timestamp = DateTime.Now.AddSeconds(-10) }; + int batchSize = 200; + int totalItems = modifiedCart.Count(); + int batches = (totalItems + batchSize - 1) / batchSize; // Calculate total batches + + for (int batchIndex = 0; batchIndex < batches; batchIndex++) + { + List batch = modifiedCart.Skip(batchIndex * batchSize).Take(batchSize).ToList(); + + var response = await m_httpClient.PostAsJsonAsync("/api/SyncSales/publish/tblDeliveryhead", batch); + if (response.IsSuccessStatusCode) + { + Console.WriteLine($"Sent batch {batchIndex + 1}, Count: {batch.Count}"); + } + } + + //Set last sync date + await m_httpClient.PostAsJsonAsync("/api/SyncSales/setsyncdate", syncTimestamp); + } + private async Task SyncDeliveryRecipient() + { + var responseMessage = await m_httpClient.GetAsync("/api/SyncSales/lastsyncdate/tblDeliveryrecipients"); + if (!responseMessage.IsSuccessStatusCode) + { + return; + } + + DateTime date = await responseMessage.Content.ReadFromJsonAsync(); + IEnumerable modifiedCart = await m_salesService.FetchDeliveryRecipients(date, "BRID0"); + SyncTimestamp syncTimestamp = new SyncTimestamp { TableName = "tbldeliveryrecipients", Timestamp = DateTime.Now.AddSeconds(-10) }; + int batchSize = 200; + int totalItems = modifiedCart.Count(); + int batches = (totalItems + batchSize - 1) / batchSize; // Calculate total batches + + for (int batchIndex = 0; batchIndex < batches; batchIndex++) + { + List batch = modifiedCart.Skip(batchIndex * batchSize).Take(batchSize).ToList(); + + var response = await m_httpClient.PostAsJsonAsync("/api/SyncSales/publish/tblDeliveryrecipient", batch); + if (response.IsSuccessStatusCode) + { + Console.WriteLine($"Sent batch {batchIndex + 1}, Count: {batch.Count}"); + } + } + + //Set last sync date + await m_httpClient.PostAsJsonAsync("/api/SyncSales/setsyncdate", syncTimestamp); + } + private async Task SyncInvoice() + { + var responseMessage = await m_httpClient.GetAsync("/api/SyncSales/lastsyncdate/tblinvoice"); + if (!responseMessage.IsSuccessStatusCode) + { + return; + } + + DateTime date = await responseMessage.Content.ReadFromJsonAsync(); + IEnumerable modifiedCart = await m_salesService.FetchInvoice(date, "BRID0"); + SyncTimestamp syncTimestamp = new SyncTimestamp { TableName = "tblinvoice", Timestamp = DateTime.Now.AddSeconds(-10) }; + int batchSize = 200; + int totalItems = modifiedCart.Count(); + int batches = (totalItems + batchSize - 1) / batchSize; // Calculate total batches + + for (int batchIndex = 0; batchIndex < batches; batchIndex++) + { + List batch = modifiedCart.Skip(batchIndex * batchSize).Take(batchSize).ToList(); + + var response = await m_httpClient.PostAsJsonAsync("/api/SyncSales/publish/tblinvoice", batch); + if (response.IsSuccessStatusCode) + { + Console.WriteLine($"Sent batch {batchIndex + 1}, Count: {batch.Count}"); + } + } + + //Set last sync date + await m_httpClient.PostAsJsonAsync("/api/SyncSales/setsyncdate", syncTimestamp); + } + } +} diff --git a/ServerManager/WeatherForecast.cs b/ServerManager/WeatherForecast.cs new file mode 100644 index 0000000..15ad497 --- /dev/null +++ b/ServerManager/WeatherForecast.cs @@ -0,0 +1,12 @@ +namespace ServerManager; + +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; } +} diff --git a/ServerManager/Worker.cs b/ServerManager/Worker.cs index 846bd2d..efedd9f 100644 --- a/ServerManager/Worker.cs +++ b/ServerManager/Worker.cs @@ -1,21 +1,57 @@ +using ServerManager.SyncMethods; +using System.Net.Http.Headers; + namespace ServerManager { public class Worker : BackgroundService { private readonly ILogger _logger; + private readonly IServiceProvider _serviceProvider; + private readonly IConfiguration m_configuration; + private HttpClient m_httpClient; - public Worker(ILogger logger) + public Worker(ILogger logger, IServiceProvider serviceProvider, IConfiguration configuration) { _logger = logger; + _serviceProvider = serviceProvider; + m_configuration = configuration; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { - while (!stoppingToken.IsCancellationRequested) + try + { + string baseurl = m_configuration.GetValue("BaseUrl", "")!; + HttpClient httpClient = new HttpClient(); + httpClient.BaseAddress = new Uri(baseurl); + string token = m_configuration.GetValue("Token", "")!; + var authHeader = new AuthenticationHeaderValue("Bearer", token); + httpClient.DefaultRequestHeaders.Authorization = authHeader; + + using var scope = _serviceProvider.CreateScope(); + var salesSync = scope.ServiceProvider.GetRequiredService(); + var productSync = scope.ServiceProvider.GetRequiredService(); + var companySync = scope.ServiceProvider.GetRequiredService(); + + while (!stoppingToken.IsCancellationRequested) + { + _logger.LogInformation("Worker running at: {time} ", DateTimeOffset.Now); + + List runTask = new List(); + runTask.AddRange(salesSync.GetSalesSyncTask(httpClient)); + runTask.AddRange(productSync.GetProductSyncTask(httpClient)); + runTask.AddRange(companySync.GetCompanySyncTask(httpClient)); + + // Wait for all tasks to complete + await Task.WhenAll(runTask); + + await Task.Delay(1000, stoppingToken); + } + } + catch (Exception ex) { - _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); - await Task.Delay(1000, stoppingToken); + Console.WriteLine(ex.ToString()); } } } -} \ No newline at end of file +} diff --git a/ServerManager/appsettings.Development.json b/ServerManager/appsettings.Development.json index b2dcdb6..0c208ae 100644 --- a/ServerManager/appsettings.Development.json +++ b/ServerManager/appsettings.Development.json @@ -2,7 +2,7 @@ "Logging": { "LogLevel": { "Default": "Information", - "Microsoft.Hosting.Lifetime": "Information" + "Microsoft.AspNetCore": "Warning" } } } diff --git a/ServerManager/appsettings.json b/ServerManager/appsettings.json index b2dcdb6..d491365 100644 --- a/ServerManager/appsettings.json +++ b/ServerManager/appsettings.json @@ -2,7 +2,18 @@ "Logging": { "LogLevel": { "Default": "Information", - "Microsoft.Hosting.Lifetime": "Information" + "Microsoft.AspNetCore": "Warning" } + }, + "ConnectionStrings": { + "Connection": "Server=BarhenVM\\SqlExpress;Database=BISK_POS;Integrated Security=True;TrustServerCertificate=true" + }, + "Token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiIyMWM3MWE0Ni0xZmY2LTRkMGMtYmYzMS1iMTExMzJlMGM5ODQiLCJpYXQiOiIxNC8wOC8yMDIzIDY6MjI6MzIgcG0iLCJDb250cmFjdFN0YXJ0IjoiMTgvMDUvMjAyMyA4OjQ3OjI3IHBtIiwiQ29udHJhY3RFbmQiOiIxOC8wNS8yMDI0IDg6NDc6MjkgcG0iLCJVc2VySWQiOiIxIiwiVXNlcm5hbWUiOiJ0ZXN0IiwiRGJJZCI6IjEiLCJDb21wYXJpc29uTW9kZSI6IkZhbHNlIiwiQnJhbmNoSWQiOiJCUklEMCIsIkJyYW5jaEFjY2VzcyI6IkJSSUQwIiwiQ2xpZW50SWQiOiIxIiwiZXhwIjoxNjkzMjQ2OTUyLCJpc3MiOiJBVVRIIFNFUlZFUiIsImF1ZCI6IkJJU0tJTE9HIn0.W3kxw5kEj13TDSs96doR20IW96k3aO8uR5SKGiSaSX4", + "BaseUrl": "https://localhost:7247/", + "AllowedHosts": "*", + "JWT": { + "Key": "@@BISKILOGACCOUNTING2023DEV??//##$", + "Issuer": "AUTH SERVER", + "Audience": "BISKILOG" } -} +} \ No newline at end of file diff --git a/Shared/Biskilog_Cloud.Shared.csproj b/Shared/Biskilog_Cloud.Shared.csproj new file mode 100644 index 0000000..4e8ed53 --- /dev/null +++ b/Shared/Biskilog_Cloud.Shared.csproj @@ -0,0 +1,22 @@ + + + + net7.0 + enable + enable + + + + + + + + + + + + + + + + diff --git a/Shared/ClientContractModels/Authtype.cs b/Shared/ClientContractModels/Authtype.cs new file mode 100644 index 0000000..d54bd04 --- /dev/null +++ b/Shared/ClientContractModels/Authtype.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.ClientContractModels; + +public partial class Authtype +{ + public int Id { get; set; } + + public string? Type { get; set; } +} diff --git a/Shared/ClientContractModels/Clientbusiness.cs b/Shared/ClientContractModels/Clientbusiness.cs new file mode 100644 index 0000000..6dc3766 --- /dev/null +++ b/Shared/ClientContractModels/Clientbusiness.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.ClientContractModels; + +public partial class Clientbusiness +{ + /// + /// there could be multiple branches of the same business + /// + 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!; +} diff --git a/Shared/ClientContractModels/Clientinfo.cs b/Shared/ClientContractModels/Clientinfo.cs new file mode 100644 index 0000000..c08c0cf --- /dev/null +++ b/Shared/ClientContractModels/Clientinfo.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.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; } +} diff --git a/Shared/ClientContractModels/Contract.cs b/Shared/ClientContractModels/Contract.cs new file mode 100644 index 0000000..049bad2 --- /dev/null +++ b/Shared/ClientContractModels/Contract.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.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!; +} diff --git a/Shared/ClientContractModels/Databasemap.cs b/Shared/ClientContractModels/Databasemap.cs new file mode 100644 index 0000000..f0ab40f --- /dev/null +++ b/Shared/ClientContractModels/Databasemap.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.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; } +} diff --git a/Shared/ClientContractModels/Siteaccesspermission.cs b/Shared/ClientContractModels/Siteaccesspermission.cs new file mode 100644 index 0000000..b09b408 --- /dev/null +++ b/Shared/ClientContractModels/Siteaccesspermission.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.ClientContractModels; + +public partial class Siteaccesspermission +{ + public int UserId { get; set; } + + /// + /// businessIds could also been seen as branchID + /// + public int BusinessId { get; set; } + + public int ClientId { get; set; } +} diff --git a/Shared/ClientContractModels/Userauth.cs b/Shared/ClientContractModels/Userauth.cs new file mode 100644 index 0000000..f8960b9 --- /dev/null +++ b/Shared/ClientContractModels/Userauth.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.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; } +} diff --git a/Shared/CustomModels/CancelledSales.cs b/Shared/CustomModels/CancelledSales.cs new file mode 100644 index 0000000..cc4f38b --- /dev/null +++ b/Shared/CustomModels/CancelledSales.cs @@ -0,0 +1,16 @@ +using Biskilog_Cloud.Shared.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Biskilog_Cloud.Shared.CustomModels +{ + public class CancelledSales + { + public TblCancelledTransaction? CancelledTransaction { get; set; } + public string Customer { get; set; } = "WALK-IN Purchase"; + public decimal? Value { get; set; } + } +} diff --git a/Shared/CustomModels/CustomerAccounts.cs b/Shared/CustomModels/CustomerAccounts.cs new file mode 100644 index 0000000..d67e76c --- /dev/null +++ b/Shared/CustomModels/CustomerAccounts.cs @@ -0,0 +1,15 @@ +using Biskilog_Cloud.Shared.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Biskilog_Cloud.Shared.CustomModels +{ + public class CustomerAccounts + { + public TblCustomer Customer { get; set; } + public decimal Debt { get; set; } = 0; + } +} diff --git a/Shared/CustomModels/MostPurchaseItem.cs b/Shared/CustomModels/MostPurchaseItem.cs new file mode 100644 index 0000000..2ff58ea --- /dev/null +++ b/Shared/CustomModels/MostPurchaseItem.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Biskilog_Cloud.Shared.CustomModels +{ + public class MostPurchasedItem + { + /// + /// Specifies the id of the product + /// + public string ProductId { get; set; } = string.Empty; + /// + /// Specifies the name of the product + /// + public string ProductName { get; set; } = string.Empty; + /// + /// The total revenue generated from the sale + /// + public decimal? Revenue { get; set; } + /// + /// This is the number of times the item has been sold + /// + public int? NbrTimesSold { get; set; } + + } +} diff --git a/Shared/CustomModels/ProductItem.cs b/Shared/CustomModels/ProductItem.cs new file mode 100644 index 0000000..0ecdd35 --- /dev/null +++ b/Shared/CustomModels/ProductItem.cs @@ -0,0 +1,18 @@ +using Biskilog_Cloud.Shared.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Biskilog_Cloud.Shared.CustomModels +{ + public class ProductItem + { + public TblProduct? Product { get; set; } + public TblInventory? Stock { get; set; } + public RestockLevel? Restocklevel { get; set; } + public List Units { get; set; } = new List(); + public string BaseUnit { get; set; } = string.Empty; + } +} diff --git a/Shared/CustomModels/ProductPriceChange.cs b/Shared/CustomModels/ProductPriceChange.cs new file mode 100644 index 0000000..0750961 --- /dev/null +++ b/Shared/CustomModels/ProductPriceChange.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Biskilog_Cloud.Shared.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!; + } +} diff --git a/Shared/CustomModels/ProductUnits.cs b/Shared/CustomModels/ProductUnits.cs new file mode 100644 index 0000000..e50ebc1 --- /dev/null +++ b/Shared/CustomModels/ProductUnits.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Biskilog_Cloud.Shared.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!; + } +} diff --git a/Shared/CustomModels/SaleItem.cs b/Shared/CustomModels/SaleItem.cs new file mode 100644 index 0000000..b88673a --- /dev/null +++ b/Shared/CustomModels/SaleItem.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Biskilog_Cloud.Shared.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"!; + } +} diff --git a/Shared/CustomModels/SyncTimestamp.cs b/Shared/CustomModels/SyncTimestamp.cs new file mode 100644 index 0000000..d20fd21 --- /dev/null +++ b/Shared/CustomModels/SyncTimestamp.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Biskilog_Cloud.Shared.CustomModels +{ + public class SyncTimestamp + { + public string TableName { get; set; } + public DateTime Timestamp { get; set; } + } +} diff --git a/Shared/CustomModels/TradeSummary.cs b/Shared/CustomModels/TradeSummary.cs new file mode 100644 index 0000000..895397c --- /dev/null +++ b/Shared/CustomModels/TradeSummary.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Biskilog_Cloud.Shared.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; + } +} diff --git a/Shared/CustomModels/WeeklySaleItem.cs b/Shared/CustomModels/WeeklySaleItem.cs new file mode 100644 index 0000000..15667d9 --- /dev/null +++ b/Shared/CustomModels/WeeklySaleItem.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Biskilog_Cloud.Shared.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!; + } +} diff --git a/Shared/Enums/AuthEnums.cs b/Shared/Enums/AuthEnums.cs new file mode 100644 index 0000000..26b9726 --- /dev/null +++ b/Shared/Enums/AuthEnums.cs @@ -0,0 +1,17 @@ +namespace Biskilog_Cloud.Shared.Enums +{ + public enum AuthEnums + { + Registered, + AleadyLoggedin, + WrongPassword, + NotFound, + Found, + Expired, + Invalid, + Valid, + Successful, + Error + } +} + diff --git a/Shared/Enums/ConnectionEnums.cs b/Shared/Enums/ConnectionEnums.cs new file mode 100644 index 0000000..caf592b --- /dev/null +++ b/Shared/Enums/ConnectionEnums.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Biskilog_Cloud.Shared.Enums +{ + public enum ConnectionEnums + { + ConnectionEstablished, + ConnectionNotEstablished, + } +} diff --git a/Shared/Interfaces/IAnalytics.cs b/Shared/Interfaces/IAnalytics.cs new file mode 100644 index 0000000..44dca09 --- /dev/null +++ b/Shared/Interfaces/IAnalytics.cs @@ -0,0 +1,86 @@ +using Biskilog_Cloud.Shared.CustomModels; +using Biskilog_Cloud.Shared.Models; + +namespace Biskilog_Cloud.Shared.Interfaces +{ + public interface IAnalytics + { + /// + /// Fetches a collection of sales transaction made from the specified start date to the end date + /// + /// Specified Start Date + /// Specified end Date + /// + IEnumerable GetSalesTransaction(DateTime a_start, DateTime a_end); + /// + /// Fetches a collection of sales transaction made within a one week period + /// + /// + IEnumerable GetWeeklySalesTransaction(); + /// + /// Fetches a collection of in-debt customers + /// + IEnumerable GetInDebtCustomers(); + /// + /// Fetches a collection of Product Items which are currently out of stock + /// + /// + IEnumerable GetOutOfStockItems(); + /// + /// Fetches a collection of the most purchased Product Items within a specified date range + /// + /// + /// + /// + IEnumerable GetMostPurchasedItem(DateTime a_start, DateTime a_end); + /// + /// Fetches a collection of cancelled transaction within a specified date range + /// + /// + /// + /// + IEnumerable GetCancelledSales(DateTime a_start, DateTime a_end); + /// + /// Fetches a collection of transaction made by employees within a specified date range + /// + /// + /// + /// A dictionary of transactions made by employees with employee name as key + Dictionary> GetEmployeeSales(DateTime a_start, DateTime a_end); + /// + /// Fetches a collection of product price changes with a specified date range + /// + /// + /// + /// + IEnumerable GetPriceChanges(DateTime a_start, DateTime a_end); + /// + /// Fetch the trade summary which is made of the total sales made currently and previous trade + /// + /// + TradeSummary GetTradeSummary(); + /// + /// Fetches the most recent sales transactions + /// + /// The number of rows to return + /// + IEnumerable GetRecentSales(int a_limit); + /// + /// Fetches a collection of product price changes recently made + /// + /// the number of rows to return + /// + IEnumerable GetRecentPriceChanges(int a_limit); + /// + /// Fetches a collection of price change history per product + /// + /// the number of products to fetch history + /// + IEnumerable GetProductPriceChangeHistory(int a_limit); + /// + /// Fetches a collection of sales transaction grouped by category made within a one week period + /// + /// + IEnumerable GetWeeklySalesCategoryTransaction(int a_limit); + } +} diff --git a/Shared/Interfaces/IAuthService.cs b/Shared/Interfaces/IAuthService.cs new file mode 100644 index 0000000..a72f077 --- /dev/null +++ b/Shared/Interfaces/IAuthService.cs @@ -0,0 +1,19 @@ +using Biskilog_Cloud.Shared.ClientContractModels; + +namespace Biskilog_Cloud.Shared.Interfaces +{ + public interface IAuthService + { + /// + /// Authenticates user or client + /// + /// + /// + /// A tokenized string with relevant information on the authenticated user + Task AuthenticateClient(string a_username, string a_password); + Contract? GetContract(int a_clientId, List a_businessId); + Databasemap GetClientDB(int a_clientId); + List GetSiteaccesspermission(int a_clientId, int a_userId); + List GetClientbusiness(int a_clientId, int userId); + } +} diff --git a/Shared/Interfaces/ICalculator.cs b/Shared/Interfaces/ICalculator.cs new file mode 100644 index 0000000..80b2c06 --- /dev/null +++ b/Shared/Interfaces/ICalculator.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Biskilog_Cloud.Shared.Interfaces +{ + public interface ICalculator + { + double CalculatePercentage(); + string FormatMoneyWithCurrency(double a_amount); + string FormatMoneyWithCurrencyKilo(double a_amount); + NumberFormatInfo GetCurrencyCode(); + } +} diff --git a/Shared/Interfaces/ICompanyInfo.cs b/Shared/Interfaces/ICompanyInfo.cs new file mode 100644 index 0000000..2626e27 --- /dev/null +++ b/Shared/Interfaces/ICompanyInfo.cs @@ -0,0 +1,26 @@ +using Biskilog_Cloud.Shared.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Biskilog_Cloud.Shared.Interfaces +{ + public interface ICompanyInfo + { + IEnumerable FetchBranches(); + Task GetCompanyInfoAsync(); + Task> GetBranches(); + string GetCompanyName(); + string GetBranchName(string a_branchId); + Task> FetchBranch(DateTime a_dateTime, string a_branch); + Task> FetchSystemRoles(DateTime a_dateTime, string a_branch); + Task> FetchCompanyInfoAsync(DateTime a_dateTime, string a_branch); + Task> FetchDriversAsync(DateTime a_syncDate, string a_branchId); + Task> FetchDriverMappingAsync(DateTime a_syncDate, string a_branchId); + Task> FetchTruckAsync(DateTime a_syncDate, string a_branchId); + Task> FetchTruckInventoryAsync(DateTime a_syncDate, string a_branchId); + Task> FetchTruckAssignmentAsync(DateTime a_syncDate, string a_branchId); + } +} diff --git a/Shared/Interfaces/IConnectionService.cs b/Shared/Interfaces/IConnectionService.cs new file mode 100644 index 0000000..3a80bb3 --- /dev/null +++ b/Shared/Interfaces/IConnectionService.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Biskilog_Cloud.Shared.Interfaces +{ + public interface IConnectionService + { + /// + /// Prepares and returns the connection string for a client using the specified database id + /// + /// Specified database id to use + /// + string GetClientConnectionString(int a_databaseId); + /// + /// Prepare the DB context from the specified connection string + /// + /// + /// A configured BiskAcdbContext + object PrepareDBContext(string a_connectionString); + } +} diff --git a/Shared/Interfaces/ICustomer.cs b/Shared/Interfaces/ICustomer.cs new file mode 100644 index 0000000..863a9c3 --- /dev/null +++ b/Shared/Interfaces/ICustomer.cs @@ -0,0 +1,12 @@ +using Biskilog_Cloud.Shared.CustomModels; +using Biskilog_Cloud.Shared.Models; + +namespace Biskilog_Cloud.Shared.Interfaces +{ + public interface ICustomer + { + IEnumerable FetchCustomers(); + Task> GetCustomers(); + Task> FetchCustomers(DateTime a_lastSync, string a_branchId); + } +} diff --git a/Shared/Interfaces/IMainInterface.cs b/Shared/Interfaces/IMainInterface.cs new file mode 100644 index 0000000..8e565e0 --- /dev/null +++ b/Shared/Interfaces/IMainInterface.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Biskilog_Cloud.Shared.Interfaces +{ + public interface IMainInterface + { + void ShowReceipt(string a_receipt); + DateOnly CurrentTradeDate(); + DateOnly PreviousTradeDate(); + } +} diff --git a/Shared/Interfaces/IProducts.cs b/Shared/Interfaces/IProducts.cs new file mode 100644 index 0000000..5e73736 --- /dev/null +++ b/Shared/Interfaces/IProducts.cs @@ -0,0 +1,38 @@ +using Biskilog_Cloud.Shared.CustomModels; +using Biskilog_Cloud.Shared.Models; + +namespace Biskilog_Cloud.Shared.Interfaces +{ + public interface IProduct + { + IEnumerable GetUnitofmeasures(); + IEnumerable GetProducts(string a_productKey = ""); + IEnumerable GetBrands(string a_brandKey = ""); + IEnumerable GetCategories(string a_categoryKey = ""); + IEnumerable 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> FetchProducts(DateTime a_lastSync, string a_branch); + Task> FetchInventory(DateTime a_lastSync, string a_branch); + Task> FetchInventoryEntries(DateTime a_lastSync, string a_branch); + Task> FetchPriceChanges(DateTime a_lastSync, string a_branch); + Task> FetchProductAltUnit(DateTime a_lastSync, string a_branch); + Task> FetchRestockAsync(DateTime a_lastSync, string a_branch); + Task> FetchUnitOfMeasureAsync(DateTime a_lastSync, string a_branch); + Task> FetchStockAsync(DateTime a_lastSync, string a_branch); + Task> FetchBrandsAsync(DateTime a_lastSync, string a_branch); + Task> FetchCategoriesAsync(DateTime a_lastSync, string a_branch); + } +} diff --git a/Shared/Interfaces/ISalesInterface.cs b/Shared/Interfaces/ISalesInterface.cs new file mode 100644 index 0000000..e85a255 --- /dev/null +++ b/Shared/Interfaces/ISalesInterface.cs @@ -0,0 +1,35 @@ +using Biskilog_Cloud.Shared.CustomModels; +using Biskilog_Cloud.Shared.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Biskilog_Cloud.Shared.Interfaces +{ + public interface ISalesInterface + { + Task FetchRecentTransaction(int a_limit); + Task FetchTransaction(DateTime a_start, DateTime a_end); + IEnumerable GetTransactions(DateTime a_start, DateTime a_end); + IEnumerable GetRecentTransaction(); + Task FetchReceipt(string a_receiptId); + IEnumerable GetReceipt(string a_receiptId); + Task> GetReceiptDetail(string a_receiptId); + event EventHandler TransactionsChanged; + event EventHandler FetchComplete; + event EventHandler FetchStart; + + Task> FetchCartTbl(DateTime a_lastSync, string a_branch); + Task> FetchCancelledTransaction(DateTime a_lastSync, string a_branch); + Task> FetchCreditPurchase(DateTime a_lastSync, string a_branch); + Task> FetchCustomerAccount(DateTime a_lastSync, string a_branch); + Task> FetchCustomerPurchase(DateTime a_lastSync, string a_branch); + Task> FetchDiscountLogs(DateTime a_lastSync, string a_branch); + Task> FetchDeliveryDetails(DateTime a_lastSync, string a_branch); + Task> FetchDeliveryHead(DateTime a_lastSync, string a_branch); + Task> FetchDeliveryRecipients(DateTime a_lastSync, string a_branch); + Task> FetchInvoice(DateTime a_lastSync, string a_branch); + } +} diff --git a/Shared/Interfaces/ISearchService.cs b/Shared/Interfaces/ISearchService.cs new file mode 100644 index 0000000..4d96e90 --- /dev/null +++ b/Shared/Interfaces/ISearchService.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Biskilog_Cloud.Shared.Interfaces +{ + public interface ISearchService + { + public event Action SearchValueChanged; + public event Action ClearTextBox; + void PerformSearch(string a_searchKey); + void Clear(); + } +} diff --git a/Shared/Interfaces/ITokenService.cs b/Shared/Interfaces/ITokenService.cs new file mode 100644 index 0000000..d9a8076 --- /dev/null +++ b/Shared/Interfaces/ITokenService.cs @@ -0,0 +1,22 @@ +using Biskilog_Cloud.Shared.ClientContractModels; +using Biskilog_Cloud.Shared.Enums; + +namespace Biskilog_Cloud.Shared.Interfaces +{ + public interface ITokenService + { + AuthEnums ValidateToken(string a_token); + string GenerateToken(Userauth a_user, Contract a_clientContract, Databasemap a_database, List 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 BranchIds(string a_token); + string? GetAllBranch(string a_token); + Task SetToken(string a_token, bool a_remember); + Task GetToken(); + Task ClearToken(); + Task IsTokenSet(); + } +} diff --git a/Shared/Interfaces/IUser.cs b/Shared/Interfaces/IUser.cs new file mode 100644 index 0000000..a42e1b0 --- /dev/null +++ b/Shared/Interfaces/IUser.cs @@ -0,0 +1,12 @@ + +using Biskilog_Cloud.Shared.Models; + +namespace Biskilog_Cloud.Shared.Interfaces +{ + public interface IUser + { + IEnumerable FetchUsers(); + Task> GetUsers(); + Task> FetchUsers(DateTime a_syncDate, string a_branchId); + } +} diff --git a/Shared/Models/CreditPurchase.cs b/Shared/Models/CreditPurchase.cs new file mode 100644 index 0000000..a3a9392 --- /dev/null +++ b/Shared/Models/CreditPurchase.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.Models; + +public partial class CreditPurchase +{ + public string ReceiptId { get; set; } = null!; + + public DateTime? Date { get; set; } + + public decimal? Paid { get; set; } + + public decimal? TotalBill { get; set; } + + public string? CustomerId { get; set; } + + public string? Status { get; set; } + + public string? BranchId { get; set; } + + public DateTime LastModified { get; set; } +} diff --git a/Shared/Models/CustomerAccount.cs b/Shared/Models/CustomerAccount.cs new file mode 100644 index 0000000..13bbc38 --- /dev/null +++ b/Shared/Models/CustomerAccount.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.Models; + +public partial class CustomerAccount +{ + public string? CustomerId { get; set; } + + public string? TransactionId { get; set; } + + 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; } + + public string? BranchId { get; set; } + + public string CountId { get; set; } = null!; + + public DateTime LastModified { get; set; } +} diff --git a/Shared/Models/ProductAltUnit.cs b/Shared/Models/ProductAltUnit.cs new file mode 100644 index 0000000..de4fc97 --- /dev/null +++ b/Shared/Models/ProductAltUnit.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.Models; + +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; } + + public DateTime LastModified { get; set; } +} diff --git a/Shared/Models/RestockLevel.cs b/Shared/Models/RestockLevel.cs new file mode 100644 index 0000000..988ca66 --- /dev/null +++ b/Shared/Models/RestockLevel.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.Models; + +public partial class RestockLevel +{ + public string ProductId { get; set; } = null!; + + public int? WarnLevel { get; set; } + + public string? Unit { get; set; } + + public string? BranchId { get; set; } + + public DateTime LastModified { get; set; } +} diff --git a/Shared/Models/SystemUserRole.cs b/Shared/Models/SystemUserRole.cs new file mode 100644 index 0000000..dd8b06f --- /dev/null +++ b/Shared/Models/SystemUserRole.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.Models; + +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; } + + public DateTime LastModified { get; set; } +} diff --git a/Shared/Models/TbStock.cs b/Shared/Models/TbStock.cs new file mode 100644 index 0000000..77afff4 --- /dev/null +++ b/Shared/Models/TbStock.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.Models; + +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; } +} +; \ No newline at end of file diff --git a/Shared/Models/TblBranch.cs b/Shared/Models/TblBranch.cs new file mode 100644 index 0000000..78a5058 --- /dev/null +++ b/Shared/Models/TblBranch.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.Models; + +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; } + + public DateTime LastModified { get; set; } +} diff --git a/Shared/Models/TblBrand.cs b/Shared/Models/TblBrand.cs new file mode 100644 index 0000000..56201f5 --- /dev/null +++ b/Shared/Models/TblBrand.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.Models; + +public partial class TblBrand +{ + public string Id { get; set; } = null!; + + public string? Brand { get; set; } + + public string? BranchId { get; set; } + + public DateTime LastModified { get; set; } +} diff --git a/Shared/Models/TblCancelledTransaction.cs b/Shared/Models/TblCancelledTransaction.cs new file mode 100644 index 0000000..870f1c3 --- /dev/null +++ b/Shared/Models/TblCancelledTransaction.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.Models; + +public partial class TblCancelledTransaction +{ + public string? Transno { get; set; } + + public DateTime? DateCancelled { get; set; } + + public string? CancelledBy { get; set; } + + public string? BranchId { get; set; } + + public string CountId { get; set; } = null!; + + public DateTime LastModified { get; set; } +} diff --git a/Shared/Models/TblCart.cs b/Shared/Models/TblCart.cs new file mode 100644 index 0000000..6b84804 --- /dev/null +++ b/Shared/Models/TblCart.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.Models; + +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? BranchId { get; set; } + + public string? Unit { get; set; } + + public decimal? Costprice { get; set; } + + public decimal? Tendered { get; set; } + + public decimal? Balance { get; set; } + + public decimal? ValueAddTax { get; set; } + + public string CountId { get; set; } = null!; + + public DateTime LastModified { get; set; } +} diff --git a/Shared/Models/TblCategory.cs b/Shared/Models/TblCategory.cs new file mode 100644 index 0000000..1151def --- /dev/null +++ b/Shared/Models/TblCategory.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.Models; + +public partial class TblCategory +{ + public string Id { get; set; } = null!; + + public string? Category { get; set; } + + public string? BranchId { get; set; } + + public DateTime LastModified { get; set; } +} diff --git a/Shared/Models/TblCompanyDetail.cs b/Shared/Models/TblCompanyDetail.cs new file mode 100644 index 0000000..6b6cad3 --- /dev/null +++ b/Shared/Models/TblCompanyDetail.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.Models; + +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; } + + public DateTime LastModified { get; set; } +} diff --git a/Shared/Models/TblCustomer.cs b/Shared/Models/TblCustomer.cs new file mode 100644 index 0000000..214b342 --- /dev/null +++ b/Shared/Models/TblCustomer.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.Models; + +public partial class TblCustomer +{ + public string CustomerId { 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? BranchId { get; set; } + + public string? Status { get; set; } + + public string? Tin { get; set; } + + public DateTime? DateExit { get; set; } = new DateTime(2000, 01, 01); + + public string? Email { get; set; } + + public string? FinancialStatus { get; set; } + + public string? NameKey1 { get; set; } + + public string? NameKey2 { get; set; } + + public DateTime LastModified { get; set; } +} diff --git a/Shared/Models/TblCustomerPurchase.cs b/Shared/Models/TblCustomerPurchase.cs new file mode 100644 index 0000000..76c3551 --- /dev/null +++ b/Shared/Models/TblCustomerPurchase.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.Models; + +public partial class TblCustomerPurchase +{ + public string? CustomerId { get; set; } + + public string? TransactionId { get; set; } + + public string? BranchId { get; set; } + + public string CountId { get; set; } = null!; + + public DateTime LastModified { get; set; } +} diff --git a/Shared/Models/TblDeliveryDetail.cs b/Shared/Models/TblDeliveryDetail.cs new file mode 100644 index 0000000..07195ab --- /dev/null +++ b/Shared/Models/TblDeliveryDetail.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.Models; + +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 DateTime LastModified { get; set; } + public string? BranchId { get; set; } +} diff --git a/Shared/Models/TblDeliveryHead.cs b/Shared/Models/TblDeliveryHead.cs new file mode 100644 index 0000000..c61a4ef --- /dev/null +++ b/Shared/Models/TblDeliveryHead.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.Models; + +public partial class TblDeliveryHead +{ + public string DeliveryId { 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; } + + public string? BranchId { get; set; } + + public DateTime LastModified { get; set; } +} diff --git a/Shared/Models/TblDeliveryRecipient.cs b/Shared/Models/TblDeliveryRecipient.cs new file mode 100644 index 0000000..df9fe37 --- /dev/null +++ b/Shared/Models/TblDeliveryRecipient.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.Models; + +public partial class TblDeliveryRecipient +{ + public string DeliveryId { 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 DateTime? FromDate { get; set; } + + public DateTime? ToDate { get; set; } + + public DateTime LastModified { get; set; } + public string? BranchId { get; set; } +} diff --git a/Shared/Models/TblDiscountLog.cs b/Shared/Models/TblDiscountLog.cs new file mode 100644 index 0000000..d3b3e31 --- /dev/null +++ b/Shared/Models/TblDiscountLog.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.Models; + +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; } + + public string CountId { get; set; } = null!; + + public DateTime LastModified { get; set; } +} diff --git a/Shared/Models/TblDriver.cs b/Shared/Models/TblDriver.cs new file mode 100644 index 0000000..57c1b0a --- /dev/null +++ b/Shared/Models/TblDriver.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.Models; + +public partial class TblDriver +{ + public string DriverId { get; set; } = null!; + + public string? Firstname { get; set; } + + public string? Surname { get; set; } + + public string? Middlename { get; set; } + + public DateTime? 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? BranchId { get; set; } + + public string? Status { get; set; } + + public DateTime LastModified { get; set; } +} diff --git a/Shared/Models/TblHeldTransaction.cs b/Shared/Models/TblHeldTransaction.cs new file mode 100644 index 0000000..5991e35 --- /dev/null +++ b/Shared/Models/TblHeldTransaction.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.Models; + +public partial class TblHeldTransaction +{ + public string? ProductId { 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? BranchId { get; set; } + + public string? Unit { get; set; } + + public decimal? Costprice { get; set; } + + public decimal? Discount { get; set; } + + public string? InvoiceId { get; set; } + + public string? CustomerId { get; set; } + + public string CountId { get; set; } = null!; + + public string TransactionId { get; set; } = null!; + + public string? Distinctive { get; set; } + + public DateTime LastModified { get; set; } +} diff --git a/Shared/Models/TblInventory.cs b/Shared/Models/TblInventory.cs new file mode 100644 index 0000000..f0fabe2 --- /dev/null +++ b/Shared/Models/TblInventory.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.Models; + +public partial class TblInventory +{ + public string? Pcode { get; set; } + + public int? Quantity { get; set; } = 0; + + public string? BranchId { get; set; } + + public string CountId { get; set; } = null!; + + public DateTime LastModified { get; set; } +} diff --git a/Shared/Models/TblInventoryEntry.cs b/Shared/Models/TblInventoryEntry.cs new file mode 100644 index 0000000..a5377aa --- /dev/null +++ b/Shared/Models/TblInventoryEntry.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.Models; + +public partial class TblInventoryEntry +{ + public string? Pcode { get; set; } + + public int? Quantity { get; set; } = 0; + + public DateTime? Date { get; set; } + + public string? BranchId { get; set; } + + public string CountId { get; set; } = null!; + + public DateTime LastModified { get; set; } +} diff --git a/Shared/Models/TblInvoice.cs b/Shared/Models/TblInvoice.cs new file mode 100644 index 0000000..677ff7e --- /dev/null +++ b/Shared/Models/TblInvoice.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.Models; + +public partial class TblInvoice +{ + public string? InvoiceId { get; set; } + + public string? Pcode { get; set; } + + public int? Quantity { get; set; } = 0; + + public decimal? Unitprice { get; set; } = 0; + + public string? Unit { get; set; } + + public decimal? Totalprice { get; set; } = 0; + + public DateTime? DateGenerated { get; set; } + + public string? Status { get; set; } + + public string? GeneratedBy { get; set; } + + public string? BranchId { get; set; } + + public string CountId { get; set; } = null!; + + public DateTime LastModified { get; set; } +} diff --git a/Shared/Models/TblPriceChange.cs b/Shared/Models/TblPriceChange.cs new file mode 100644 index 0000000..febb885 --- /dev/null +++ b/Shared/Models/TblPriceChange.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.Models; + +public partial class TblPriceChange +{ + public string? Pcode { get; set; } + + public decimal? PreviousPrice { get; set; } = 0; + + public decimal? CurrentPrice { get; set; } = 0; + + public DateTime? ChangeDate { get; set; } = new DateTime(2000,01,01); + + public string? BranchId { get; set; } + + public string CountId { get; set; } = null!; + + public DateTime LastModified { get; set; } +} diff --git a/Shared/Models/TblProduct.cs b/Shared/Models/TblProduct.cs new file mode 100644 index 0000000..691c8fa --- /dev/null +++ b/Shared/Models/TblProduct.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations.Schema; + +namespace Biskilog_Cloud.Shared.Models; + +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; } = 0; + + public decimal? Costprice { get; set; } = 0; + + public string? BaseUnit { get; set; } + public string? ProductName { get; set; } + + public string? BranchId { get; set; } + + public string? Status { get; set; } + + public string CountId { get; set; } = null!; + + public DateTime LastModified { get; set; } +} diff --git a/Shared/Models/TblTruck.cs b/Shared/Models/TblTruck.cs new file mode 100644 index 0000000..853841e --- /dev/null +++ b/Shared/Models/TblTruck.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.Models; + +public partial class TblTruck +{ + public string TruckId { get; set; } = null!; + + public string? LicensePlate { get; set; } + + public string? Brand { get; set; } + + public string? Driver { get; set; } + + public decimal? Weight { get; set; } + + public string? BranchId { get; set; } + + public DateTime LastModified { get; set; } +} diff --git a/Shared/Models/TblTruckAssignment.cs b/Shared/Models/TblTruckAssignment.cs new file mode 100644 index 0000000..68a591f --- /dev/null +++ b/Shared/Models/TblTruckAssignment.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.Models; + +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 DateTime LastModified { get; set; } +} diff --git a/Shared/Models/TblTruckDriverMapping.cs b/Shared/Models/TblTruckDriverMapping.cs new file mode 100644 index 0000000..0ce7bdd --- /dev/null +++ b/Shared/Models/TblTruckDriverMapping.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.Models; + +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 DateTime LastModified { get; set; } +} diff --git a/Shared/Models/TblTruckInventory.cs b/Shared/Models/TblTruckInventory.cs new file mode 100644 index 0000000..a451639 --- /dev/null +++ b/Shared/Models/TblTruckInventory.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.Models; + +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 DateTime LastModified { get; set; } +} diff --git a/Shared/Models/TblUser.cs b/Shared/Models/TblUser.cs new file mode 100644 index 0000000..4249de9 --- /dev/null +++ b/Shared/Models/TblUser.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.Models; + +public partial class TblUser +{ + public string Username { 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; } = string.Empty; + + public string? AccessLevel { get; set; } = string.Empty; + + public DateTime? LastLogin { get; set; } = new DateTime(2000, 01, 01); + + public string? BranchId { get; set; } = string.Empty; + + public DateTime LastModified { get; set; } +} diff --git a/Shared/Models/TblUserActivity.cs b/Shared/Models/TblUserActivity.cs new file mode 100644 index 0000000..cca58ff --- /dev/null +++ b/Shared/Models/TblUserActivity.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.Models; + +public partial class TblUserActivity +{ + public string Username { get; set; } = null!; + + public DateTime? LastActive { get; set; } + + public string? Workstation { get; set; } + + public DateTime LastModified { get; set; } +} diff --git a/Shared/Models/UnitOfMeasure.cs b/Shared/Models/UnitOfMeasure.cs new file mode 100644 index 0000000..938afc6 --- /dev/null +++ b/Shared/Models/UnitOfMeasure.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; + +namespace Biskilog_Cloud.Shared.Models; + +public partial class UnitOfMeasure +{ + public string UnitCode { get; set; } = null!; + + public string? Unitname { get; set; } + + public string? Unitshort { get; set; } + + public string? Status { get; set; } + + public string? BranchId { get; set; } + + public DateTime LastModified { get; set; } +} diff --git a/Shared/ServiceRepo/TokenService.cs b/Shared/ServiceRepo/TokenService.cs new file mode 100644 index 0000000..4ac8c7d --- /dev/null +++ b/Shared/ServiceRepo/TokenService.cs @@ -0,0 +1,239 @@ +using Biskilog_Cloud.Shared.ClientContractModels; +using Biskilog_Cloud.Shared.Enums; +using Biskilog_Cloud.Shared.Interfaces; +using Blazored.LocalStorage; +using Blazored.SessionStorage; +using Microsoft.Extensions.Configuration; +using Microsoft.IdentityModel.Tokens; +using System.IdentityModel.Tokens.Jwt; +using System.Security.Claims; +using System.Text; + +namespace Biskilog_Cloud.ServiceRepo +{ + public class TokenService : ITokenService + { + private IConfiguration m_configuration { get; } + private readonly ISessionStorageService m_sessionStorage; + private readonly ILocalStorageService m_localStorage; + public TokenService(IConfiguration a_configuration, ISessionStorageService a_sessionStorage = null, ILocalStorageService a_localStorage = null) + { + m_configuration = a_configuration; + m_sessionStorage = a_sessionStorage; + m_localStorage = a_localStorage; + } + + /// + /// Validates a user access token + /// + /// AuthEnums.Valid if token is a valid and unexpired token + 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) + { + Console.WriteLine(ex.Message); + return AuthEnums.Invalid; + } + } + /// + /// Generates an access token based on the user + /// + /// A tokenized string + public string GenerateToken(Userauth a_user, Contract a_clientContract, Databasemap a_database, List 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(); + } + } + /// + ///Deserializes the token string if valid to return the specified user role id in the token string + /// + /// + /// RoleId + 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; + } + /// + ///Deserializes the token string if valid to return the specified user id in the token string + /// + /// + /// UserId + 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; + } + /// + ///Deserializes the token string if valid to return the specified username in the token string + /// + /// + /// Username + 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; + } + /// + ///Deserializes the token string if valid to return the specified branchId in the token string + /// + /// + /// Username + 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; + } + /// + ///Deserializes the token string if valid to return the specified list of branches a user has access to in the token string + /// + /// + /// Username + 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; + } + /// + /// Return a specified list of branches a user has access if comparison mode is set otherwise returns only the + /// active branch on the list + /// + /// + /// + public IEnumerable BranchIds(string a_token) + { + List branchIds = new List(); + 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(); + } + + public async Task SetToken(string a_token, bool a_remember) + { + if (a_remember) + { + await m_localStorage.SetItemAsStringAsync("token", $"Bearer {a_token}"); + } + else + { + await m_sessionStorage.SetItemAsStringAsync("token", $"Bearer {a_token}"); + } + } + + public async Task GetToken() + { + string token = await m_localStorage.GetItemAsStringAsync("token"); + if (String.IsNullOrEmpty(token)) + { + token = await m_sessionStorage.GetItemAsStringAsync("token"); + } + return token; + } + + public async Task ClearToken() + { + await m_localStorage.ClearAsync(); + await m_sessionStorage.ClearAsync(); + } + + public async Task IsTokenSet() + { + return await m_localStorage.ContainKeyAsync("token") || await m_sessionStorage.ContainKeyAsync("token"); + } + } +} diff --git a/Shared/SharedClass.cs b/Shared/SharedClass.cs new file mode 100644 index 0000000..0d3a432 --- /dev/null +++ b/Shared/SharedClass.cs @@ -0,0 +1,4 @@ +/* Shared classes can be referenced by both the Client and Server */ +public class Shared +{ +} \ No newline at end of file