|
@@ -1,44 +1,16 @@
|
|
|
-using Comal.Classes;
|
|
|
+using com.sun.org.glassfish.external.statistics;
|
|
|
+using Comal.Classes;
|
|
|
using InABox.Configuration;
|
|
|
using InABox.Core;
|
|
|
using InABox.Database.Stores;
|
|
|
using InABox.Scripting;
|
|
|
+using PRSStores;
|
|
|
using System;
|
|
|
|
|
|
namespace Comal.Stores;
|
|
|
|
|
|
internal class BillStore : BaseStore<Bill>
|
|
|
{
|
|
|
- private static ScriptDocument? _billApprovalScriptDocument;
|
|
|
- private static string? _billApprovalScript;
|
|
|
- public static string? BillApprovalScript
|
|
|
- {
|
|
|
- set
|
|
|
- {
|
|
|
- _billApprovalScript = value;
|
|
|
- if(!value.IsNullOrWhiteSpace())
|
|
|
- {
|
|
|
- _billApprovalScriptDocument = new ScriptDocument(value);
|
|
|
- if (!_billApprovalScriptDocument.Compile())
|
|
|
- {
|
|
|
- InABox.Core.Logger.Send(LogType.Error, "", $"Bill Approval Script failed to compile: {_billApprovalScriptDocument.Result}");
|
|
|
- _billApprovalScriptDocument = null;
|
|
|
- }
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- _billApprovalScriptDocument = null;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- public override void Init()
|
|
|
- {
|
|
|
- base.Init();
|
|
|
-
|
|
|
- GlobalSettingsStore.RegisterSubStore<BillApprovalSettings, BillApprovalSettingsStore>();
|
|
|
- }
|
|
|
-
|
|
|
protected override void BeforeSave(Bill entity)
|
|
|
{
|
|
|
base.BeforeSave(entity);
|
|
@@ -55,7 +27,6 @@ internal class BillStore : BaseStore<Bill>
|
|
|
throw new DuplicateCodeException(typeof(Bill), new Dictionary<string, object> {{ nameof(Bill.Number), entity.Number }});
|
|
|
}
|
|
|
}
|
|
|
- UpdateBillApprovals(entity);
|
|
|
|
|
|
if (entity.ID == Guid.Empty)
|
|
|
{
|
|
@@ -74,40 +45,77 @@ internal class BillStore : BaseStore<Bill>
|
|
|
|
|
|
private void UpdateBillApprovals(Bill bill)
|
|
|
{
|
|
|
- if (bill.ID == Guid.Empty || _billApprovalScriptDocument is null) return;
|
|
|
+ if (bill.ID == Guid.Empty || bill.ApprovalSet.ID == Guid.Empty) return;
|
|
|
|
|
|
+ var setEmployees = Provider.Query(
|
|
|
+ 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>();
|
|
|
var approvals = Provider.Query(
|
|
|
new Filter<BillApproval>(x => x.Bill.ID).IsEqualTo(bill.ID),
|
|
|
- Columns.Required<BillApproval>())
|
|
|
+ Columns.Required<BillApproval>().Add(x => x.Employee.ID).Add(x => x.IsCustom).Add(x => x.Approved))
|
|
|
.ToList<BillApproval>();
|
|
|
+
|
|
|
try
|
|
|
{
|
|
|
- var oldList = approvals.ToList();
|
|
|
- if(_billApprovalScriptDocument.Execute(methodname: BillApprovalSettings.UpdateBillApprovalsMethodName, parameters: [bill, approvals]))
|
|
|
+ var customApprovals = new List<BillApproval>();
|
|
|
+ foreach(var approval in approvals)
|
|
|
{
|
|
|
- var newApprovals = new List<BillApproval>();
|
|
|
- var removedApprovals = new List<BillApproval>();
|
|
|
- foreach(var approval in approvals)
|
|
|
+ if (approval.IsCustom)
|
|
|
{
|
|
|
- if (!oldList.Contains(approval))
|
|
|
- {
|
|
|
- newApprovals.Add(approval);
|
|
|
- }
|
|
|
+ customApprovals.Add(approval);
|
|
|
}
|
|
|
- foreach(var approval in oldList)
|
|
|
+ else
|
|
|
{
|
|
|
- if (!approvals.Contains(approval))
|
|
|
+ if(approval.Approved != DateTime.MinValue)
|
|
|
{
|
|
|
- removedApprovals.Add(approval);
|
|
|
+ // These really are custom approvals for our purposes, since they've been modified.
|
|
|
+ customApprovals.Add(approval);
|
|
|
}
|
|
|
}
|
|
|
- foreach(var approval in newApprovals)
|
|
|
+ }
|
|
|
+
|
|
|
+ // Build up the automatic list.
|
|
|
+ var autoApprovals = new List<BillApproval>();
|
|
|
+ foreach(var employee in setEmployees)
|
|
|
+ {
|
|
|
+ var approval = new BillApproval();
|
|
|
+ approval.Employee.CopyFrom(employee.Employee);
|
|
|
+ approval.IsCustom = false;
|
|
|
+ autoApprovals.Add(approval);
|
|
|
+ }
|
|
|
+ if(BillApprovalSetStore.GetUpdateApprovalsScript(bill.ApprovalSet.ID) is ScriptDocument script)
|
|
|
+ {
|
|
|
+ script.Execute(methodname: BillApprovalSet.UpdateBillApprovalsMethodName, parameters: [bill, autoApprovals]);
|
|
|
+ }
|
|
|
+
|
|
|
+ // Now, we have to merge the custom and auto lists, only saving auto approvals if there are no custom ones for that employee.
|
|
|
+ var toAdd = new List<BillApproval>();
|
|
|
+ var toRemove = new List<BillApproval>();
|
|
|
+
|
|
|
+ var newList = customApprovals.ToList();
|
|
|
+ foreach(var approval in autoApprovals)
|
|
|
+ {
|
|
|
+ newList.Add(approval);
|
|
|
+ if (!approvals.Any(x => x.Employee.ID == approval.Employee.ID))
|
|
|
+ {
|
|
|
+ toAdd.Add(approval);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ foreach(var approval in approvals)
|
|
|
+ {
|
|
|
+ if (!newList.Any(x => x.Employee.ID == approval.Employee.ID))
|
|
|
{
|
|
|
- approval.Bill.ID = bill.ID;
|
|
|
+ toRemove.Add(approval);
|
|
|
}
|
|
|
- Provider.Save(newApprovals);
|
|
|
- Provider.Delete(removedApprovals, UserID);
|
|
|
}
|
|
|
+ foreach(var approval in toAdd)
|
|
|
+ {
|
|
|
+ approval.Bill.ID = bill.ID;
|
|
|
+ }
|
|
|
+ Provider.Save(toAdd);
|
|
|
+ Provider.Delete(toRemove, UserID);
|
|
|
}
|
|
|
catch(Exception e)
|
|
|
{
|
|
@@ -119,19 +127,7 @@ internal class BillStore : BaseStore<Bill>
|
|
|
{
|
|
|
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;
|
|
|
- }));
|
|
|
- }
|
|
|
+ UpdateBillApprovals(entity);
|
|
|
}
|
|
|
|
|
|
protected override void BeforeDelete(Bill entity)
|
|
@@ -141,25 +137,4 @@ internal class BillStore : BaseStore<Bill>
|
|
|
entity.SupplierLink.ID = Guid.Empty;
|
|
|
//UpdateAggregate<Supplier>(entity, entity.SupplierLink, Sum<Supplier>(b => b.Balance, s => s.Balance));
|
|
|
}
|
|
|
-}
|
|
|
-
|
|
|
-internal class BillApprovalSettingsStore : ISettingsStoreEventHandler<BillApprovalSettings>
|
|
|
-{
|
|
|
- public void BeforeSave(BillApprovalSettings entity)
|
|
|
- {
|
|
|
- }
|
|
|
- public void AfterSave(BillApprovalSettings entity)
|
|
|
- {
|
|
|
- ConfigurationCache.Add(ConfigurationCacheType.Global, "", entity);
|
|
|
- BillStore.BillApprovalScript = entity.ApprovalSetUpdateScript;
|
|
|
- }
|
|
|
-
|
|
|
- public void BeforeDelete(BillApprovalSettings entity)
|
|
|
- {
|
|
|
- }
|
|
|
- public void AfterDelete(BillApprovalSettings entity)
|
|
|
- {
|
|
|
- ConfigurationCache.Clear<BillApprovalSettings>(ConfigurationCacheType.Global, "");
|
|
|
- BillStore.BillApprovalScript = null;
|
|
|
- }
|
|
|
}
|