Преглед на файлове

Fixed default approval set handling in store

Kenric Nugteren преди 8 месеца
родител
ревизия
7ecaf623ce

+ 3 - 3
prs.classes/Entities/Bill/Approvals/BillApprovalSetEmployee.cs

@@ -7,7 +7,7 @@ namespace Comal.Classes
 {
     public class BillApprovalSetEmployee : Entity, IRemotable, IPersistent, IManyToMany<BillApprovalSet, Employee>, ISequenceable, ILicense<AccountsPayableLicense>
     {
-        public BillApprovalSetLink BillType { get; set; }
+        public BillApprovalSetLink ApprovalSet { get; set; }
 
         public EmployeeLink Employee { get; set; }
 
@@ -16,8 +16,8 @@ namespace Comal.Classes
 
         static BillApprovalSetEmployee()
         {
-            DefaultColumns.Add<BillApprovalSetEmployee>(x => x.BillType.Code);
-            DefaultColumns.Add<BillApprovalSetEmployee>(x => x.BillType.Description);
+            DefaultColumns.Add<BillApprovalSetEmployee>(x => x.ApprovalSet.Code);
+            DefaultColumns.Add<BillApprovalSetEmployee>(x => x.ApprovalSet.Description);
             DefaultColumns.Add<BillApprovalSetEmployee>(x => x.Employee.Code);
             DefaultColumns.Add<BillApprovalSetEmployee>(x => x.Employee.Name);
         }

+ 57 - 0
prs.desktop/Panels/Suppliers/Bills/BillApprovalSetGrid.cs

@@ -0,0 +1,57 @@
+using Comal.Classes;
+using InABox.Core;
+using InABox.DynamicGrid;
+using InABox.WPF;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Media.Imaging;
+
+namespace PRSDesktop.Panels.Suppliers.Bills;
+
+public class BillApprovalSetGrid : DynamicDataGrid<BillApprovalSet>
+{
+    private static readonly BitmapImage _tick = InABox.Wpf.Resources.tick.AsBitmapImage();
+
+    protected override void Init()
+    {
+        base.Init();
+
+        HiddenColumns.Add(x => x.IsDefault);
+
+        ActionColumns.Add(new DynamicTickColumn<BillApprovalSet, bool>(x => x.IsDefault, _tick, _tick, null, Tick_Click)
+        {
+            ToolTip = (c, r) => c.TextToolTip(r is null
+                ? "Default?"
+                : (r.Get<BillApprovalSet, bool>(x => x.IsDefault) ? "This is the default approval set" : "This is not the default approval set."))
+        });
+    }
+
+    private bool Tick_Click(CoreRow? row)
+    {
+        if (row is null) return false;
+
+        var isDefault = row.Get<BillApprovalSet, bool>(x => x.IsDefault);
+        if (isDefault) return false;
+
+        var id = row.Get<BillApprovalSet, bool>(x => x.IsDefault);
+
+        var toSave = new List<BillApprovalSet>();
+
+        var defaultRow = Data.Rows.FirstOrDefault(x => x.Get<BillApprovalSet, bool>(x => x.IsDefault));
+        if(defaultRow is not null)
+        {
+            var defaultSet = LoadItem(defaultRow);
+            defaultSet.IsDefault = false;
+            toSave.Add(defaultSet);
+        }
+
+        var thisSet = LoadItem(row);
+        thisSet.IsDefault = true;
+        toSave.Add(thisSet);
+        SaveItems(toSave);
+        return true;
+    }
+}

+ 1 - 0
prs.desktop/Panels/Suppliers/Bills/SupplierBillPanel.xaml.cs

@@ -315,6 +315,7 @@ public partial class SupplierBillPanel : UserControl, IPanel<Bill>, IPropertiesP
                 SaveApproval();
                 if(_editRows is not null && _bills is not null)
                 {
+                    _bills = Bills.LoadBills(_editRows);
                     Bills.UpdateRows(_editRows, _bills);
                 }
                 ReloadBills();

+ 11 - 8
prs.desktop/Panels/Suppliers/Bills/SupplierBills.cs

@@ -75,7 +75,7 @@ namespace PRSDesktop
             var bill = row.ToObject<Bill>();
 
             if(MultiSelectDialog<BillApprovalSet>.SelectItem(
-                out var billType,
+                out var approvalSet,
                 filter: new Filter<BillApprovalSet>(x => x.ID).IsNotEqualTo(bill.ApprovalSet.ID),
                 columns: Columns.None<BillApprovalSet>().Add(x => x.ID),
                 title: "Select Approval Set:"))
@@ -84,7 +84,7 @@ namespace PRSDesktop
                 if(bill.ApprovalSet.ID != Guid.Empty)
                 {
                     oldEmployees = Client.Query(
-                        new Filter<BillApprovalSetEmployee>(x => x.BillType.ID).IsEqualTo(bill.ApprovalSet.ID),
+                        new Filter<BillApprovalSetEmployee>(x => x.ApprovalSet.ID).IsEqualTo(bill.ApprovalSet.ID),
                         Columns.None<BillApprovalSetEmployee>().Add(x => x.Employee.ID),
                         new SortOrder<BillApprovalSetEmployee>(x => x.Sequence))
                         .ToArray<BillApprovalSetEmployee>();
@@ -95,7 +95,7 @@ namespace PRSDesktop
                 }
 
                 var newEmployees = Client.Query(
-                    new Filter<BillApprovalSetEmployee>(x => x.BillType.ID).IsEqualTo(billType.ID),
+                    new Filter<BillApprovalSetEmployee>(x => x.ApprovalSet.ID).IsEqualTo(approvalSet.ID),
                     Columns.None<BillApprovalSetEmployee>().Add(x => x.Employee.ID),
                     new SortOrder<BillApprovalSetEmployee>(x => x.Sequence))
                     .ToArray<BillApprovalSetEmployee>();
@@ -114,10 +114,13 @@ namespace PRSDesktop
                 var toSave = new List<BillApproval>();
                 foreach(var employee in newEmployees)
                 {
-                    var newApproval = new BillApproval();
-                    newApproval.Employee.CopyFrom(employee.Employee);
-                    newApproval.Bill.CopyFrom(bill);
-                    toSave.Add(newApproval);
+                    if(!approvals.Any(x => x.Employee.ID == employee.Employee.ID))
+                    {
+                        var newApproval = new BillApproval();
+                        newApproval.Employee.CopyFrom(employee.Employee);
+                        newApproval.Bill.CopyFrom(bill);
+                        toSave.Add(newApproval);
+                    }
                 }
                 foreach(var approval in approvals)
                 {
@@ -139,7 +142,7 @@ namespace PRSDesktop
                 Client.Delete(toDelete, "Deleted by changing approval set.");
                 Client.Save(toSave, "Updated when changing approval set.");
 
-                bill.ApprovalSet.CopyFrom(billType);
+                bill.ApprovalSet.CopyFrom(approvalSet);
                 SaveItem(bill);
                 Refresh(false, true);
             }

+ 32 - 0
prs.stores/BillStore.cs

@@ -56,6 +56,19 @@ internal class BillStore : BaseStore<Bill>
             }
         }
         UpdateBillApprovals(entity);
