using DevExpress.ExpressApp.ConditionalAppearance; using DevExpress.ExpressApp.Model; using DevExpress.Persistent.Base; using DevExpress.Persistent.BaseImpl; using DevExpress.Persistent.Validation; using DevExpress.Xpo; using FileSystemData.BusinessObjects; using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Linq; using System.Runtime.Serialization; using System.Text; namespace DurnyklyYol.Module.BusinessObjects { [DefaultClassOptions, NavigationItem("Clients & Goods")] [ImageName("BO_Product")] [DefaultProperty(nameof(No))] [Appearance("RedBackground", Priority =1, AppearanceItemType = "ViewItem", TargetItems = "Credit", Criteria = "Credit > 0", BackColor = "Red", FontColor = "White")] [Appearance("StrikeBackground", Priority = 2, AppearanceItemType = "ViewItem", TargetItems = "Credit", Criteria = "Credit = 0", BackColor = "Green",FontColor = "White")] //[DefaultListViewOptions(MasterDetailMode.ListViewOnly, false, NewItemRowPosition.None)] //[Persistent("DatabaseTableName")] // Specify more UI options using a declarative approach (https://documentation.devexpress.com/#eXpressAppFramework/CustomDocument112701). public class Goods : BaseObject { // Inherit from a different class to provide a custom primary key, concurrency and deletion behavior, etc. (https://documentation.devexpress.com/eXpressAppFramework/CustomDocument113146.aspx). // Use CodeRush to create XPO classes and properties with a few keystrokes. // https://docs.devexpress.com/CodeRushForRoslyn/118557 public Goods(Session session) : base(session) { } protected override void OnSaving() { base.OnSaving(); if (Session is not NestedUnitOfWork && (Session.DataLayer != null) && Session.IsNewObject(this) && (Session.ObjectLayer is SimpleObjectLayer) //OR //&& !(Session.ObjectLayer is DevExpress.ExpressApp.Security.ClientServer.SecuredSessionObjectLayer) && string.IsNullOrEmpty(No)) { int nextSequence = DistributedIdGeneratorHelper.Generate(Session.DataLayer, this.GetType().FullName, "ERPrefix"); No = string.Format("PA-{0:D6}", nextSequence); } } public override void AfterConstruction() { base.AfterConstruction(); State = GoodsState.Reserved; CreatedAt = DateTime.Now; } [Size(SizeAttribute.DefaultStringMappingFieldSize), NonCloneable, Indexed(Unique = true), ReadOnly(true), VisibleInDetailView(false)] public string No { get => no; set => SetPropertyValue(nameof(No), ref no, value); } [Index(1), VisibleInLookupListView(true)] [Size(SizeAttribute.DefaultStringMappingFieldSize), RuleRequiredField(DefaultContexts.Save)] public string Name { get => name; set => SetPropertyValue(nameof(Name), ref name, value); } [VisibleInDetailView(false)] [ModelDefault("DisplayFormat", "{0:g}"), ModelDefault("EditMask", "g")] public DateTime CreatedAt { get => createdAt; set => SetPropertyValue(nameof(CreatedAt), ref createdAt, value); } [RuleValueComparison(ValueComparisonType.GreaterThan, 0), Index(2)] public uint PlaceCount { get => placeCount; set => SetPropertyValue(nameof(PlaceCount), ref placeCount, value); } [RuleValueComparison(ValueComparisonType.GreaterThan, 0), Index(3)] public uint PackageCount { get => packageCount; set => SetPropertyValue(nameof(PackageCount), ref packageCount, value); } [ModelDefault("DisplayFormat", "{0:#,##0.00 }"), ModelDefault("EditMask", "############,##0.00")] [ImmediatePostData, Index(4), RuleValueComparison(ValueComparisonType.GreaterThan, 0)] public decimal Volume { get => volume; set => SetPropertyValue(nameof(Volume), ref volume, value); } [ModelDefault("DisplayFormat", "${0:#,##0.00}"), ModelDefault("EditMask", "$############,##0.00"), Index(5)] public decimal Price { get => price; set => SetPropertyValue(nameof(Price), ref price, value); } [PersistentAlias("Price * Volume"), ModelDefault("DisplayFormat", "${0:#,##0.00 }"), Index(6)] public decimal TotalPrice => Convert.ToDecimal(EvaluateAlias(nameof(TotalPrice))); [Index(7)] [Aggregated, ExpandObjectMembers(ExpandObjectMembers.Never), ImmediatePostData, VisibleInListView(false)] public FileSystemStoreObject Image1 { get { return GetPropertyValue("Image1"); } set { SetPropertyValue("Image1", value); } } [Index(9)] [Aggregated, ExpandObjectMembers(ExpandObjectMembers.Never), ImmediatePostData, VisibleInListView(false)] public FileSystemStoreObject Image2 { get { return GetPropertyValue("Image2"); } set { SetPropertyValue("Image2", value); } } [Size(SizeAttribute.DefaultStringMappingFieldSize), Index(10)] public string ShopNo { get => shopNo; set => SetPropertyValue(nameof(ShopNo), ref shopNo, value); } [Index(11)] public Warehouse ReceivedPoint { get => receivedPoint; set => SetPropertyValue(nameof(ReceivedPoint), ref receivedPoint, value); } [Index(12)] public DateTime? ReceivedAt { get => receivedAt; set => SetPropertyValue(nameof(ReceivedAt), ref receivedAt, value); } [Index(13)] public Warehouse DestinationPoint { get => destinationPoint; set => SetPropertyValue(nameof(DestinationPoint), ref destinationPoint, value); } [Index(14), VisibleInListView(false)] public DateTime? DeliveredAt { get => deliveredAt; set => SetPropertyValue(nameof(DeliveredAt), ref deliveredAt, value); } [Index(15), VisibleInListView(false)] [Size(SizeAttribute.DefaultStringMappingFieldSize)] public string Note { get => note; set => SetPropertyValue(nameof(Note), ref note, value); } [Association("Goods-Payments"), Aggregated] public XPCollection Payments { get { return GetCollection(nameof(Payments)); } } [Index(0), VisibleInLookupListView(true), VisibleInDetailView(true), IgnoreDataMember] [Association("Client-Goods"), RuleRequiredField(DefaultContexts.Save)] public Client Client { get => client; set => SetPropertyValue(nameof(Client), ref client, value); } [VisibleInDetailView(false)] [ModelDefault("DisplayFormat", "${0:#,##0.00}")] public decimal TotalPayment => Payments.Sum(ps => ps.Amount); [VisibleInDetailView(false)] [ModelDefault("DisplayFormat", "${0:#,##0.00}")] public decimal Credit => TotalPrice - TotalPayment; public GoodsState State { get => state; set => SetPropertyValue(nameof(State), ref state, value); } string note; DateTime? deliveredAt; Warehouse destinationPoint; Warehouse receivedPoint; string shopNo; DateTime createdAt; GoodsState state; uint packageCount; DateTime? receivedAt; decimal price; uint placeCount; decimal volume; string name; string no; Client client; Cargo cargo; [Association("Cargo-Goods")] public Cargo Cargo { get => cargo; set => SetPropertyValue(nameof(Cargo), ref cargo, value); } } public enum GoodsState { Reserved, Received, Delivered, } }