Browse Source

Streamlined approval process with cancelling and updating and syncrhonising with approval grid

Kenric Nugteren 8 tháng trước cách đây
mục cha
commit
24523e570d

+ 28 - 0
prs.desktop/Panels/Suppliers/Bills/SupplierBillApprovalGrid.cs

@@ -1,4 +1,5 @@
 using Comal.Classes;
+using InABox.Core;
 using InABox.DynamicGrid;
 using System;
 using System.Collections.Generic;
@@ -10,8 +11,35 @@ namespace PRSDesktop;
 
 public class SupplierBillApprovalGrid : DynamicOneToManyGrid<Bill, BillApproval>
 {
+    public override bool Visible => Security.IsAllowed<ManageBillApprovals>();
+
     public SupplierBillApprovalGrid()
     {
         HiddenColumns.Add(x => x.Employee.ID);
     }
+
+    protected override void DoReconfigure(DynamicGridOptions options)
+    {
+        base.DoReconfigure(options);
+
+        options.AddRows = !ReadOnly && Security.IsAllowed<ManageBillApprovals>();
+        options.EditRows = !ReadOnly && Security.IsAllowed<ManageBillApprovals>();
+        options.DeleteRows = !ReadOnly && Security.IsAllowed<ManageBillApprovals>();
+    }
+
+    protected override void DoAdd(bool openEditorOnDirectEdit = false)
+    {
+        if (MultiSelectDialog<Employee>.SelectItem(out var employee,
+            LookupFactory.DefineLookupFilter<BillApproval, Employee, EmployeeLink>(x => x.Employee, []),
+            LookupFactory.DefineLookupColumns<BillApproval, Employee, EmployeeLink>(x => x.Employee),
+            "Select Bill Approval Employee:"))
+        {
+            CreateItems(() =>
+            {
+                var approval = CreateItem();
+                approval.Employee.CopyFrom(employee);
+                return CoreUtils.One(approval);
+            });
+        }
+    }
 }

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

@@ -124,6 +124,7 @@ public partial class SupplierBillEditLayout : DynamicEditorGridLayout, INotifyPr
         }
 
         Editors.SelectedIndex = 0;
+        OtherPages.SelectedIndex = 0;
     }
 
     private bool bChanging;

+ 49 - 22
prs.desktop/Panels/Suppliers/Bills/SupplierBillPanel.xaml.cs

@@ -140,18 +140,31 @@ public partial class SupplierBillPanel : UserControl, IPanel<Bill>, IPropertiesP
         {
             _approval.Approved = DateTime.Now;
             EditLayout.IsApproved = true;
-            _approvalPage?.SaveItem(_approval);
-            _approvalPage?.Refresh(false, true);
-            _approvalPage?.DoChanged();
         }
         else
         {
             _approval.Approved = DateTime.MinValue;
             EditLayout.IsApproved = false;
-            _approvalPage?.SaveItem(_approval);
-            _approvalPage?.Refresh(false, true);
-            _approvalPage?.DoChanged();
         }
+        Bill.DoChanged();
+
+        if(_approvalPage is not null)
+        {
+            _approvalPage.SaveItem(_approval);
+            _approvalPage.Refresh(false, true);
+            _approvalPage.DoChanged();
+        }
+    }
+
+    private void SaveApproval()
+    {
+        if (_approvalPage is not null || _approval is null) return;
+        Client.Save(_approval, "Approval updated by user.");
+    }
+
+    private void CancelApproval()
+    {
+        UpdateApproval();
     }
 
     private void UpdateApproval()
@@ -161,25 +174,31 @@ public partial class SupplierBillPanel : UserControl, IPanel<Bill>, IPropertiesP
             if(Bill.Pages.TryGetPage<DynamicOneToManyGrid<Bill, BillApproval>>(out _approvalPage))
             {
                 _approval = _approvalPage.Items.FirstOrDefault(x => x.Employee.ID == App.EmployeeID);
-                    
-                EditLayout.CanApprove = _approval is not null;
-                EditLayout.IsApproved = _approval is not null ? _approval.Approved != DateTime.MinValue : false;
-
-                if(Bill.Pages.TryGetPage(out _billLinePage))
-                {
-                    _billLinePage.OnChanged += BillLinePage_OnChanged;
-
-                    EditLayout.BillAmount = _billLinePage.Items.Sum(x => x.IncTax);
-                    EditLayout.POAmount = _billLinePage.Items.Sum(x =>
-                    {
-                        return x.OrderItem.IncTax + x.Consignment.IncTax;
-                    });
-                }
+                _approvalPage.OnChanged -= _approvalPage_OnChanged;
+                _approvalPage.OnChanged += _approvalPage_OnChanged;
             }
             else
             {
-                _approval = null;
-                EditLayout.CanApprove = false;
+                _approval = Client.Query<BillApproval>(
+                    new Filter<BillApproval>(x => x.Employee.ID).IsEqualTo(App.EmployeeID)
+                        .And(x => x.Bill.ID).IsEqualTo(_bills[0].ID),
+                    Columns.Required<BillApproval>().Add(x => x.Approved))
+                    .ToObjects<BillApproval>().FirstOrDefault();
+            }
+
+            EditLayout.CanApprove = _approval is not null;
+            EditLayout.IsApproved = _approval is not null ? _approval.Approved != DateTime.MinValue : false;
+
+            if(Bill.Pages.TryGetPage(out _billLinePage))
+            {
+                _billLinePage.OnChanged -= BillLinePage_OnChanged;
+                _billLinePage.OnChanged += BillLinePage_OnChanged;
+
+                EditLayout.BillAmount = _billLinePage.Items.Sum(x => x.IncTax);
+                EditLayout.POAmount = _billLinePage.Items.Sum(x =>
+                {
+                    return x.OrderItem.IncTax + x.Consignment.IncTax;
+                });
             }
         }
         else
@@ -189,6 +208,12 @@ public partial class SupplierBillPanel : UserControl, IPanel<Bill>, IPropertiesP
         }
     }
 
+    private void _approvalPage_OnChanged(object? sender, EventArgs e)
+    {
+        EditLayout.CanApprove = _approval is not null;
+        EditLayout.IsApproved = _approval is not null ? _approval.Approved != DateTime.MinValue : false;
+    }
+
     private void BillLinePage_OnChanged(object? sender, EventArgs e)
     {
         if (_billLinePage is null) return;
@@ -287,6 +312,7 @@ public partial class SupplierBillPanel : UserControl, IPanel<Bill>, IPropertiesP
             Bill.SaveItem(cancel);
             if (!cancel.Cancel)
             {
+                SaveApproval();
                 if(_editRows is not null && _bills is not null)
                 {
                     Bills.UpdateRows(_editRows, _bills);
@@ -299,6 +325,7 @@ public partial class SupplierBillPanel : UserControl, IPanel<Bill>, IPropertiesP
 
     private void Bill_OnOnCancel()
     {
+        CancelApproval();
         ReloadBills();
         SetChanged(false);
     }