+
+        if (entity.ID == Guid.Empty)
+        {
+            var defaultApprovalSet = Provider.Query<BillApprovalSet>(
+                new Filter<BillApprovalSet>(x => x.IsDefault).IsEqualTo(true),
+                Columns.None<BillApprovalSet>().Add(x => x.ID))
+                .ToObjects<BillApprovalSet>().FirstOrDefault();
+            if (defaultApprovalSet is not null)
+            {
+                entity.ApprovalSet.ID = defaultApprovalSet.ID;
+            }
+        }
+
         //UpdateAggregate<Supplier>(entity, entity.SupplierLink, Sum<Supplier>(b => b.Balance, s => s.Balance));
     }
 
@@ -102,6 +115,25 @@ internal class BillStore : BaseStore<Bill>
         }
     }
 
+    protected override void AfterSave(Bill entity)
+    {
+        base.AfterSave(entity);
+
+        if(entity.HasOriginalValue(x => x.ID) && entity.ApprovalSet.ID != Guid.Empty)
+        {
+            var employees = Provider.Query<BillApprovalSetEmployee>(
+                new Filter<BillApprovalSetEmployee>(x => x.ApprovalSet.ID).IsEqualTo(entity.ApprovalSet.ID),
+                Columns.None<BillApprovalSetEmployee>().Add(x => x.Employee.ID));
+            Provider.Save(employees.ToObjects<BillApprovalSetEmployee>().Select(x =>
+            {
+                var approval = new BillApproval();
+                approval.Bill.CopyFrom(entity);
+                approval.Employee.CopyFrom(x.Employee);
+                return approval;
+            }));
+        }
+    }
+
     protected override void BeforeDelete(Bill entity)
     {
         base.BeforeDelete(entity);