Files
Common-VS2019/SacsBusinessBase/Base/ReferenceData/SaTaxCode.cs
T

348 lines
11 KiB
C#

using System;
using System.Collections.Generic;
using Sarand.Net.Standard.Base.Core;
using Sarand.Net.Standard.Base.Bus;
using Sarand.Net.Standard.Base.Utils;
using System.Text.RegularExpressions;
namespace Sarand.Net.Standard.Base.ReferenceData
{
//=======================================================================
public abstract class SaTaxCode : SacsHierarchyItem
{
//-------------------------------------------------------------------
// Columns.
public enum Column
{
Hidden,
Pos,
Id,
// TaxCode.
Code,
CodeAlt1,
CodeAlt2,
Description,
RegionId,
EffectFrom,
EffectTo,
TaxRate,
TaxRatePrev,
TaxCodeIdLink,
// Common properties.
Notes,
Status,
Status_Desc,
Status_Ind,
CreateOn_Date,
UpdateOn_Date,
}
//-------------------------------------------------------------------
/// <summary>Properties other than common.</summary>
public class DataProperties
{
public String Code { get; set; } = "";
public String CodeAlt1 { get; set; } = "";
public String CodeAlt2 { get; set; } = "";
public String Description { get; set; } = "";
public SysId RegionId { get; set; } = new SysId();
public DateTime EffectFrom { get; set; } = DateTime.MinValue;
public DateTime EffectTo { get; set; } = DateTime.MinValue;
public decimal TaxRate { get; set; } = 0.0m;
public decimal TaxRatePrev { get; set; } = 0.0m;
public SysId TaxCodeIdLink { get; set; } = new SysId();
}
//-------------------------------------------------------------------
// Data.
public new class Data : SacsHierarchyItem.Data
{
// Data members.
private readonly DataProperties data = new DataProperties();
// Construction.
public Data()
{
Status = DefaultStatus;
}
// Properties.
public String Code
{
get { return data.Code; }
set { CheckChanged(data.Code, value); data.Code = value; }
}
public String CodeAlt1
{
get { return data.CodeAlt1; }
set { CheckChanged(data.CodeAlt1, value); data.CodeAlt1 = value; }
}
public String CodeAlt2
{
get { return data.CodeAlt2; }
set { CheckChanged(data.CodeAlt2, value); data.CodeAlt2 = value; }
}
public String Description
{
get { return data.Description; }
set { CheckChanged(data.Description, value); data.Description = value; }
}
public SysId RegionId
{
get { return data.RegionId; }
set { CheckChanged(data.RegionId, value); data.RegionId = value; }
}
public DateTime EffectFrom
{
get { return data.EffectFrom; }
set { CheckChanged(data.EffectFrom, value); data.EffectFrom = value; }
}
public DateTime EffectTo
{
get { return data.EffectTo; }
set { CheckChanged(data.EffectTo, value); data.EffectTo = value; }
}
public decimal TaxRate
{
get { return data.TaxRate; }
set { CheckChanged(data.TaxRate, value); data.TaxRate = value; }
}
public decimal TaxRatePrev
{
get { return data.TaxRatePrev; }
set { CheckChanged(data.TaxRatePrev, value); data.TaxRatePrev = value; }
}
public SysId TaxCodeIdLink
{
get { return data.TaxCodeIdLink; }
set { CheckChanged(data.TaxCodeIdLink, value); data.TaxCodeIdLink = value; }
}
internal void PopulateFrom(Data data)
{
Code = data.Code;
CodeAlt1 = data.CodeAlt1;
CodeAlt2 = data.CodeAlt2;
Description = data.Description;
RegionId = data.RegionId;
EffectFrom = data.EffectFrom;
EffectTo = data.EffectTo;
TaxRate = data.TaxRate;
TaxRatePrev = data.TaxRatePrev;
TaxCodeIdLink = data.TaxCodeIdLink;
base.PopulateFrom(data);
}
public Data Clone()
{
Data data = new Data();
data.PopulateFrom(this);
return data;
}
}
//-------------------------------------------------------------------
public new class ErrField : SacsHierarchyItem.ErrField
{
// Identifies the field that has invalid data.
public ValidValue Code { get; set; } = ValidValue.Valid;
public ValidValue CodeAlt1 { get; set; } = ValidValue.Valid;
public ValidValue CodeAlt2 { get; set; } = ValidValue.Valid;
public ValidValue Description { get; set; } = ValidValue.Valid;
public ValidValue RegionId { get; set; } = ValidValue.Valid;
public ValidValue EffectFrom { get; set; } = ValidValue.Valid;
public ValidValue EffectTo { get; set; } = ValidValue.Valid;
public ValidValue TaxRate { get; set; } = ValidValue.Valid;
public ValidValue TaxRatePrev { get; set; } = ValidValue.Valid;
public ValidValue TaxCodeIdLink { get; set; } = ValidValue.Valid;
}
//-------------------------------------------------------------------
// Data members.
private readonly Data data = new Data();
//-------------------------------------------------------------------
// Construction.
protected SaTaxCode(SysId id) : base(id)
{
base.SetData(data);
}
//-------------------------------------------------------------------
// Statuses.
private static readonly List<SaStatus> validStatuses = new List<SaStatus>()
{
SaStatus.Current
};
public static SaStatus DefaultStatus { get { return SaStatus.Current; } }
public static List<SaStatus> ValidStatuses { get { return new List<SaStatus>(validStatuses); } }
public static DataValue.TriStateType GetStatusTriState(SaStatus status)
{
switch (status)
{
case SaStatus.Current:
return DataValue.TriStateType.Green;
case SaStatus.Deleted:
return DataValue.TriStateType.Purple;
}
return DataValue.TriStateType.Unknown;
}
//-------------------------------------------------------------------
// Utilities.
public String GetCaption()
{
DateTime today = DateTime.Today;
String caption = $"{Code} (";
if (!StringUtil.IsBlank(CodeAlt1) && !CodeAlt1.EqualsCI(Code))
caption += $"{CodeAlt1}: ";
caption += $"{Regex.Replace(TaxRate.ToString("N2"), @"\.0+$", "")}%)";
if (DateUtil.IsValid(EffectFrom) || DateUtil.IsValid(EffectTo))
{
String effectiveFrom = (DateUtil.IsValid(EffectFrom) ? (EffectFrom.Year == today.Year ? EffectFrom.ToString("d-MMM") : EffectFrom.ToString("d-MMM-yy")) : "");
String effectiveTo = (DateUtil.IsValid(EffectTo) ? (EffectTo.Year == today.Year ? EffectTo.ToString("d-MMM") : EffectTo.ToString("d-MMM-yy")) : "");
caption += $" [{effectiveFrom}->{effectiveTo}]";
}
return caption;
}
public bool IsEffectiveOn(DateTime effectiveDate)
{
if (DateUtil.IsValid(EffectFrom) && EffectFrom.CompareTo(effectiveDate) > 0) return false;
if (DateUtil.IsValid(EffectTo) && EffectTo.CompareTo(effectiveDate) < 0) return false;
return true;
}
//-------------------------------------------------------------------
// Data.
public Data GetData() { return data.Clone(); }
public void SetData(Data data)
{
// Properties that cannot be changed if previously specified.
if (SysId.IsValid(Id) && SysId.ToInt(Id) != SysId.ToInt(data.Id))
throw new NotSupportedException($"{SysUtil.Fn} Id cannot be changed");
if (!StringUtil.IsEmpty(Code) && !Code.EqualsCI(data.Code))
throw new NotSupportedException($"{SysUtil.Fn} Code cannot be changed");
// Populate individual properties to ensure that 'Changed' indicator is kept up to date.
this.data.PopulateFrom(data);
}
//-------------------------------------------------------------------
// Properties.
public String Code
{
get { return data.Code; }
set { data.Code = value; }
}
public String CodeAlt1
{
get { return data.CodeAlt1; }
set { data.CodeAlt1 = value; }
}
public String CodeAlt2
{
get { return data.CodeAlt2; }
set { data.CodeAlt2 = value; }
}
public String Description
{
get { return data.Description; }
set { data.Description = value; }
}
public SysId RegionId
{
get { return data.RegionId; }
set { data.RegionId = value; }
}
public DateTime EffectFrom
{
get { return data.EffectFrom; }
set { data.EffectFrom = value; }
}
public DateTime EffectTo
{
get { return data.EffectTo; }
set { data.EffectTo = value; }
}
public decimal TaxRate
{
get { return data.TaxRate; }
set { data.TaxRate = value; }
}
public decimal TaxRatePrev
{
get { return data.TaxRatePrev; }
set { data.TaxRatePrev = value; }
}
public SysId TaxCodeIdLink
{
get { return data.TaxCodeIdLink; }
set { data.TaxCodeIdLink = value; }
}
//-------------------------------------------------------------------
// A s s o c i a t e d D a t a E l e m e n t s
//-------------------------------------------------------------------
public abstract bool HasDependentTaxCodes();
//-------------------------------------------------------------------
// P a r a m s
//-------------------------------------------------------------------
// List parameters.
public enum StatusCat
{
Any,
ActiveOnly,
}
/// <summary>
/// Item list parameters.
/// </summary>
public new class Params : SacsHierarchyItem.Params
{
// List filtering.
public HashSet<SysId> IdsIncluded { get; } = new HashSet<SysId>();
public HashSet<SysId> IdsExcluded { get; } = new HashSet<SysId>();
// Tax Code properties.
public String Code { get; set; }
public String CodePartial { get; set; }
public String CodeAlt1 { get; set; }
public String CodeAlt2 { get; set; }
public SysId RegionId { get; set; }
public DateTime EffectOn { get; set; } = DateTime.MinValue;
public String NotesPartial { get; set; }
public StatusCat StatusCat { get; set; } = StatusCat.Any;
}
//-------------------------------------------------------------------
}
//=======================================================================
// T a x C o d e D a t a L i s t
//=======================================================================
public static class SaTaxCodeList
{
/// <summary>Check whether taxcode exists/locate in list with specified Id.</summary>
public static bool ExistsById(this List<SaTaxCode> values, SysId taxId)
{
if (!SysId.IsValid(taxId)) return false;
return values.Exists(item => item.Id.Equals(taxId));
}
/// <summary>Retrieve tax code with specified Id.</summary>
public static SaTaxCode FindById(this List<SaTaxCode> values, SysId taxId)
{
if (!SysId.IsValid(taxId)) return null;
return values.Find(item => item.Id.Equals(taxId));
}
public static SaTaxCode FindByCode(this List<SaTaxCode> values, String taxCode)
{
if (StringUtil.IsEmpty(taxCode)) return null;
return values.Find(item => item.Code.Equals(taxCode));
}
public static SaTaxCode FindByCodeEffectiveOn(this List<SaTaxCode> values, String taxCode, DateTime effectiveOn)
{
if (StringUtil.IsEmpty(taxCode)) return null;
if (!DateUtil.IsValid(effectiveOn)) return null;
return values.Find(item => item.Code.Equals(taxCode) && item.IsEffectiveOn(effectiveOn));
}
}
//=======================================================================
}