Kaynağa Gözat

Fix to DailyReport Activity code mandate; adding saving of credit card details into encrypted settings and improved license system, updating to point at PRS digital web engine

Kenric Nugteren 2 yıl önce
ebeveyn
işleme
0c80c6b6c6

+ 1 - 1
prs.classes/Schedule.cs

@@ -171,7 +171,7 @@ namespace Comal.Classes
         {
             try
             {
-                return CoreUtils.GetEntity(DocumentClass);
+                return CoreUtils.GetEntityOrNull(DocumentClass);
             }
             catch
             {

+ 1 - 1
prs.desktop/Forms/AssignmentView2.xaml.cs

@@ -640,7 +640,7 @@ namespace PRSDesktop
         {
             
             var filter = new Filter<Assignment>(x => x.Date).IsGreaterThanOrEqualTo(SelectedDate.Date)
-                .And(x => x.Date).IsLessThanOrEqualTo(SelectedDate.Date.AddDays(1))
+                .And(x => x.Date).IsLessThan(SelectedDate.Date.AddDays(1))
                 .And(x =>x.EmployeeLink.ID).InList(SelectedEmployees);
             
             _assignments = new Client<Assignment>().Query(

+ 4 - 2
prs.desktop/Panels/Notifications/NotificationUtils.cs

@@ -105,9 +105,11 @@ namespace PRSDesktop
                 return null;
 
             if (!IsDigitalForm(name))
-                return CoreUtils.GetEntity(name);
+                return CoreUtils.GetEntityOrNull(name);
 
-            var form = CoreUtils.GetEntity(name);
+            var form = CoreUtils.GetEntityOrNull(name);
+            if (form is null)
+                return null;
             var parent = CoreUtils.GetProperty(form, "Parent");
             var type = parent.PropertyType.GetInheritedGenericTypeArguments().FirstOrDefault();
             return type;

+ 1 - 8
prs.scheduler/SchedulePluginFactory.cs

@@ -20,15 +20,8 @@ namespace Comal.TaskScheduler.Shared
             if (cache.ContainsKey(scheduleclass))
                 return cache[scheduleclass];
 
-            Type type;
-            try
-            {
-                type = CoreUtils.GetEntity(scheduleclass);
-            }
-            catch
-            {
+            if (!CoreUtils.TryGetEntity(scheduleclass, out var type))
                 return null;
-            }
 
             Type defType = typeof(SchedulePlugin<>).MakeGenericType(type);
             Type? subType = CoreUtils.TypeList(

+ 1 - 0
prs.server/App.xaml.cs

@@ -96,6 +96,7 @@ namespace PRSServer
                 if (args.Length > 1 && args[1].StartsWith("/service=")) serviceName = args[1].Split('=').Last();
 
                 ServiceBase.Run(new PRSService(serviceName, this));
+                Shutdown(0);
             }
         }
 

+ 3 - 1
prs.server/Engines/Database/DatabaseEngine.cs

@@ -4,7 +4,7 @@ using System.Collections.Generic;
 using System.IO;
 using System.Linq;
 using System.Security.Cryptography.X509Certificates;
-using System.Threading.Tasks;
+using System.Threading;
 using System.Timers;
 using Comal.Classes;
 using Comal.Stores;
@@ -21,6 +21,7 @@ using InABox.Reports;
 using InABox.Server;
 using Piping;
 using PRS.Shared;
+using Timer = System.Timers.Timer;
 
 namespace PRSServer
 {
@@ -162,6 +163,7 @@ namespace PRSServer
             DbFactory.Logo = Properties.Logo;
 
             var deviceid = DeviceID.Value(Properties.Port.ToString(), null);
+
             DbFactory.Start(deviceid);
 
             UserStore.PasswordExpirationTime = TimeSpan.FromDays(Properties.PasswordExpiryTime);

+ 1 - 0
prs.server/Engines/Engine.cs

@@ -1,6 +1,7 @@
 using System;
 using System.IO;
 using System.Reflection;
+using System.Threading;
 using InABox.Logging;
 
 namespace PRSServer

+ 6 - 0
prs.server/Engines/GPS/GPSEngine.cs

@@ -221,6 +221,12 @@ namespace PRSServer
                 Logger.Send(LogType.Error, "", "Server is blank!");
                 return;
             }
+
+            Logger.Send(LogType.Information, "", "Registering Classes");
+
+            CoreUtils.RegisterClasses();
+            ComalUtils.RegisterClasses();
+
             ClientFactory.SetClientType(typeof(PipeIPCClient<>), "GPSServer", Version, DatabaseServerProperties.GetPipeName(Properties.Server));
             CheckConnection();
 

+ 25 - 22
prs.server/Engines/WebEngine/WebUtils.cs

@@ -1800,31 +1800,34 @@ for(let addTaskField of addTaskFields){
                     }
                     else if (element is DFLayoutLookupField)
                     {
-                        var type = CoreUtils.GetEntity((element as DFLayoutLookupField).Properties.LookupType);
-                        var table = ClientFactory.CreateClient(type).Query(
-                            LookupFactory.DefineFilter(type),
-                            LookupFactory.DefineColumns(type),
-                            LookupFactory.DefineSort(type)
-                        );
+                        var type = CoreUtils.GetEntityOrNull((element as DFLayoutLookupField).Properties.LookupType);
+                        if(type is not null)
+                        {
+                            var table = ClientFactory.CreateClient(type).Query(
+                                LookupFactory.DefineFilter(type),
+                                LookupFactory.DefineColumns(type),
+                                LookupFactory.DefineSort(type)
+                            );
 
-                        data.TryGetValue(fieldElement.Name + "$ID", out var fieldID);
-                        data.TryGetValue(fieldElement.Name, out var fieldFormat);
+                            data.TryGetValue(fieldElement.Name + "$ID", out var fieldID);
+                            data.TryGetValue(fieldElement.Name, out var fieldFormat);
 
-                        var options = table.Rows.Select(x => new Tuple<string, string?>(
-                            LookupFactory.FormatLookup(type, x.ToDictionary(new[] { "ID" }), Array.Empty<string>()),
-                            x["ID"].ToString())).ToList();
-                        fieldFormat ??= options.Where(x => x.Item2 == fieldID?.ToString()).FirstOrDefault()?.Item1;
+                            var options = table.Rows.Select(x => new Tuple<string, string?>(
+                                LookupFactory.FormatLookup(type, x.ToDictionary(new[] { "ID" }), Array.Empty<string>()),
+                                x["ID"].ToString())).ToList();
+                            fieldFormat ??= options.Where(x => x.Item2 == fieldID?.ToString()).FirstOrDefault()?.Item1;
 
-                        tagType = null;
-                        stringBuilder.Append(BuildLookupField(
-                            options,
-                            fieldFormat?.ToString(),
-                            style,
-                            "prs-web_utils-digital_form-lookup prs-web_utils-digital_form-field",
-                            fieldReadOnly,
-                            required,
-                            fieldElement.Name
-                        ));
+                            tagType = null;
+                            stringBuilder.Append(BuildLookupField(
+                                options,
+                                fieldFormat?.ToString(),
+                                style,
+                                "prs-web_utils-digital_form-lookup prs-web_utils-digital_form-field",
+                                fieldReadOnly,
+                                required,
+                                fieldElement.Name
+                            ));
+                        }
                     }
                     else if (element is DFLayoutMultiImage)
                     {

+ 1 - 1
prs.server/Forms/Console/Console.xaml.cs

@@ -195,7 +195,7 @@ namespace PRSServer
                 RefreshTimer?.Stop();
             }
             else
-                _service.Halt();
+                _service?.Halt();
         }
 
         private void Search_KeyDown(object sender, KeyEventArgs e)

+ 13 - 0
prs.server/Forms/DatabaseLicense/CreditCardDetails.cs

@@ -1,4 +1,5 @@
 using System;
+using InABox.Configuration;
 using InABox.Core;
 
 namespace PRSServer.Forms.DatabaseLicense
@@ -60,4 +61,16 @@ namespace PRSServer.Forms.DatabaseLicense
         [EditorSequence(6)]
         public bool SaveDetails { get; set; }
     }
+
+    public class CreditCardSettings : BaseObject, LocalConfigurationSettings
+    {
+        public string CardNumber { get; set; } = "";
+
+        public string Month { get; set; } = "";
+
+        public string Year { get; set; } = "";
+
+        public string Cvv { get; set; } = "";
+    }
+
 }

