using System; using BS.Shared; using BeWo.Core; using BS.Shared.DataContracts; namespace BeWo.ViewModel { public class InvoiceItemVM : AbstractDCMapperVM { #region Constants and Fields public static string PropertyName_AmountPerUnit = "AmountPerUnit"; public static string PropertyName_AmountTotal = "AmountTotal"; public static string PropertyName_GrossAmountTotal = "GrossAmountTotal"; public static string PropertyName_ItemDescription = "ItemDescription"; public static string PropertyName_ItemPeriodEnd = "ItemPeriodEnd"; public static string PropertyName_ItemPeriodStart = "ItemPeriodStart"; public static string PropertyName_RateFactor = "RateFactor"; public static string PropertyName_UnitCount = "UnitCount"; public static string PropertyName_UnitDescription = "UnitDescription"; public static string PropertyName_AccountingInterval = "AccountingInterval"; public static string PropertyName_ReceivedAmount = "ReceivedAmount"; public static string PropertyName_MaxApprovedUnitCount = "MaxApprovedUnitCount"; public static string PropertyName_ApprovedPerUnit = "ApprovedPerUnit"; public static string PropertyName_ApprovalUnit = "ApprovalUnit"; public static string PropertyName_MaxApprovedAmount = "MaxApprovedAmount"; public static string PropertyName_Notice = "Notice"; private decimal? _AmountPerUnit; private decimal? _AmountTotal; private decimal? _GrossAmountTotal; private decimal _ReceivedAmount; private decimal? _MaxApprovedAmount; private decimal? _MaxApprovedUnitCount; private decimal? _ApprovedPerUnit; private AccountingIntervalType? _ApprovalUnit; private string _ItemDescription; private DateTime? _ItemPeriodEnd; private DateTime? _ItemPeriodStart; private decimal? _RateFactor; private decimal _UnitCount; private string _UnitDescription; private string _Notice; private AccountingIntervalType? _AccountingInterval; #endregion #region Constructors and Destructors public InvoiceItemVM(InvoiceItemDC pDC) : base(pDC, pDC.InvoiceItemOid == null) {} #endregion #region Properties public AccountingIntervalType? AccountingInterval { get { return this._AccountingInterval; } set { if (this.AreDifferent(this._AccountingInterval, value)) { this._AccountingInterval = value; this.StoreDirtyInformation(this.AreDifferent(this.DataContract.AccountingInterval, value), PropertyName_AccountingInterval); this.FirePropertyChanged(PropertyName_AccountingInterval); } } } public decimal? AmountPerUnit { get { return this._AmountPerUnit; } set { if (this.AreDifferent(this._AmountPerUnit, value)) { this._AmountPerUnit = value; if (this._AmountPerUnit != null) { this.AmountTotal = this._AmountPerUnit.Value * this.UnitCount; } else { this.AmountTotal = 0; } this.StoreDirtyInformation(this.AreDifferent(this.DataContract.AmountPerUnit, value), PropertyName_AmountPerUnit); this.FirePropertyChanged(PropertyName_AmountPerUnit); } } } public decimal? AmountTotal { get { return this._AmountTotal; } set { if (this.AreDifferent(this._AmountTotal, value)) { this._AmountTotal = value; this.StoreDirtyInformation(this.AreDifferent(this.DataContract.AmountTotal, value), PropertyName_AmountTotal); this.FirePropertyChanged(PropertyName_AmountTotal); } } } public decimal? GrossAmountTotal { get { return this._GrossAmountTotal; } set { if (this.AreDifferent(this._GrossAmountTotal, value)) { this._GrossAmountTotal = value; this.StoreDirtyInformation(this.AreDifferent(this.DataContract.GrossAmountTotal, value), PropertyName_GrossAmountTotal); this.FirePropertyChanged(PropertyName_GrossAmountTotal); } } } public decimal GrossAmountTotalUntilMax { get { decimal amount = GrossAmountTotal ?? 0; if (MaxApprovedAmount.HasValue && MaxApprovedAmount.Value > 0 && amount > MaxApprovedAmount.Value) amount = MaxApprovedAmount.Value; return amount; } } public decimal ReceivedAmount { get { return this._ReceivedAmount; } set { if (this.AreDifferent(this._ReceivedAmount, value)) { this._ReceivedAmount = value; this.StoreDirtyInformation(this.AreDifferent(this.DataContract.ReceivedAmount, value), PropertyName_ReceivedAmount); this.FirePropertyChanged(PropertyName_ReceivedAmount); } } } public decimal? MaxApprovedAmount { get { return this._MaxApprovedAmount; } set { if (this.AreDifferent(this._MaxApprovedAmount, value)) { this._MaxApprovedAmount = value; this.StoreDirtyInformation(this.AreDifferent(this.DataContract.MaxApprovedAmount, value), PropertyName_MaxApprovedAmount); this.FirePropertyChanged(PropertyName_MaxApprovedAmount); } } } public decimal? MaxApprovedUnitCount { get { return this._MaxApprovedUnitCount; } set { if (this.AreDifferent(this._MaxApprovedUnitCount, value)) { this._MaxApprovedUnitCount = value; this.StoreDirtyInformation(this.AreDifferent(this.DataContract.MaxApprovedUnitCount, value), PropertyName_MaxApprovedUnitCount); this.FirePropertyChanged(PropertyName_MaxApprovedUnitCount); } } } public decimal? ApprovedPerUnit { get { return this._ApprovedPerUnit; } set { if (this.AreDifferent(this._ApprovedPerUnit, value)) { this._ApprovedPerUnit = value; this.StoreDirtyInformation(this.AreDifferent(this.DataContract.ApprovedPerUnit, value), PropertyName_ApprovedPerUnit); this.FirePropertyChanged(PropertyName_ApprovedPerUnit); } } } public AccountingIntervalType? ApprovalUnit { get { return this._ApprovalUnit; } set { if (this.AreDifferent(this._ApprovalUnit, value)) { this._ApprovalUnit = value; this.StoreDirtyInformation(this.AreDifferent(this.DataContract.ApprovalUnit, value), PropertyName_ApprovalUnit); this.FirePropertyChanged(PropertyName_ApprovalUnit); } } } public string ItemDescription { get { return this._ItemDescription; } set { if (this.AreDifferent(this._ItemDescription, value)) { this._ItemDescription = value; this.StoreDirtyInformation(this.AreDifferent(this.DataContract.ItemDescription, value), PropertyName_ItemDescription); this.FirePropertyChanged(PropertyName_ItemDescription); } } } public string Notice { get { return this._Notice; } set { if (this.AreDifferent(this._Notice, value)) { this._Notice = value; this.StoreDirtyInformation(this.AreDifferent(this.DataContract.Notice, value), PropertyName_Notice); this.FirePropertyChanged(PropertyName_Notice); } } } public DateTime? ItemPeriodEnd { get { return this._ItemPeriodEnd; } set { if (this.AreDifferent(this._ItemPeriodEnd, value)) { this._ItemPeriodEnd = value; this.StoreDirtyInformation(this.AreDifferent(this.DataContract.ItemPeriodEnd, value), PropertyName_ItemPeriodEnd); this.FirePropertyChanged(PropertyName_ItemPeriodEnd); } } } public DateTime? ItemPeriodStart { get { return this._ItemPeriodStart; } set { if (this.AreDifferent(this._ItemPeriodStart, value)) { this._ItemPeriodStart = value; this.StoreDirtyInformation(this.AreDifferent(this.DataContract.ItemPeriodStart, value), PropertyName_ItemPeriodStart); this.FirePropertyChanged(PropertyName_ItemPeriodStart); } } } public decimal? RateFactor { get { return this._RateFactor; } set { if (this.AreDifferent(this._RateFactor, value)) { this._RateFactor = value; this.StoreDirtyInformation(this.AreDifferent(this.DataContract.RateFactor, value), PropertyName_RateFactor); this.FirePropertyChanged(PropertyName_RateFactor); } } } public decimal UnitCount { get { return BeWoWpfUtils.GetDecimalValueWithMaxDecimal(this._UnitCount, -1) ?? 0m; } set { if (this.AreDifferent(this._UnitCount, value)) { this._UnitCount = value; if (this.AmountPerUnit != null) { this.AmountTotal = this.AmountPerUnit.Value * this.UnitCount; } else { this.AmountTotal = 0; } this.StoreDirtyInformation(this.AreDifferent(this.DataContract.UnitCount, value), PropertyName_UnitCount); this.FirePropertyChanged(PropertyName_UnitCount); } } } public decimal UnitCountUntilMax { get { decimal count = UnitCount; if (MaxApprovedUnitCount.HasValue && count > MaxApprovedUnitCount.Value) count = MaxApprovedUnitCount.Value; return Math.Round(count, 2, MidpointRounding.AwayFromZero); } } public string UnitDescription { get { return this._UnitDescription; } set { if (this.AreDifferent(this._UnitDescription, value)) { this._UnitDescription = value; this.StoreDirtyInformation(this.AreDifferent(this.DataContract.UnitDescription, value), PropertyName_UnitDescription); this.FirePropertyChanged(PropertyName_UnitDescription); } } } #endregion #region Methods protected override void InitByDataContract(InvoiceItemDC pDataContract) { this._AmountTotal = pDataContract.AmountTotal; this._AmountPerUnit = pDataContract.AmountPerUnit; this._UnitDescription = pDataContract.UnitDescription; this._UnitCount = pDataContract.UnitCount ?? 0m; this._ItemDescription = pDataContract.ItemDescription; this._ItemPeriodEnd = pDataContract.ItemPeriodEnd; this._ItemPeriodStart = pDataContract.ItemPeriodStart; this._GrossAmountTotal = pDataContract.GrossAmountTotal; this._RateFactor = pDataContract.RateFactor; this._AccountingInterval = pDataContract.AccountingInterval; this._ReceivedAmount = pDataContract.ReceivedAmount; this._MaxApprovedUnitCount = pDataContract.MaxApprovedUnitCount; this._ApprovedPerUnit = pDataContract.ApprovedPerUnit; this.ApprovalUnit = pDataContract.ApprovalUnit; this._MaxApprovedAmount = pDataContract.MaxApprovedAmount; this._Notice = pDataContract.Notice; } protected override InvoiceItemDC MapToDataContract(InvoiceItemDC pDataContract, bool doCommit) { pDataContract.AmountTotal = this._AmountTotal; pDataContract.AmountPerUnit = this._AmountPerUnit; pDataContract.UnitDescription = this._UnitDescription; pDataContract.UnitCount = this._UnitCount; pDataContract.ItemDescription = this._ItemDescription; pDataContract.ItemPeriodEnd = this._ItemPeriodEnd; pDataContract.ItemPeriodStart = this._ItemPeriodStart; pDataContract.RateFactor = this._RateFactor; pDataContract.GrossAmountTotal = this._GrossAmountTotal; pDataContract.AccountingInterval = this._AccountingInterval; pDataContract.ReceivedAmount = this._ReceivedAmount; pDataContract.MaxApprovedAmount = this._MaxApprovedAmount; pDataContract.MaxApprovedUnitCount = this._MaxApprovedUnitCount; pDataContract.ApprovedPerUnit = this._ApprovedPerUnit; pDataContract.ApprovalUnit = this._ApprovalUnit; pDataContract.Notice = this._Notice; return pDataContract; } #endregion } }