/////////////////////////////////////////////////////////// // WorkorderItemLoan.cs // Implementation of Class WorkorderItemLoan // CSLA type: Editable Child // Created on: 12-Nov-2005 // Object design: Joyce/John // Coded: John 12-Nov-2005 /////////////////////////////////////////////////////////// using System; using System.Data; using CSLA.Data; using GZTW.Data; using CSLA; using System.Threading; using CSLA.Security; namespace GZTW.AyaNova.BLL { /// /// Loaned equipment object for object's collection /// [Serializable] public class WorkorderItemLoan : BusinessBase { #region Attributes private Guid mWorkorderItemID; private bool bReadOnly; private Guid mID; private SmartDate mCreated; private SmartDate mModified; private Guid mCreator; private Guid mModifier; private string mNotes=""; private SmartDate mOutDate; private SmartDate mDueDate; private SmartDate mReturnDate; private decimal mCharges=0m; private Guid mTaxCodeID; private Guid mLoanItemID=Guid.NewGuid();//change:19-July-2006 for broken rule //Case 420 private decimal mQuantity = 1; private LoanItemRates mRate = 0; #endregion #region Constructor /// /// Private constructor to prevent direct instantiation /// private WorkorderItemLoan() { //Set to read / write initially so that properties //can be set bReadOnly=false; //Child object MarkAsChild(); //New ID mID = Guid.NewGuid(); //Added:19-July-2006 //Pre break the loanitem can't be empty rule LoanItemID = Guid.Empty; //Set record history to defaults mCreated = new SmartDate(DBUtil.CurrentWorkingDateTime); mModified=new SmartDate(); mCreator=Guid.Empty; mModifier=Guid.Empty; mOutDate = new SmartDate(DBUtil.CurrentWorkingDateTime); mDueDate=new SmartDate(); mReturnDate=new SmartDate(); mTaxCodeID=AyaBizUtils.GlobalSettings.TaxRateSaleID; } #endregion #region Business properties /// /// Get internal id number Read only property because it's set internally, not /// externally /// public Guid ID { get { return mID; } } /// /// Get created date /// /// /// public string Created { get { return mCreated.ToString(); } } /// /// Get modified date /// /// /// public string Modified { get { return mModified.ToString(); } } /// /// Get user record ID of person who created this record /// /// /// public Guid Creator { get { return mCreator; } } /// /// Get user ID of person who modified this record /// /// /// public Guid Modifier { get { return mModifier; } } /// /// Notes /// public string Notes { get { return mNotes; } set { if(bReadOnly) ThrowSetError(); else { if(mNotes!=value) { mNotes = value; MarkDirty(); } } } } /// /// GUID of used for charges /// public Guid TaxCodeID { get { return mTaxCodeID; } set { if(bReadOnly) ThrowSetError(); else { if(mTaxCodeID!=value) { mTaxCodeID = value; MarkDirty(); } } } } /// /// Guid ID of parent object /// public Guid WorkorderItemID { get { return mWorkorderItemID; } set { if(bReadOnly) ThrowSetError(); else { if(mWorkorderItemID!=value) { mWorkorderItemID = value; MarkDirty(); } } } } /// /// Retail amount to charge client Can be 0 /// public decimal Charges { get { return mCharges; } set { if(bReadOnly) ThrowSetError(); else { if(mCharges!=value) { mCharges = value; MarkDirty(); } } } } /// /// ReturnDate /// public object ReturnDate { get { return mReturnDate.DBValue; } set { if(bReadOnly) ThrowSetError(); else { if (!AyaBizUtils.SmartDateEquals(mReturnDate, value)) //Case 298 { mReturnDate.DBValue = value; MarkDirty(); } } } } /// /// Date expected to be returned /// public object DueDate { get { return mDueDate.DBValue; } set { if(bReadOnly) ThrowSetError(); else { if (!AyaBizUtils.SmartDateEquals(mDueDate, value)) //Case 298 { mDueDate.DBValue = value; MarkDirty(); } } } } /// /// Date loaned out /// public object OutDate { get { return mOutDate.DBValue; } set { if(bReadOnly) ThrowSetError(); else { if (!AyaBizUtils.SmartDateEquals(mOutDate, value)) //Case 298 { mOutDate.DBValue = value; MarkDirty(); } } } } /// /// ID of being loaned /// public Guid LoanItemID { get { return mLoanItemID; } set { if(bReadOnly) ThrowSetError(); else { if(mLoanItemID!=value) { mLoanItemID = value; //Added:19-July-2006 BrokenRules.Assert("LoanItemRequired", "Error.Object.RequiredFieldEmpty,WorkorderItemLoan.Label.LoanItemID", "LoanItemID", value == Guid.Empty); MarkDirty(); } } } } /// /// Called by parent collection object /// when called in turn by workorder object that is read only due to /// security or closed or service completed /// /// Either true or the rights allowed for the current user public void SetReadOnly(bool RO) { bReadOnly=RO; } //Case 420 /// /// Quantity amount, used in conjunction with set rates /// if applicable. Used to set Charges field at time of user entry /// not used in subsequent calculations /// public decimal Quantity { get { return mQuantity; } set { if (bReadOnly) ThrowSetError(); else { if (mQuantity != value) { mQuantity = value; MarkDirty(); } } } } /// /// Get /set time span rate corresponding to loanitem's /// pre-set 6 rates for different time spans /// Used for calculation on entry and review /// /// Not a rate in the labor object sense of rates /// a rate in the sense of a rental business's concept of rates which /// are by time period of rental, in this case /// Hours, half days, days, weeks, months, years /// public LoanItemRates Rate { get { return mRate; } set { if (bReadOnly) ThrowSetError(); else { if (mRate != value) { mRate = value; MarkDirty(); } } } } /// /// Throw an error when a read only user /// tries to set a property /// (this should normally never be called unless someone is using the developer api since the UI /// should prevent it from happening initially) /// private void ThrowSetError() { throw new System.Security.SecurityException ( string.Format ( LocalizedTextTable.GetLocalizedTextDirect("Error.Security.NotAuthorizedToChange"), LocalizedTextTable.GetLocalizedTextDirect("O.WorkorderItemLoan") ) ); } #endregion #region System.object overrides /// /// /// /// public override string ToString() { return "WorkorderItemLoan" + mID.ToString(); } /// /// /// /// /// public override bool Equals(Object obj) { if ( obj == null || GetType ( ) != obj.GetType ( ) ) return false; WorkorderItemLoan c=(WorkorderItemLoan)obj; return mID==c.mID; } /// /// /// /// public override int GetHashCode() { return ("WorkorderItemLoan"+mID).GetHashCode(); } #endregion #region Searching /// /// Returns a search result object based on search terms /// for the ID specified /// /// /// /// public static SearchResult GetSearchResult(Guid ID, string[]searchTerms) { //case 1387 if (Workorder.RightsToWorkorder(WorkorderIDFetcher.GetWorkorderByRelative(RootObjectTypes.WorkorderItemLoan, ID)) < SecurityLevelTypes.ReadOnly) return new SearchResult(); SearchResult sr=new SearchResult(); System.Text.StringBuilder sb = new System.Text.StringBuilder(); SafeDataReader dr = null; try { //Changed: 31-Aug-2006 there was a trailing , after the last column name //in the select statement //Case 88 // "SELECT aCreated, aModified, aCreator, aModifier, aNotes " + // "FROM aWorkorderItemLoan WHERE (aID = @ID)" dr=DBUtil.GetReaderFromSQLString( //Case 88 changed "SELECT aWorkorderItemLoan.aID, aWorkorderItemLoan.aCreator, " + " aWorkorderItemLoan.aModifier, aWorkorderItemLoan.aCreated, " + " aWorkorderItemLoan.aModified, aWorkorderItemLoan.aNotes, " + "AWORKORDERSERVICE.ASERVICENUMBER, " + " AWORKORDERQUOTE.AQUOTENUMBER, AWORKORDERPREVENTIVEMAINTENANCE.APREVENTIVEMAINTENANCENUMBER, " + " ACLIENT.ANAME AS ACLIENTNAME, aClient.aRegionID AS ACLIENTREGION, AWORKORDER.aWorkorderType " + "FROM aWorkorderItemLoan INNER JOIN AWORKORDERITEM " + "ON aWorkorderItemLoan.AWORKORDERITEMID = AWORKORDERITEM.AID " + "LEFT OUTER " + "JOIN AWORKORDER ON AWORKORDERITEM.AWORKORDERID = " + "AWORKORDER.AID LEFT OUTER JOIN ACLIENT ON AWORKORDER.ACLIENTID " + "= ACLIENT.AID LEFT OUTER JOIN AWORKORDERPREVENTIVEMAINTENANCE " + "ON AWORKORDER.AID = " + "AWORKORDERPREVENTIVEMAINTENANCE.AWORKORDERID LEFT OUTER JOIN " + "AWORKORDERQUOTE ON AWORKORDER.AID = AWORKORDERQUOTE.AWORKORDERID " + "LEFT OUTER JOIN AWORKORDERSERVICE " + "ON AWORKORDER.AID = AWORKORDERSERVICE.AWORKORDERID " + "WHERE (aWorkorderItemLoan.aID = @ID)" ,ID); if(!dr.Read()) return new SearchResult();//DBUtil.ThrowFetchError("SearchResult for WorkorderItemLoanID: " + ID.ToString()); if (!AyaBizUtils.InYourRegion(dr.GetGuid("ACLIENTREGION"))) return new SearchResult();//case 58 //Case 88 parse out workorder type and prepare description field accordingly WorkorderTypes workorderType = (WorkorderTypes)dr.GetInt16("aWorkorderType"); switch (workorderType) { case WorkorderTypes.Service: sr.Description = LocalizedTextTable.GetLocalizedTextDirect("O.WorkorderService") + " " + dr.GetInt32("aServiceNumber").ToString() + " " + dr.GetString("ACLIENTNAME"); break; case WorkorderTypes.Quote: sr.Description = LocalizedTextTable.GetLocalizedTextDirect("O.WorkorderQuote") + " " + dr.GetInt32("AQUOTENUMBER").ToString() + " " + dr.GetString("ACLIENTNAME"); break; case WorkorderTypes.PreventiveMaintenance: sr.Description = LocalizedTextTable.GetLocalizedTextDirect("O.WorkorderPreventiveMaintenance") + " " + dr.GetInt32("APREVENTIVEMAINTENANCENUMBER").ToString() + " " + dr.GetString("ACLIENTNAME"); break; } // sr.Description=""; sb.Append(dr.GetString("aNotes")); sr.Created=DBUtil.ToLocal(dr.GetSmartDate("aCreated")); sr.Modified=DBUtil.ToLocal(dr.GetSmartDate("aModified")); sr.Creator=dr.GetGuid("aCreator"); sr.Modifier=dr.GetGuid("aModifier"); } finally { if(dr!=null) dr.Close(); } //Formulate results ExtractAndRank er = new ExtractAndRank(); er.Process(sb.ToString().Trim(),searchTerms); sr.Extract=er.Extract; sr.Rank=er.Ranking; sr.AncestorRootObjectID=ID; sr.AncestorRootObjectType=RootObjectTypes.WorkorderItemLoan; return sr; } #endregion #region Static methods /// /// New item /// /// /// internal static WorkorderItemLoan NewItem(WorkorderItem obj) { //case 1387 if (AyaBizUtils.IsGenerator || ((obj.mHeaderRights > SecurityLevelTypes.ReadOnly) && (AyaBizUtils.Right("Object.WorkorderItemLoan") > (int)SecurityLevelTypes.ReadOnly))) { WorkorderItemLoan child = new WorkorderItemLoan(); child.mWorkorderItemID=obj.ID; return child; } else throw new System.Security.SecurityException( string.Format( LocalizedTextTable.GetLocalizedTextDirect("Error.Security.NotAuthorizedToCreate"), LocalizedTextTable.GetLocalizedTextDirect("O.WorkorderItemLoan"))); } /// /// Get Item /// /// /// /// internal static WorkorderItemLoan GetItem(SafeDataReader dr, WorkorderItem obj) { //case 1387 if ((obj.mHeaderRights > SecurityLevelTypes.NoAccess) && (AyaBizUtils.Right("Object.WorkorderItemLoan") > (int)SecurityLevelTypes.NoAccess)) { WorkorderItemLoan child = new WorkorderItemLoan(); child.Fetch(dr); return child; } else throw new System.Security.SecurityException( string.Format( LocalizedTextTable.GetLocalizedTextDirect("Error.Security.NotAuthorizedToRetrieve"), LocalizedTextTable.GetLocalizedTextDirect("O.WorkorderItemLoan"))); } #endregion #region DAL DATA ACCESS #region Fetch /// /// /// /// protected void Fetch(SafeDataReader dr) { //Standard fields mCreated=DBUtil.ToLocal(dr.GetSmartDate("aCreated")); mModified=DBUtil.ToLocal(dr.GetSmartDate("aModified")); mCreator=dr.GetGuid("aCreator"); mModifier=dr.GetGuid("aModifier"); mID=dr.GetGuid("aID"); //WorkorderItemLoan fields mNotes=dr.GetString("aNotes"); mTaxCodeID=dr.GetGuid("aTaxCodeID"); mWorkorderItemID=dr.GetGuid("aWorkorderItemID"); mCharges=dr.GetDecimal("aCharges"); mOutDate=DBUtil.ToLocal(dr.GetSmartDate("aOutDate")); mDueDate=DBUtil.ToLocal(dr.GetSmartDate("aDueDate")); mReturnDate=DBUtil.ToLocal(dr.GetSmartDate("aReturnDate")); //changed:19-July2006 (rule added) //Unbreak the broken rule on load LoanItemID=dr.GetGuid("aLoanItemID"); //Case 420 mQuantity = dr.GetDecimal("aQuantity"); mRate = (LoanItemRates)dr.GetInt16("aRate"); //Get access rights level bReadOnly=AyaBizUtils.Right("Object.WorkorderItemLoan")<(int)SecurityLevelTypes.ReadWrite; MarkOld(); } #endregion fetch #region Add / Update /// /// Update child /// /// /// internal void Update(WorkorderItem obj,IDbTransaction tr) { //No need to update if there is nothing changed if(!this.IsDirty) return; // If not a new record, check if record was modified //by another user since original retrieval: if(!IsNew) DBUtil.CheckSafeToUpdateInsideTransaction(this.mModified.Date,this.mID,"aWorkorderItemLoan",tr);//case 1960 #region Delete if(IsDeleted) { if(!IsNew) { //Un-Flag any loan item with aCurrentWorkorderItemLoan = this id //Note that to be safe, this sets any loanitem with this loan item ID to empty //rather than the loan item this is set to because this might be being deleted //after loan item was already set to another workorderItemLoan DBCommandWrapper cmLoanItemDeflag = DBUtil.GetCommandFromSQL( "UPDATE aLoanItem SET aCurrentWorkorderItemLoan=@GUIDEMPTY " + "WHERE aCurrentWorkorderItemLoan=@CurrentWOILoanID" ); cmLoanItemDeflag.AddInParameter("@CurrentWOILoanID",DbType.Guid, this.mID); cmLoanItemDeflag.AddInParameter("@GUIDEMPTY",DbType.Guid, Guid.Empty); DBUtil.DB.ExecuteNonQuery(cmLoanItemDeflag, tr); //Now remove workorderitemloan record DBCommandWrapper cmDelete = DBUtil.GetCommandFromSQL("DELETE FROM aWorkorderItemLoan WHERE aID=@ID;"); cmDelete.AddInParameter("@ID",DbType.Guid,this.mID); DBUtil.DB.ExecuteNonQuery(cmDelete, tr); DBUtil.RemoveKeywords(tr,RootObjectTypes.WorkorderItemLoan,this.mID); } MarkNew(); return; } #endregion #region Add / Update //get modification time temporarily, if update succeeds then //set to this time System.DateTime dtModified = DBUtil.CurrentWorkingDateTime; DBCommandWrapper cm = null; if(IsNew)//Add or update? cm=DBUtil.GetCommandFromSQL( "INSERT INTO aWorkorderItemLoan (aWorkorderItemID, " + "aID, aCharges, aNotes,aOutDate,aDueDate,aReturnDate, " + "aTaxCodeID, aLoanItemID, aCreated,aModified,aCreator,aModifier, " + //case 420 "aQuantity, aRate " + ") " + "VALUES (@WorkorderItemID,@ID,@Charges,@Notes, @OutDate, @DueDate, @ReturnDate, " + "@TaxCodeID,@LoanItemID, @Created,@Modified,@CurrentUserID, " + "@CurrentUserID, " + //Case 420 "@Quantity, @Rate " + ")" ); else cm=DBUtil.GetCommandFromSQL( "UPDATE aWorkorderItemLoan SET aWorkorderItemID=@WorkorderItemID, " + "aID=@ID, aCharges=@Charges, aNotes=@Notes, aOutDate=@OutDate, " + "aDueDate=@DueDate,aReturnDate=@ReturnDate, " + "aTaxCodeID=@TaxCodeID, aLoanItemID=@LoanItemID, " + "aModifier=@CurrentUserID, aModified=@Modified, " + //Case 420 "aQuantity=@Quantity, aRate=@Rate " + "WHERE aID=@ID" ); //WorkorderItemLoan specific cm.AddInParameter("@ID",DbType.Guid,mID); cm.AddInParameter("@WorkorderItemID",DbType.Guid,mWorkorderItemID); cm.AddLargeStringInParameter("@Notes",mNotes); cm.AddInParameter("@TaxCodeID",DbType.Guid,mTaxCodeID); cm.AddInParameter("@LoanItemID",DbType.Guid,mLoanItemID); cm.AddInParameter("@Charges",DbType.Decimal,mCharges); cm.AddInParameter("@OutDate",DbType.DateTime,DBUtil.ToUTC(this.mOutDate).DBValue); cm.AddInParameter("@DueDate",DbType.DateTime,DBUtil.ToUTC(this.mDueDate).DBValue); cm.AddInParameter("@ReturnDate",DbType.DateTime,DBUtil.ToUTC(this.mReturnDate).DBValue); //standard parameters cm.AddInParameter("@CurrentUserID",DbType.Guid, CurrentUserID); cm.AddInParameter("@Created",DbType.DateTime, DBUtil.ToUTC(mCreated.Date)); cm.AddInParameter("@Modified",DbType.DateTime, DBUtil.ToUTC(dtModified)); //Case 420 cm.AddInParameter("@Quantity", DbType.Decimal, mQuantity); cm.AddInParameter("@Rate", DbType.Int16, (int)mRate); DBUtil.DB.ExecuteNonQuery(cm, tr); //*********************************************************************** //case 3148 //if a user changes the loan item then we need to unflag the old one. //so I've copied the exact unflag code from delete above which is safe //as it will get reflagged immediately after //deflag any record that has this workorderitemloan id as currentwoiloanid //this is safe because there's a 1:1 correspondence so this woitemloan ID should not appear //anywhere in the loanitem table except for the single actual record (id) selected. //so this will erase it and the next block will set it DBCommandWrapper cmLoanItemDeflag2 = DBUtil.GetCommandFromSQL( "UPDATE aLoanItem SET aCurrentWorkorderItemLoan=@GUIDEMPTY " + "WHERE aCurrentWorkorderItemLoan=@CurrentWOILoanID" ); cmLoanItemDeflag2.AddInParameter("@CurrentWOILoanID", DbType.Guid, this.mID); cmLoanItemDeflag2.AddInParameter("@GUIDEMPTY", DbType.Guid, Guid.Empty); DBUtil.DB.ExecuteNonQuery(cmLoanItemDeflag2, tr); //*********************************************************************** //Flag loan item with this id or empty if returndate is non-empty DBCommandWrapper cmLoanItemUpdate = DBUtil.GetCommandFromSQL( "UPDATE aLoanItem SET aCurrentWorkorderItemLoan=@CurrentWOILoanID " + "WHERE aID=@LoanItemID" ); cmLoanItemUpdate.AddInParameter("@LoanItemID",DbType.Guid, mLoanItemID); if(this.mReturnDate.IsEmpty)//It's still out on loan cmLoanItemUpdate.AddInParameter("@CurrentWOILoanID",DbType.Guid, this.mID); else//It's back cmLoanItemUpdate.AddInParameter("@CurrentWOILoanID",DbType.Guid, Guid.Empty); DBUtil.DB.ExecuteNonQuery(cmLoanItemUpdate, tr); //Process keywords DBUtil.ProcessKeywords(tr,this.mID,RootObjectTypes.WorkorderItemLoan,IsNew,AyaBizUtils.Break(false,mNotes)); MarkOld();//db is now synched with object //Successful update so //change modification time to match this.mModified.Date=dtModified; #endregion } #endregion add/update #endregion }//end WorkorderItemLoan }//end namespace GZTW.AyaNova.BLL