/////////////////////////////////////////////////////////// // ObjectRegionIDFetcher.cs // Implementation of Class ObjectRegionIDFetcher // CSLA type: Read-only object // Created on: 28-Oct-2008 // Object design: John // Coded: 28-Oct-2008 /////////////////////////////////////////////////////////// using System; using System.ComponentModel; using CSLA; using CSLA.Data; namespace GZTW.AyaNova.BLL { //case 58 /// ///Quickly fetch any Regionalized object's regionid ///Used primarily for search feature restrict results to region /// [Serializable, EditorBrowsable(EditorBrowsableState.Never)] public class ObjectRegionIDFetcher : ReadOnlyBase { #region Attributes private Guid mRegionID; #endregion #region Constructor /// /// Private constructor to prevent direct instantiation /// private ObjectRegionIDFetcher() { } #endregion #region Static methods /// /// Given a root object type and ID /// returns the Region ID that object is set to. /// /// NOTE: if the passed in object type is not a regionalized object type /// it will return Region.DefaultRegionID instead. /// /// /// public static Guid ObjectRegion(TypeAndID TheObject) { return ((ObjectRegionIDFetcher)DataPortal.Fetch(new Criteria(TheObject))).mRegionID; } #endregion #region DAL DATA ACCESS /// /// protected override void DataPortal_Fetch(object Criteria) { Criteria crit = (Criteria)Criteria; string sTable = ""; switch (crit.TheObject.RootObjectType) { case RootObjectTypes.Client: sTable = "aClient"; break; case RootObjectTypes.Contract: sTable = "aContract"; break; case RootObjectTypes.HeadOffice: sTable = "aHeadOffice"; break; case RootObjectTypes.User: sTable = "aUser"; break; case RootObjectTypes.DispatchZone: sTable = "aDispatchZone"; break; case RootObjectTypes.LoanItem: sTable = "aLoanItem"; break; case RootObjectTypes.Project: sTable = "aProject"; break; case RootObjectTypes.Rate: sTable = "aRate"; break; case RootObjectTypes.Report: sTable = "aReport"; break; case RootObjectTypes.PartWarehouse: sTable = "aPartWarehouse"; break; case RootObjectTypes.ClientServiceRequest: this.mRegionID = DBUtil.ToGuid(DBUtil.GetScalarFromSQLString( "SELECT aClient.aRegionID from aClientServiceRequest " + "LEFT OUTER JOIN ACLIENT ON (ACLIENTSERVICEREQUEST.ACLIENTID = ACLIENT.AID) " + "WHERE aClientServiceRequest.aID=@ID ", crit.TheObject.ID)); return; case RootObjectTypes.ScheduleMarker: { SafeDataReader dr = DBUtil.GetReaderFromSQLString( "SELECT aSourceID, aScheduleMarkerSourceType, aCreated, aModified, aCreator, aModifier, aName, " + "aNotes FROM aScheduleMarker WHERE (aID = @ID)" , crit.TheObject.ID); if (!dr.Read()) this.mRegionID = Region.DefaultRegionID;//better safe than sorry ScheduleMarkerSourceTypes ScheduleMarkerSourceType = (ScheduleMarkerSourceTypes)dr.GetInt16("aScheduleMarkerSourceType"); if (ScheduleMarkerSourceType == ScheduleMarkerSourceTypes.Regional) mRegionID = dr.GetGuid("aSourceID"); else mRegionID = Region.DefaultRegionID; } return; case RootObjectTypes.ServiceBank: { //Service bank needs to check the ancestor the sb entry is related to so //first get the ancestor: SafeDataReader dr = DBUtil.GetReaderFromSQLString( "SELECT aSourceRootObjectID, " + " aSourceRootObjectType, AAPPLIESTOROOTOBJECTID, " + " AAPPLIESTOROOTOBJECTTYPE FROM aServiceBank WHERE " + "(aID = @ID)" , crit.TheObject.ID); if (!dr.Read()) this.mRegionID = Region.DefaultRegionID;//better safe than sorry //The following block of code basically copied from the servicebank fetch search result code //Source ID points to the object to open where the entry was made from //however if it's empty then it means the entry was made from the //servicebank screen itself so we then need to use the //applies to object id instead to open the object in question Guid AncestorRootObjectID = dr.GetGuid("aSourceRootObjectID"); RootObjectTypes AncestorRootObjectType = RootObjectTypes.Nothing; if (AncestorRootObjectID == Guid.Empty) { AncestorRootObjectID = dr.GetGuid("AAPPLIESTOROOTOBJECTID"); AncestorRootObjectType = (RootObjectTypes)dr.GetInt16("AAPPLIESTOROOTOBJECTTYPE"); } else AncestorRootObjectType = (RootObjectTypes)dr.GetInt16("aSourceRootObjectType"); //Now that we have the ancestor just fetch it's region ID as normal //by recursively calling this method mRegionID = ObjectRegionIDFetcher.ObjectRegion( new TypeAndID( AncestorRootObjectType, AncestorRootObjectID ) ); } return; //Workorder related case RootObjectTypes.Workorder: case RootObjectTypes.WorkorderItem: case RootObjectTypes.WorkorderItemLabor: case RootObjectTypes.WorkorderItemMiscExpense: case RootObjectTypes.WorkorderItemTravel: case RootObjectTypes.WorkorderItemScheduledUser: case RootObjectTypes.WorkorderItemOutsideService: case RootObjectTypes.WorkorderItemPartRequest: case RootObjectTypes.WorkorderItemPart: case RootObjectTypes.WorkorderPreventiveMaintenance: case RootObjectTypes.WorkorderQuote: case RootObjectTypes.WorkorderService: case RootObjectTypes.WorkorderItemLoan: { //Get the parent workorder ID Guid woid = WorkorderIDFetcher.GetWorkorderByRelative(crit.TheObject.RootObjectType, crit.TheObject.ID); //Use it to fetch the client's region SafeDataReader dr = DBUtil.GetReaderFromSQLString( "SELECT aClient.aRegionID AS ACLIENTREGION " + "FROM aWorkorder " + "LEFT OUTER JOIN aClient " + "ON aWorkorder.aClientID = aClient.aID WHERE " + "(aWorkorder.aID = @ID)" , woid); if (!dr.Read()) this.mRegionID = Region.DefaultRegionID;//better safe than sorry mRegionID = dr.GetGuid("ACLIENTREGION"); } return; default: { //not a regionalized object? Then return default region id //this allows this code to be called with indeterminate root object types //for example the AssignedDocs search result processor this.mRegionID = Region.DefaultRegionID; return; } } this.mRegionID=DBUtil.ToGuid(DBUtil.GetScalarFromSQLString( "SELECT aRegionID FROM "+ sTable +" WHERE " + "(aID = @ID)", crit.TheObject.ID )); } #endregion #region criteria /// /// Criteria for identifying existing object /// [Serializable] private class Criteria { public TypeAndID TheObject; public Criteria(TypeAndID _TheObject) { TheObject = _TheObject; } } #endregion }//end class }//end namespace GZTW.AyaNova.BLL