|
@@ -2,6 +2,8 @@
|
|
|
using System.Collections.Generic;
|
|
|
using System.Linq;
|
|
|
using System.Linq.Expressions;
|
|
|
+using System.Runtime.InteropServices;
|
|
|
+using InABox.Clients;
|
|
|
using InABox.Core;
|
|
|
|
|
|
namespace Comal.Classes
|
|
@@ -34,7 +36,22 @@ namespace Comal.Classes
|
|
|
};
|
|
|
|
|
|
public override Filter<PurchaseOrderItem>? Filter => new Filter<PurchaseOrderItem>(x => x.ReceivedDate).IsEqualTo(DateTime.MinValue);
|
|
|
- }
|
|
|
+ }
|
|
|
+
|
|
|
+ public class PurchaseOrderReceivedQtyAggregate : CoreAggregate<PurchaseOrder, PurchaseOrderItem, double>
|
|
|
+ {
|
|
|
+ public override Expression<Func<PurchaseOrderItem, double>> Aggregate => x => x.Qty;
|
|
|
+
|
|
|
+ public override AggregateCalculation Calculation => AggregateCalculation.Sum;
|
|
|
+
|
|
|
+ public override Dictionary<Expression<Func<PurchaseOrderItem, object?>>, Expression<Func<PurchaseOrder, object?>>> Links =>
|
|
|
+ new Dictionary<Expression<Func<PurchaseOrderItem, object?>>, Expression<Func<PurchaseOrder, object?>>>()
|
|
|
+ {
|
|
|
+ { PurchaseOrderItem => PurchaseOrderItem.PurchaseOrderLink.ID, PurchaseOrder => PurchaseOrder.ID }
|
|
|
+ };
|
|
|
+
|
|
|
+ public override Filter<PurchaseOrderItem>? Filter => new Filter<PurchaseOrderItem>(x => x.ReceivedDate).IsNotEqualTo(DateTime.MinValue);
|
|
|
+ }
|
|
|
|
|
|
public class PurchaseOrderExTax : CoreAggregate<PurchaseOrder, PurchaseOrderItem, double>
|
|
|
{
|
|
@@ -90,7 +107,7 @@ namespace Comal.Classes
|
|
|
|
|
|
[UserTracking(typeof(Bill))]
|
|
|
public class PurchaseOrder : Entity, IRemotable, IPersistent, IStringAutoIncrement<PurchaseOrder>, IOneToMany<Supplier>,
|
|
|
- ILicense<AccountsPayableLicense>, IDataEntryInstance, IPostable
|
|
|
+ ILicense<AccountsPayableLicense>, IDataEntryInstance, IPostable, IMergeable
|
|
|
{
|
|
|
private bool bChanging;
|
|
|
|
|
@@ -106,68 +123,83 @@ namespace Comal.Classes
|
|
|
[MemoEditor]
|
|
|
[EditorSequence(2)]
|
|
|
public string Description { get; set; }
|
|
|
-
|
|
|
- [NotesEditor]
|
|
|
- [EditorSequence("Notes",1)]
|
|
|
- public string[] Notes { get; set; }
|
|
|
|
|
|
[EditorSequence(3)]
|
|
|
public PurchaseOrderCategoryLink Category { get; set; }
|
|
|
-
|
|
|
- [DateTimeEditor]
|
|
|
+
|
|
|
[EditorSequence(4)]
|
|
|
- public DateTime IssuedDate { get; set; }
|
|
|
+ public EmployeeLink RaisedBy { get; set; }
|
|
|
|
|
|
[DateEditor]
|
|
|
[EditorSequence(5)]
|
|
|
public DateTime DueDate { get; set; }
|
|
|
|
|
|
- [EditorSequence("Additional",1)]
|
|
|
- public EmployeeLink RaisedBy { get; set; }
|
|
|
+ private class IssuedDateInformation : EditorInformation<PurchaseOrder>
|
|
|
+ {
|
|
|
+ public override string GetInfo(PurchaseOrder item) => item.IssuedBy.Name;
|
|
|
+ }
|
|
|
|
|
|
- [EditorSequence("Additional",2)]
|
|
|
- [TimestampEditor]
|
|
|
- public DateTime DataEntered { get; set; }
|
|
|
+ [DateTimeEditor(Information = typeof(IssuedDateInformation))]
|
|
|
+ [RequiredColumn,LoggableProperty]
|
|
|
+ [EditorSequence(6)]
|
|
|
+ public DateTime IssuedDate { get; set; }
|
|
|
|
|
|
- [EditorSequence("Additional",3)]
|
|
|
+ // This information might be printed out on the PO report, so we store this in the database
|
|
|
+ // Other properties uch as Closed/Cancelled/Checked etc are simply logged in the Audit Trail
|
|
|
+ [RequiredColumn]
|
|
|
+ [NullEditor]
|
|
|
public EmployeeLink IssuedBy { get; set; }
|
|
|
|
|
|
- [TimestampEditor]
|
|
|
- [EditorSequence("Additional",4)]
|
|
|
- public DateTime ClosedDate { get; set; }
|
|
|
-
|
|
|
- [TimestampEditor]
|
|
|
- [EditorSequence("Additional",5)]
|
|
|
- public DateTime CancelledDate { get; set; }
|
|
|
-
|
|
|
- [EditorSequence(10)]
|
|
|
[DoubleEditor(Editable = Editable.Hidden, Summary = Summary.Sum)]
|
|
|
[Aggregate(typeof(PurchaseOrderExTax))]
|
|
|
public double ExTax { get; set; }
|
|
|
-
|
|
|
- [EditorSequence(11)]
|
|
|
+
|
|
|
[DoubleEditor(Editable = Editable.Hidden, Summary = Summary.Sum)]
|
|
|
[Aggregate(typeof(PurchaseOrderTax))]
|
|
|
public double Tax { get; set; }
|
|
|
-
|
|
|
- [EditorSequence(12)]
|
|
|
+
|
|
|
[DoubleEditor(Editable = Editable.Hidden, Summary = Summary.Sum)]
|
|
|
[Aggregate(typeof(PurchaseOrderIncTax))]
|
|
|
public double IncTax { get; set; }
|
|
|
-
|
|
|
- [EditorSequence(13)]
|
|
|
+
|
|
|
[DoubleEditor(Editable = Editable.Hidden, Summary = Summary.Sum)]
|
|
|
[Aggregate(typeof(PurchaseOrderBalance))]
|
|
|
public double Balance { get; set; }
|
|
|
-
|
|
|
- [EditorSequence(13)]
|
|
|
+
|
|
|
+ [EditorSequence("Additional",2)]
|
|
|
+ [LoggableProperty]
|
|
|
+ [TimestampEditor]
|
|
|
+ public DateTime DataEntered { get; set; }
|
|
|
+
|
|
|
+ [EditorSequence("Additional",3)]
|
|
|
+ [TimestampEditor]
|
|
|
+ [LoggableProperty]
|
|
|
+ public DateTime CheckedDate { get; set; }
|
|
|
+
|
|
|
+ [RequiredColumn, LoggableProperty]
|
|
|
+ [TimestampEditor]
|
|
|
+ [EditorSequence("Additional",4)]
|
|
|
+ public DateTime ClosedDate { get; set; }
|
|
|
+
|
|
|
+ [TimestampEditor]
|
|
|
+ [LoggableProperty]
|
|
|
+ [EditorSequence("Additional",5)]
|
|
|
+ public DateTime CancelledDate { get; set; }
|
|
|
+
|
|
|
+ [NotesEditor]
|
|
|
+ [EditorSequence("Notes",1)]
|
|
|
+ public string[] Notes { get; set; }
|
|
|
+
|
|
|
+
|
|
|
[DoubleEditor(Editable = Editable.Hidden, Summary = Summary.Sum)]
|
|
|
[Aggregate(typeof(PurchaseOrderUnreceivedQtyAggregate))]
|
|
|
public double Unreceived { get; set; }
|
|
|
+
|
|
|
+ [DoubleEditor(Editable = Editable.Hidden, Summary = Summary.Sum)]
|
|
|
+ [Aggregate(typeof(PurchaseOrderReceivedQtyAggregate))]
|
|
|
+ public double Received { get; set; }
|
|
|
+
|
|
|
|
|
|
- [EditorSequence(14)]
|
|
|
- [EnumLookupEditor(typeof(PurchaseOrderStatus), Editable = Editable.Hidden)]
|
|
|
- public PurchaseOrderStatus Status { get; set; }
|
|
|
|
|
|
//[CodeEditor(Visible = Visible.Default, Editable = Editable.Hidden)]
|
|
|
[NullEditor]
|
|
@@ -195,7 +227,11 @@ namespace Comal.Classes
|
|
|
|
|
|
[NullEditor]
|
|
|
public string PostedReference { get; set; }
|
|
|
-
|
|
|
+
|
|
|
+ [Obsolete("Replaced by multiple Datetime stamps", true)]
|
|
|
+ [NullEditor]
|
|
|
+ public PurchaseOrderStatus Status { get; set; }
|
|
|
+
|
|
|
public Expression<Func<PurchaseOrder, string>> AutoIncrementField() => x => x.PONumber;
|
|
|
public Filter<PurchaseOrder> AutoIncrementFilter() => null;
|
|
|
public string AutoIncrementPrefix() => PONumberPrefix;
|
|
@@ -207,51 +243,17 @@ namespace Comal.Classes
|
|
|
if (bChanging)
|
|
|
return;
|
|
|
bChanging = true;
|
|
|
-
|
|
|
- if (name.Equals("Status"))
|
|
|
+ if (name.Equals(nameof(IssuedDate)) && before is DateTime _old && after is DateTime _new && _new.IsEmpty() != _old.IsEmpty())
|
|
|
{
|
|
|
- var status = (PurchaseOrderStatus)after;
|
|
|
- if (status.Equals(PurchaseOrderStatus.Closed))
|
|
|
- {
|
|
|
- if (ClosedDate == DateTime.MinValue)
|
|
|
- ClosedDate = DateTime.Now;
|
|
|
- if (IssuedDate == DateTime.MinValue)
|
|
|
- IssuedDate = DateTime.Now;
|
|
|
- }
|
|
|
- else if (status == PurchaseOrderStatus.Issued)
|
|
|
- {
|
|
|
- if (ClosedDate != DateTime.MinValue)
|
|
|
- ClosedDate = DateTime.MinValue;
|
|
|
- if (IssuedDate == DateTime.MinValue)
|
|
|
- IssuedDate = DateTime.Now;
|
|
|
- }
|
|
|
- else if(status == PurchaseOrderStatus.Cancelled)
|
|
|
- {
|
|
|
- CancelledDate = DateTime.Now;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- if (ClosedDate != DateTime.MinValue)
|
|
|
- ClosedDate = DateTime.MinValue;
|
|
|
- if (IssuedDate != DateTime.MinValue)
|
|
|
- IssuedDate = DateTime.MinValue;
|
|
|
- }
|
|
|
+ Employee? _emp = _new.IsEmpty()
|
|
|
+ ? new Employee()
|
|
|
+ : Client.Query<Employee>(
|
|
|
+ new Filter<Employee>(x => x.UserLink.ID).IsEqualTo(ClientFactory.UserGuid),
|
|
|
+ Columns.None<Employee>().Add(x => x.ID).Add(x => x.Name)
|
|
|
+ ).Rows.FirstOrDefault()?.ToObject<Employee>();
|
|
|
+ IssuedBy.ID = _emp.ID;
|
|
|
+ IssuedBy.Synchronise(_emp);
|
|
|
}
|
|
|
- else
|
|
|
- {
|
|
|
- var status = PurchaseOrderStatus.Closed;
|
|
|
- if (CancelledDate != DateTime.MinValue)
|
|
|
- status = PurchaseOrderStatus.Cancelled;
|
|
|
- else if (ClosedDate != DateTime.MinValue)
|
|
|
- status = PurchaseOrderStatus.Closed;
|
|
|
- else if (IssuedDate != DateTime.MinValue)
|
|
|
- status = PurchaseOrderStatus.Issued;
|
|
|
- else
|
|
|
- status = PurchaseOrderStatus.Draft;
|
|
|
- if (Status != status)
|
|
|
- Status = status;
|
|
|
- }
|
|
|
-
|
|
|
bChanging = false;
|
|
|
}
|
|
|
|