+ 114 - 49
prs.server/Forms/DatabaseLicense/LicenseRenewalForm.xaml.cs

@@ -26,17 +26,70 @@ using System.Drawing;
 using Image = System.Windows.Controls.Image;
 using System.Diagnostics;
 using Twilio.Rest.Api.V2010.Account;
+using InABox.Configuration;
+using RazorEngine.Compilation.ImpromptuInterface;
 
 namespace PRSServer.Forms.DatabaseLicense
 {
     public class CreditCardGrid : DynamicGrid<CreditCardDetails>
     {
-
-
+        private static readonly EncryptedLocalConfiguration<CreditCardSettings> DetailsConfiguration = new("g6+BoQpyti5bHsTZOY5Nbqq3Q3c90n0m3qZaQ3eAwkk=");
         
         protected override void Reload(Filters<CreditCardDetails> criteria, Columns<CreditCardDetails> columns, ref SortOrder<CreditCardDetails>? sort, Action<CoreTable, Exception> action)
         {
-            
+        }
+        
+        private static CreditCardDetails LoadSaved()
+        {
+            var settings = DetailsConfiguration.Load();
+            var details = new CreditCardDetails
+            {
+                CardNumber = settings.CardNumber,
+                Month = settings.Month,
+                Year = settings.Year,
+                Cvv = settings.Cvv,
+                // If the card number is not blank, it means we loaded from a saved file, and therefore the default should be to still save details
+                SaveDetails = !string.IsNullOrWhiteSpace(settings.CardNumber)
+            };
+            return details;
+        }
+        private static void SaveDetails(CreditCardDetails details)
+        {
+            var settings = new CreditCardSettings
+            {
+                CardNumber = details.CardNumber,
+                Month = details.Month,
+                Year = details.Year,
+                Cvv = details.Cvv
+            };
+            DetailsConfiguration.Save(settings);
+        }
+        private static void ClearDetails()
+        {
+            DetailsConfiguration.Delete();
+        }
+
+        public static bool DoPayment(double amount, [NotNullWhen(true)] out string? transactionID)
+        {
+            var details = LoadSaved();
+            details.Amount = amount;
+
+            var grid = new CreditCardGrid();
+            if (grid.EditItems(new[] { details }))
+            {
+                if (details.SaveDetails)
+                {
+                    SaveDetails(details);
+                }
+                else
+                {
+                    ClearDetails();
+                }
+                transactionID = grid.TransactionID;
+                return true;
+            }
+            transactionID = null;
+            return false;
         }
 
         protected override CreditCardDetails LoadItem(CoreRow row)
@@ -44,7 +97,7 @@ namespace PRSServer.Forms.DatabaseLicense
             return new CreditCardDetails();
         }
 
-        public string TransactionID = "";
+        private string TransactionID = "";
 
         protected override void DoValidate(CreditCardDetails[] items, List<string> errors)
         {
@@ -68,12 +121,12 @@ namespace PRSServer.Forms.DatabaseLicense
             {
                 try
                 {
-                    StripeConfiguration.ApiKey = "sk_test_51Lc39sA3OFNLFxjFvH2PYwCpl9DNhkIoce3rskpTXOvoxiFQUIgtYg1MRWrPUIx14lcs9oG4pFVco9UvRSxen0mT00P8AisayJ";
+                    StripeConfiguration.ApiKey = "sk_test_51MRSuPIyPMVqmkXN8TeGxDAGBeFx0pLzn3fsHBR8X1oMBKQVwGPEbuv6DNIu0qSmuflpmFfQ4N8c3vzdknKa7G0o00wTOXwCeW";
                     var cardoptions = new TokenCreateOptions()
                     {
                         Card = new TokenCardOptions()
                         {
-                            Number = item.CardNumber,
+                            Number = item.CardNumber.Replace(" ", ""),
                             ExpMonth = item.Month,
                             ExpYear = item.Year,
                             Cvc = item.Cvv
@@ -102,8 +155,8 @@ namespace PRSServer.Forms.DatabaseLicense
                     error = $"{ex.Message}";
                 }
             });
-            //if (!String.IsNullOrWhiteSpace(error))
-            //    throw new Exception(error);
+            if (!String.IsNullOrWhiteSpace(error))
+                throw new Exception(error);
         }
 
         protected override void DeleteItems(params CoreRow[] rows)
@@ -261,6 +314,13 @@ namespace PRSServer.Forms.DatabaseLicense
 
         private void Window_Loaded(object sender, RoutedEventArgs e)
         {
+            if (!LicenseTrackingItemGrid.LicenseClient.Ping("ping"))
+            {
+                MessageBox.Show("The PRS server is not available right now. Please try again later.");
+                Close();
+                return;
+            }
+
             Modules.Refresh(true, false);
 
             var license = LoadCurrentLicense();
@@ -279,6 +339,9 @@ namespace PRSServer.Forms.DatabaseLicense
         {
             if (CurrentLicense == null) return;
 
+            var lookups = new RenewalPeriodLookups(null).AsTable("RenewalPeriod");
+            RenewalPeriodEditor.LoadLookups(lookups);
+
             RenewalPeriod = LicenseUtils.TimeDiscountLevels().OrderBy(x => x).First();
             PayWithStripe.IsEnabled = CanRenew;
             if (!PayWithStripe.IsEnabled)
@@ -331,6 +394,7 @@ namespace PRSServer.Forms.DatabaseLicense
             GrossLicenseFee.Value = Gross;
             DiscountEditor.Value = Discount;
             NettLicenseFee.Value = Net;
+            PayWithStripe.IsEnabled = CanRenew && Net > 0;
         }
 
         private class RenewalPeriodLookups : LookupGenerator<object>
@@ -370,7 +434,7 @@ namespace PRSServer.Forms.DatabaseLicense
 
         private void PayNowClick(object sender, RoutedEventArgs e)
         {
-            if (!Client.Ping())
+            if (!LicenseTrackingItemGrid.LicenseClient.Ping("ping"))
             {
                 MessageBox.Show("The PRS server is not available right now. Please try again later.");
                 return;
@@ -395,56 +459,57 @@ namespace PRSServer.Forms.DatabaseLicense
                 return;
             }
 
-            var ccdetails = new CreditCardDetails()
+            if (!CreditCardGrid.DoPayment(Net, out var transactionID))
+                return;
+
+            /*var grid = new CreditCardGrid();
+            var ccDetails = grid.LoadSaved();
+            ccDetails.Amount = Net;
+            if (grid.EditItems(new CreditCardDetails[] { ccDetails }))
             {
-                Amount = Net
+                var transactionID = grid.TransactionID;*/
+            var licenseRenewal = new LicenseRenewal
+            {
+                Company = companyInformation,
+                DateRenewed = RenewalDate,
+                OldLicense = CurrentLicense,
+                NewExpiry = NewExpiration,
+                LicenseTracking = Modules.Data.Rows.Select(x => x.ToObject<LicenseTrackingItem>()).ToArray(),
+                Gross = Gross,
+                Discount = Discount,
+                Net = Net,
+                TransactionID = transactionID
             };
-            var grid = new CreditCardGrid();
-            if (grid.EditItems(new CreditCardDetails[] { ccdetails }))
+            string? error = null;
+            License? license = null;
+            Progress.ShowModal("Payment success, renewing license", progress =>
             {
-                var transactionID = grid.TransactionID;
-                var licenseRenewal = new LicenseRenewal
+                try
                 {
-                    Company = companyInformation,
-                    DateRenewed = RenewalDate,
-                    OldLicense = CurrentLicense,
-                    NewExpiry = NewExpiration,
-                    LicenseTracking = Modules.Data.Rows.Select(x => x.ToObject<LicenseTrackingItem>()).ToArray(),
-                    Gross = Gross,
-                    Discount = Discount,
-                    Net = Net,
-                    TransactionID = transactionID
-                };
-                string? error = null;
-                License? license = null;
-                Progress.ShowModal("Payment success, renewing license", progress =>
+                    license = GetNewLicense(licenseRenewal);
+                    SaveLicense(license);
+                }
+                catch(Exception e)
                 {
-                    try
-                    {
-                        license = GetNewLicense(licenseRenewal);
-                        SaveLicense(license);
-                    }
-                    catch(Exception e)
-                    {
-                        error = $"There was an error retrieving your new license:\n\n{e.Message}\n\nPlease contact the PRS team, and keep your transaction ID for future reference. Your transaction ID is '{transactionID}'";
-                    }
-                });
-                if(error != null)
+                    error = $"There was an error retrieving your new license:\n\n{e.Message}\n\nPlease contact the PRS team, and keep your transaction ID for future reference. Your transaction ID is '{transactionID}'";
+                }
+            });
+            if(error != null)
+            {
+                MessageBox.Show(error);
+            }
+            else
+            {
+                MessageBox.Show("License Renewed!");
+
+                if(!LicenseUtils.TryDecryptLicense(license.Data, out var licenseData, out error))
                 {
                     MessageBox.Show(error);
                 }
-                else
-                {
-                    MessageBox.Show("License Renewed!");
 
-                    if(!LicenseUtils.TryDecryptLicense(license.Data, out var licenseData, out error))
-                    {
-                        MessageBox.Show(error);
-                    }
-
-                    CurrentLicense = licenseData ?? new LicenseData();
-                }
+                CurrentLicense = licenseData ?? new LicenseData();
             }
+            //}
         }
 
         private void OK_Click(object sender, RoutedEventArgs e)

+ 2 - 1
prs.server/Forms/DatabaseLicense/LicenseTrackingItemGrid.cs

@@ -2,6 +2,7 @@
 using System.Collections.Generic;
 using System.Linq;
 using System.Threading.Tasks;
+using System.Windows;
 using InABox.Client.Remote.Json;
 using InABox.Clients;
 using InABox.Core;
@@ -12,7 +13,7 @@ namespace PRSServer.Forms.DatabaseLicense
 {
     public class LicenseTrackingItemGrid : DynamicGrid<LicenseTrackingItem>
     {
-        public static HttpJsonClient LicenseClient = new("https", "prs-software.com.au", 7998);
+        public static HttpJsonClient LicenseClient = new("https", "remote.prsdigital.com.au", 5000);
 
         public LicenseTrackingItemGrid()
         {

+ 1 - 2
prs.server/Forms/ServerGrid.cs

@@ -999,9 +999,8 @@ namespace PRSServer
                 x => selectedrow.Get<Server, string>(x => x.Key),
                 () =>
                 {
-                    MessageBox.Show("Unimplemented!");
-                    return;
                     //new LicenseRenewalForm().ShowDialog();
+                    MessageBox.Show("Not yet implemented.");
                 }
             );
             return false;

+ 14 - 2
prs.server/Services/PRSService.cs

@@ -6,6 +6,7 @@ using System.Management;
 using System.Reflection;
 using System.ServiceProcess;
 using System.Threading;
+using System.Threading.Tasks;
 using InABox.Configuration;
 using InABox.Core;
 using InABox.Logging;
@@ -20,6 +21,7 @@ namespace PRSServer
         private string _servicename;
 
         private Thread? _thread;
+        //private CancellationTokenSource Source = new();
 
         // TODO: Is this necessary?
         private App app;
@@ -121,6 +123,12 @@ namespace PRSServer
                     _engine.ServiceName = svcname;
                     _engine.Version = CoreUtils.GetVersion();
                     _engine.Configure(server);
+
+                    /*_task = Task.Run(() =>
+                    {
+                        _engine.Run();
+                    }, Source.Token);*/
+
                     _thread = new Thread(() => { _engine.Run(); });
                     _thread.IsBackground = true;
                     _thread.Start();
@@ -131,8 +139,9 @@ namespace PRSServer
         protected override void OnStop()
         {
             Logger.Send(LogType.Information, "", "Shutting down Service: " + _servicename);
+
             _engine?.Stop();
-            var timer = new Timer { Interval = 1000 };
+            /*var timer = new Timer { Interval = 1000 };
             timer.Elapsed += (o, e) =>
             {
                 try
@@ -147,7 +156,10 @@ namespace PRSServer
                 }
             };
             timer.AutoReset = false;
-            timer.Enabled = true;
+            timer.Enabled = true;*/
+
+            Logger.Send(LogType.Information, "", "Terminating Process..");
+            MainLogger.Stop();
         }
     }
 }