using Sarand.BusinessMgr.Net.Standard.Base.App; using Sarand.BusinessMgr.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.App; using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Dbas; using Sarand.Net.Standard.Base.ReferenceData; using Sarand.Net.Standard.Base.Utils; using System; using System.Collections.Generic; namespace Sarand.BusinessMgr.Net.Standard.Base.Mgr { //======================================================================= // Transaction manager - Constituents. //======================================================================= partial class SbmTransactionMgr { //------------------------------------------------------------------- // Utilities. public abstract SaUomType GetTimeTypeForUom(SysId idUom); //------------------------------------------------------------------- // Associated data. public abstract bool ConstituentHasHasConstituents(SysId constituentId); //--------------------------------------------------------------- // Time records. public abstract bool RefreshAllTotalTimes(DbUpdateInfo dbUpdateInfo); public abstract bool RefreshTotalTimes(SbmConstituent constituent, SysId TransIdPrevious, SysId ReqntIdPrevious, DbUpdateInfo dbUpdateInfo); public abstract bool RefreshTransTotalTime(SysId Trans, DbUpdateInfo dbUpdateInfo); public abstract bool RefreshReqntTotalTime(SysId Reqnt, DbUpdateInfo dbUpdateInfo); //--------------------------------------------------------------- // Calculate hours for each subdivision within the specified period. // Returned list items contain two fields: // PeriodDateTime DateTime to define start of period. // PeriodHours Double value to indicate hours booked. public static String GetPeriodTimeColumnName_Date() { return "PeriodDate"; } public static String GetPeriodTimeColumnName_Hours() { return "PeriodHours"; } public abstract List GetPeriodTimeBooked(SysId idAffilEmployee, DateTime dPeriodStart, DateTime dPeriodEnd, SaUomType eUomPeriod); //------------------------------------------------------------------- // Retrieve individual constituents. //------------------------------------------------------------------- // Constituent exist. public bool ConstituentExistsById(SysId id) { ClearErrorState(); if (!SysId.IsValid(id)) return false; SbmConstituent.Params prmituent = new SbmConstituent.Params(); prmituent.IdsIncluded.Add(id); prmituent.StatusCat = SbmConstituent.StatusCat.Any; return GetConstituentCount(prmituent) == 1; } //------------------------------------------------------------------- // Get constituent. public abstract SbmConstituent GetConstituent(SbmConstituent.Params prm); public SbmConstituent GetConstituentById(SysId id) { ClearErrorState(); if (!SysId.IsValid(id)) return null; SbmConstituent.Params prmituent = new SbmConstituent.Params(); prmituent.IdsIncluded.Add(id); prmituent.StatusCat = SbmConstituent.StatusCat.Any; return GetConstituent(prmituent); } //------------------------------------------------------------------- // Create constituent. public abstract SbmConstituent CreateConstituent(SysId assocId, Sbm.ConstituentType constituentType); //------------------------------------------------------------------- // Validate constituent data. public bool IsValidConstituent(SbmConstituent constituentCategory) { ClearErrorState(); if (constituentCategory == null) return SetErrorState(ErrorMessage.ItemNotSpecified); return IsValidConstituentData(constituentCategory.GetData(), new SbmConstituent.ErrField()); } public virtual bool IsValidConstituentData(SbmConstituent.Data data, SbmConstituent.ErrField errField) { ClearErrorState(); // Constituent properties. if (errField.AffIdOwner != SacsHierarchyItem.ValidValue.Ignore && !SysId.IsValid(data.AffiliateIdOwner)) { errField.AffIdOwner = SacsHierarchyItem.ValidValue.Invalid; return SetErrorState("invalid owner"); } // NB AffiliateTargetId is optional. if (errField.AssocId != SacsHierarchyItem.ValidValue.Ignore && !SysId.IsValid(data.AssociationId)) { errField.AssocId = SacsHierarchyItem.ValidValue.Invalid; return SetErrorState("invalid association"); } if (errField.TransId != SacsHierarchyItem.ValidValue.Ignore && !SysId.IsValid(data.TransactionId) && SysId.IsValid(data.RequirementId)) { errField.TransId = SacsHierarchyItem.ValidValue.Invalid; return SetErrorState("transaction not specified for requirement"); } if (errField.TransId != SacsHierarchyItem.ValidValue.Ignore && !SysId.IsValid(data.RequirementId) && SysId.IsValid(data.ConstituentId)) { errField.ReqntId = SacsHierarchyItem.ValidValue.Invalid; return SetErrorState("transaction not specified for referenecd constituent"); } // NB AssetId, ProcessId, AssocIdContractor is optional. if (errField.ConstituentType != SacsHierarchyItem.ValidValue.Ignore && (short)data.ConstituentType < 1) { if ((int)data.ConstituentType < 1) { errField.ConstituentType = SacsHierarchyItem.ValidValue.Invalid; return SetErrorState("invalid type"); } } // NB Seq, Effective, Required, Started, Completed is optional. if (errField.DescBrief != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.DescBrief, "description", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Constituent_DescBrief), true)) { errField.DescBrief = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.DescOutline != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.DescOutline, "outline description", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Constituent_DescOutline), true)) { errField.DescOutline = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.DescDetail != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.DescDetail, "detailed description", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Constituent_DescDetail), true)) { errField.DescDetail = SacsHierarchyItem.ValidValue.Invalid; return false; } // NB TaskNumber, Priority is optional. if (errField.Category != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Category, "ategory", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Constituent_Category), true)) { errField.Category = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.Reference != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Reference, "reference", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Constituent_Reference), true)) { errField.Reference = SacsHierarchyItem.ValidValue.Invalid; return false; } // NB Quantity, UomId, UnitCost, AmountEst, AmountNet, TaxCodeId, TaxRate, AmountTax, AmountTot, TaxRateRebate, AmountTaxRebate is optional. if (errField.Notes != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Notes, "notes", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Constituent_Notes), true)) { errField.Notes = SacsHierarchyItem.ValidValue.Invalid; return false; } if (errField.Status != SacsHierarchyItem.ValidValue.Ignore) { if (!IsValidValue(data.StatusCode, "status", (long)SbmDbDfn.GetColTextLen(SbmDbDfn.ColumnIdx.Constituent_Status), true, true)) { errField.Status = SacsHierarchyItem.ValidValue.Invalid; return false; } if (!SbmConstituent.ConstituentStatuses.Contains(data.Status)) { errField.Status = SacsHierarchyItem.ValidValue.Invalid; return SetErrorState(ErrorMessage.InvalidStatus); } } return true; } //------------------------------------------------------------------- // Constituent database interface. public abstract bool InsertConstituent(SbmConstituent constituentCategory, DbUpdateInfo dbUpdateInfo); public abstract bool UpdateConstituent(SbmConstituent constituentCategory, DbUpdateInfo dbUpdateInfo); public virtual bool ConstituentCanBeDeleted(SbmConstituent constituentCategory) { ClearErrorState(); return true; } public abstract bool DeleteConstituent(SbmConstituent constituentCategory, DbUpdateInfo dbUpdateInfo); //------------------------------------------------------------------- // Constituent list. public abstract ColumnDfn GetConstituentColumnDfn(SbmConstituent.Column columnId, String caption = "", int width = 0); public abstract List GetConstituentQueryFilter(SbmConstituent.Params prm); public abstract long GetConstituentCount(SbmConstituent.Params prm); public abstract List GetConstituentList(SbmConstituent.Params prm); public abstract DbResultSet ExecuteConstituentQuery(List columns, SbmConstituent.Params prm); //------------------------------------------------------------------- // D a t a V a l u e s //------------------------------------------------------------------- public DataValue GetConstituentDataValue(ColumnDfn column, NamedValue.Map values) { DataValue value = new DataValue(); switch ((SbmConstituent.Column)column.Id) { //----------------------------------------------------------- // Constituent TypeDesc. case SbmConstituent.Column.Type_Desc: { Sbm.ConstituentType constituentType = (Sbm.ConstituentType)values.GetValue(column.DataName).AsLong(); value = new DataValue(ConstituentTypes.GetDescForType(constituentType, ((int)constituentType).ToString())); break; } // Transaction DescBrief. case SbmConstituent.Column.Trans_DescBrief: { String transRef = values.GetValue(GetConstituentColumnDfn(SbmConstituent.Column.Trans_Ref).DataName).ToString(); String transDescBrief = values.GetValue(column.DataName).ToString(); value = new DataValue((transRef + " " + transDescBrief).Trim()); break; } // Requirement DescBrief. case SbmConstituent.Column.Reqnt_DescBrief: { String reqntDescBrief = values.GetValue(column.DataName).ToString(); String jobNumber = values.GetValue(GetConstituentColumnDfn(SbmConstituent.Column.Reqnt_JobNumber).DataName).ToString(); if (!StringUtil.IsEmpty(jobNumber)) value = new DataValue(jobNumber + " " + reqntDescBrief); break; } //----------------------------------------------------------- // Started Date&Time. case SbmConstituent.Column.Started_DateFmt: { DateTime started = values.GetValue(column.DataName).AsDate(); value = new DataValue(DateUtil.Format(started, column.DateFormat)); break; } case SbmConstituent.Column.Started_Day: { DateTime started = values.GetValue(column.DataName).AsDate(); value = new DataValue(started.DayOfWeek.ToString()); break; } // Required Date&Time. case SbmConstituent.Column.Required_DateFmt: { DateTime required = values.GetValue(column.DataName).AsDate(); value = new DataValue(DateUtil.Format(required, column.DateFormat)); break; } case SbmConstituent.Column.Required_Time: { DateTime required = values.GetValue(column.DataName).AsDateTime(); value = new DataValue(required); break; } // Required CssClass. case SbmConstituent.Column.Required_CssClass: { DateTime today = DateTime.Today; DateTime required = values.GetValue(column.DataName).AsDate(); if (required < today) value = new DataValue("overdue"); else if (required < today.AddDays(2)) value = new DataValue("due"); else value = new DataValue("notdue"); break; } // Required Time case SbmConstituent.Column.Required_Today: { DateTime today = DateTime.Today; DateTime required = values.GetValue(column.DataName).AsDate(); if (required == today) value = new DataValue("Today"); else if (required == today.AddDays(1)) value = new DataValue("Tomorrow"); else if (required >= today.StartOfWorkingWeek() && required < today.StartOfWorkingWeek().AddDays(7)) value = new DataValue("This week"); else if (required >= today.StartOfWorkingWeek().AddDays(-7) && required < today.StartOfWorkingWeek()) value = new DataValue("Last week"); else if (required >= today.StartOfWorkingWeek().AddDays(7) && required < today.StartOfWorkingWeek().AddDays(14)) value = new DataValue("Next week"); else if (required >= today.StartOfMonth() && required <= today.EndOfMonth()) value = new DataValue("This month"); else if (required >= today.StartOfMonth().AddDays(-1).StartOfMonth() && required < today.StartOfMonth()) value = new DataValue("Last month"); else if (required > today.EndOfMonth() && required <= (today.EndOfMonth().AddDays(1)).EndOfMonth()) value = new DataValue("Next month"); else value = new DataValue(DateUtil.Format(required, "d-MMM-yyyy")); break; } // Completed Date&Time. case SbmConstituent.Column.Completed_DateFmt: { DateTime completed = values.GetValue(column.DataName).AsDate(); value = new DataValue(DateUtil.Format(completed, "d-MMM-yyyy")); break; } //----------------------------------------------------------- // Due Indicator. case SbmConstituent.Column.DueInd: { DataValue.TriStateType dueTriState = DataValue.TriStateType.Unknown; SaStatus status = SacsSystem.GetStatusForCode(values.GetValue(GetConstituentColumnDfn(SbmConstituent.Column.Status).DataName).ToString()); if (status == SaStatus.Completed) dueTriState = DataValue.TriStateType.Green; else if (status == SaStatus.Required || status == SaStatus.InProgress) { DateTime required = values.GetValue(GetConstituentColumnDfn(SbmConstituent.Column.Required_Date).DataName).AsDate(); if (required <= DateTime.MinValue) dueTriState = DataValue.TriStateType.Red; else dueTriState = DataValue.TriStateType.Amber; } value = new DataValue(dueTriState); break; } //----------------------------------------------------------- // Notes. case SbmConstituent.Column.Notes: value = new DataValue(SacsHierarchyItem.FormatForDisplay(values.GetValue(column.DataName).ToString(), 200)); break; // Status. incl-flags in status_ind case SbmConstituent.Column.Status_Desc: case SbmConstituent.Column.Status_Ind: { SaStatus status = SacsSystem.GetStatusForCode(values.GetValue(column.DataName).ToString()); if (column.Id == (int)SbmConstituent.Column.Status_Desc) value = new DataValue(SacsSystem.GetStatusDesc(status)); else if (column.Id == (int)SbmConstituent.Column.Status_Ind) value = new DataValue(SbmConstituent.GetStatusTriState(status)); break; } //----------------------------------------------------------- default: value = values.GetValue(column.DataName); break; } return value; } //------------------------------------------------------------------- } //======================================================================= }