/////////////////////////////////////////////////////////// // Client.cs // Implementation of Class Client // CSLA type: Editable Root // Created on: 07-Jun-2004 8:41:14 AM // Object design: Joyce // Coded: John 02-July-2004 /////////////////////////////////////////////////////////// using System; using System.Data; using CSLA.Data; using GZTW.Data; using CSLA; using System.Threading; using CSLA.Security; using System.ComponentModel; namespace GZTW.AyaNova.BLL { /// /// AyaNova client object representing a customer. /// [Serializable] public class Client : BusinessBase { // Create a logger for use in this class //private static readonly log4net.ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); #region Attributes private bool bReadOnly; private Guid mID; private string mName=null; private SmartDate mCreated; private SmartDate mModified; private bool mActive; private Guid mCreator; private Guid mModifier; private Guid mDispatchZoneID; private Address mGoToAddress; private Address mMailToAddress; //private long mOriginalCheckSum; //private Contacts mContacts; private string mWebAddress=""; private AssignedDocs mDocs; private string mPopUpNotes=""; private Guid mClientGroupID; private bool mBillHeadOffice;// private Guid mHeadOfficeID=Guid.Empty;// private string mNotes=""; private Guid mDefaultServiceTemplateID;// private Guid mRegionID; private string mTechNotes=""; // private string mAccountNumber=""; //Custom fields private string mCustom1=null; private string mCustom2=null; private string mCustom3=null; private string mCustom4=null; private string mCustom5=null; private string mCustom6=null; private string mCustom7=null; private string mCustom8=null; private string mCustom9=null; private string mCustom0=null; //Contract / bank stuff private bool mUsesBanking; private Guid mContractID; private SmartDate mContractExpires; //Notification internal stuff private bool mContractExpiryChanged=false; //case 3701 private bool mActiveChanged = false; private string mContactNotes = ""; private string mContact = ""; private string mPhone1 = ""; private string mPhone2 = ""; private string mPhone3 = ""; private string mPhone4 = ""; private string mPhone5 = ""; private string mEmail = ""; //case 53 private bool mSendNotifications = true; #endregion #region Constructor /// /// Private constructor to prevent direct instantiation /// private Client() { ////case 1039 //log.Debug("Client()"); //Set to read / write initially so that properties //can be set bReadOnly=false; //New ID mID = Guid.NewGuid(); //prebreak the rule Name=""; Active=true; //Built-in "Default" region mRegionID=Region.DefaultRegionID;//case 58 //Set record history to defaults mCreated = new SmartDate(DBUtil.CurrentWorkingDateTime); mModified=new SmartDate(); mCreator=Guid.Empty; mModifier=Guid.Empty; mUsesBanking=false; mContractID=Guid.Empty; mContractExpires=new SmartDate(); //mDocs=AssignedDocs.NewItems(); } #endregion #region Business properties /// /// Optional identifier for display and reporting purposes /// public string AccountNumber { get { return mAccountNumber; } set { if(bReadOnly) ThrowSetError(); else { if(mAccountNumber!=value) { mAccountNumber = value; BrokenRules.Assert("AccountNumberLength", "Error.Object.FieldLengthExceeded255,Client.Label.AccountNumber","AccountNumber",value.Length>255); MarkDirty(); } } } } /// /// ID /// public Guid DispatchZoneID { get { return mDispatchZoneID; } set { if(bReadOnly) ThrowSetError(); else { if(mDispatchZoneID!=value) { mDispatchZoneID = value; MarkDirty(); } } } } /// /// ID /// public Guid ClientGroupID { get { return mClientGroupID; } set { if(bReadOnly) ThrowSetError(); else { if(mClientGroupID!=value) { mClientGroupID = value; MarkDirty(); } } } } /// /// If Service created from Client screen itself, it defaults to a specific /// workorder template /// Note this doesn't apply if you make a workorder "out of the blue" as it doesn't /// know who you are going to select until after the template is selected. /// public Guid DefaultServiceTemplateID { get { return mDefaultServiceTemplateID; } set { if(bReadOnly) ThrowSetError(); else { if(mDefaultServiceTemplateID!=value) { mDefaultServiceTemplateID = value; MarkDirty(); } } } } /// /// ID /// public Guid HeadOfficeID { get { return mHeadOfficeID; } set { if(bReadOnly) ThrowSetError(); else { if(mHeadOfficeID!=value) { mHeadOfficeID = value; BrokenRules.Assert("HeadOfficeIDRequired", "Error.Object.RequiredFieldEmpty,O.HeadOffice", "BillHeadOffice",value==Guid.Empty && this.mBillHeadOffice==true); MarkDirty(); } } } } /// /// ID /// public Guid RegionID { get { return mRegionID; } set { if(bReadOnly) ThrowSetError(); else { if(mRegionID!=value) { mRegionID = value; BrokenRules.Assert("RegionIDRequired", "Error.Object.RequiredFieldEmpty,O.Region", "RegionID",value==Guid.Empty); MarkDirty(); } } } } /// /// 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; } } /// /// Set/get client name /// public string Name { get { return mName; } set { if(bReadOnly) ThrowSetError(); else { if(mName!=value) { mName = value; BrokenRules.Assert("NameRequired", "Error.Object.RequiredFieldEmpty,Client.Label.Name", "Name",value.Length==0); BrokenRules.Assert("NameLength", "Error.Object.FieldLengthExceeded255,Client.Label.Name", "Name",value.Length>255); MarkDirty(); } } } } /// /// Get /set active status of client /// If active = true then client is selectable for workorders etc /// If active = false then client in not selectable, but history can be viewed /// public bool Active { get { return mActive; } set { if(bReadOnly) ThrowSetError(); else { if(mActive!=value) { mActive = value; //case 3701 mActiveChanged = true; MarkDirty(); } } } } /// /// Get service address for this client /// public Address GoToAddress { get { return mGoToAddress; } } /// /// Get mailing address object for this client /// Returns GoToAddress object if MailToAddress is empty /// public Address MailToAddress { get { return mMailToAddress; } } ///// ///// Get Contacts collection for this object ///// //public Contacts Contacts //{ // get // { // return mContacts; // } //} /// /// web address of client if applicable /// can be null /// ties into hyerlink to web browser /// public string WebAddress { get { return mWebAddress; } set { if(bReadOnly) ThrowSetError(); else { if(mWebAddress!=value) { mWebAddress = value; BrokenRules.Assert("WebAddressLength", "Error.Object.FieldLengthExceeded255,Common.Label.WebAddress", "WebAddress",value.Length>255); MarkDirty(); } } } } /// /// popup notes - need a setting to indicate whether to popup only on new workorder, /// or popup whenever a change too /// Corresponds to clients.alert in AyaNova v1 /// public string PopUpNotes { get { return mPopUpNotes; } set { if(bReadOnly) ThrowSetError(); else { if(mPopUpNotes!=value) { mPopUpNotes = value; MarkDirty(); } } } } /// /// Default is false /// /// public bool BillHeadOffice { get { return mBillHeadOffice; } set { if(bReadOnly) ThrowSetError(); else { if(mBillHeadOffice!=value) { mBillHeadOffice = value; BrokenRules.Assert("HeadOfficeIDRequired", "Error.Object.RequiredFieldEmpty,O.HeadOffice", "BillHeadOffice",value==true && this.mHeadOfficeID==System.Guid.Empty); MarkDirty(); } } } } /// /// General notes about client /// public string Notes { get { return mNotes; } set { if(bReadOnly) ThrowSetError(); else { if(mNotes!=value) { mNotes = value; MarkDirty(); } } } } /// /// Collection of objects tied to this Client object /// public AssignedDocs Docs { get { return mDocs; } } /// /// Corresponds to clients.technotes in AyaNova v1 /// These are notes to display on dispatch reports for tech etc /// public string TechNotes { get { return mTechNotes; } set { if(bReadOnly) ThrowSetError(); else { if(mTechNotes!=value) { mTechNotes = value; MarkDirty(); } } } } #region Contact fields /// /// Set/get client Contact person's name /// public string Contact { get { return mContact; } set { if (bReadOnly) ThrowSetError(); else { if (mContact != value) { mContact = value; BrokenRules.Assert("ContactLength", "Error.Object.FieldLengthExceeded500,Client.Label.Contact", "Contact", value.Length > 500); MarkDirty(); } } } } /// /// Set/get client Phone1 /// public string Phone1 { get { return mPhone1; } set { if (bReadOnly) ThrowSetError(); else { if (mPhone1 != value) { mPhone1 = value; BrokenRules.Assert("Phone1Length", "Error.Object.FieldLengthExceeded255,Client.Label.Phone1", "Phone1", value.Length > 255); MarkDirty(); } } } } /// /// Set/get client Phone2 /// public string Phone2 { get { return mPhone2; } set { if (bReadOnly) ThrowSetError(); else { if (mPhone2 != value) { mPhone2 = value; BrokenRules.Assert("Phone2Length", "Error.Object.FieldLengthExceeded255,Client.Label.Phone2", "Phone2", value.Length > 255); MarkDirty(); } } } } /// /// Set/get client Phone3 /// public string Phone3 { get { return mPhone3; } set { if (bReadOnly) ThrowSetError(); else { if (mPhone3 != value) { mPhone3 = value; BrokenRules.Assert("Phone3Length", "Error.Object.FieldLengthExceeded255,Client.Label.Phone3", "Phone3", value.Length > 255); MarkDirty(); } } } } /// /// Set/get client Phone4 /// public string Phone4 { get { return mPhone4; } set { if (bReadOnly) ThrowSetError(); else { if (mPhone4 != value) { mPhone4 = value; BrokenRules.Assert("Phone4Length", "Error.Object.FieldLengthExceeded255,Client.Label.Phone4", "Phone4", value.Length > 255); MarkDirty(); } } } } /// /// Set/get client Phone5 /// public string Phone5 { get { return mPhone5; } set { if (bReadOnly) ThrowSetError(); else { if (mPhone5 != value) { mPhone5 = value; BrokenRules.Assert("Phone5Length", "Error.Object.FieldLengthExceeded255,Client.Label.Phone5", "Phone5", value.Length > 255); MarkDirty(); } } } } /// /// Set/get client Email /// public string Email { get { return mEmail; } set { if (bReadOnly) ThrowSetError(); else { if (mEmail != value) { mEmail = value; BrokenRules.Assert("EmailLength", "Error.Object.FieldLengthExceeded255,Client.Label.Email", "Email", value.Length > 255); MarkDirty(); } } } } /// /// Contact Notes / Other contacts /// public string ContactNotes { get { return mContactNotes; } set { if (bReadOnly) ThrowSetError(); else { if (mContactNotes != value) { mContactNotes = value; MarkDirty(); } } } } #endregion contact fields #region CUSTOM FIELDS /// /// Custom1 /// public string Custom1 { get { return mCustom1; } set { if(bReadOnly) ThrowSetError(); else { if(mCustom1!=value) { mCustom1 = value; BrokenRules.Assert("Custom1Length", "Error.Object.FieldLengthExceeded500,Client.Label.Custom1", "Custom1",value.Length>500); MarkDirty(); } } } } /// /// Custom2 /// public string Custom2 { get { return mCustom2; } set { if(bReadOnly) ThrowSetError(); else { if(mCustom2!=value) { mCustom2 = value; BrokenRules.Assert("Custom2Length", "Error.Object.FieldLengthExceeded500,Client.Label.Custom2","Custom2",value.Length>500); MarkDirty(); } } } } /// /// Custom3 /// public string Custom3 { get { return mCustom3; } set { if(bReadOnly) ThrowSetError(); else { if(mCustom3!=value) { mCustom3 = value; BrokenRules.Assert("Custom3Length", "Error.Object.FieldLengthExceeded500,Client.Label.Custom3", "Custom3",value.Length>500); MarkDirty(); } } } } /// /// Custom4 /// public string Custom4 { get { return mCustom4; } set { if(bReadOnly) ThrowSetError(); else { if(mCustom4!=value) { mCustom4 = value; BrokenRules.Assert("Custom4Length", "Error.Object.FieldLengthExceeded500,Client.Label.Custom4","Custom4",value.Length>500); MarkDirty(); } } } } /// /// Custom5 /// public string Custom5 { get { return mCustom5; } set { if(bReadOnly) ThrowSetError(); else { if(mCustom5!=value) { mCustom5 = value; BrokenRules.Assert("Custom5Length", "Error.Object.FieldLengthExceeded500,Client.Label.Custom5","Custom5",value.Length>500); MarkDirty(); } } } } /// /// Custom6 /// public string Custom6 { get { return mCustom6; } set { if(bReadOnly) ThrowSetError(); else { if(mCustom6!=value) { mCustom6 = value; BrokenRules.Assert("Custom6Length", "Error.Object.FieldLengthExceeded500,Client.Label.Custom6","Custom6",value.Length>500); MarkDirty(); } } } } /// /// Custom7 /// public string Custom7 { get { return mCustom7; } set { if(bReadOnly) ThrowSetError(); else { if(mCustom7!=value) { mCustom7 = value; BrokenRules.Assert("Custom7Length", "Error.Object.FieldLengthExceeded500,Client.Label.Custom7","Custom7",value.Length>500); MarkDirty(); } } } } /// /// Custom8 /// public string Custom8 { get { return mCustom8; } set { if(bReadOnly) ThrowSetError(); else { if(mCustom8!=value) { mCustom8 = value; BrokenRules.Assert("Custom8Length", "Error.Object.FieldLengthExceeded500,Client.Label.Custom8","Custom8",value.Length>500); MarkDirty(); } } } } /// /// Custom9 /// public string Custom9 { get { return mCustom9; } set { if(bReadOnly) ThrowSetError(); else { if(mCustom9!=value) { mCustom9 = value; BrokenRules.Assert("Custom9Length", "Error.Object.FieldLengthExceeded500,Client.Label.Custom9","Custom9",value.Length>500); MarkDirty(); } } } } /// /// Custom0 /// public string Custom0 { get { return mCustom0; } set { if(bReadOnly) ThrowSetError(); else { if(mCustom0!=value) { mCustom0 = value; BrokenRules.Assert("Custom0Length", "Error.Object.FieldLengthExceeded500,Client.Label.Custom0","Custom0",value.Length>500); MarkDirty(); } } } } #endregion custom fields /// /// If true then banked service is tracked /// for this object (hours / money / incidents) /// public bool UsesBanking { get { return mUsesBanking; } set { if(bReadOnly) ThrowSetError(); else { if(mUsesBanking!=value) { mUsesBanking = value; MarkDirty(); } } } } /// /// Contract that applies to this object /// or Guid.Empty if no contract /// public Guid ContractID { get { return mContractID; } set { if(bReadOnly) ThrowSetError(); else { if(mContractID!=value) { mContractID = value; MarkDirty(); } } } } /// /// Retrieves the name of the contract for this client /// or an empty string if there is no contract set /// public string ContractName { get { if(mContractID==Guid.Empty) return ""; return NameFetcher.GetItem("aContract","aName",this.mContractID).RecordName; } } /// /// Date contract expires and no longer applies /// or null if contract does not expire ever /// public object ContractExpires { get { return mContractExpires.DBValue; } set { if(bReadOnly) ThrowSetError(); else { if (!AyaBizUtils.SmartDateEquals(mContractExpires, value)) //Case 298 { mContractExpires.DBValue = value; this.mContractExpiryChanged=true; MarkDirty(); } } } } /// /// If there is a contract and it has not expired returns true /// otherwise false /// public bool ContractInEffect { //Added for Case 231 get { if (mContractID == Guid.Empty) return false; if (mContractExpires.IsEmpty) return true; if (mContractExpires.Date > DBUtil.CurrentWorkingDateTime) return true; return false; } } //Case 518 /// /// If one of the two addresses is empty /// copy the contents from the filled in one /// to the empty one /// /// This method is used during import from QBI and PTI /// public void PopulateBothAddresses() { //short circuit if both the same if (!mGoToAddress.IsEmpty && !mMailToAddress.IsEmpty) return; if (mGoToAddress.IsEmpty && mMailToAddress.IsEmpty) return; //ok, one of these things is empty, the other isn't if (mGoToAddress.IsEmpty) Address.Copy(mMailToAddress,mGoToAddress);//copy mailto to goto else Address.Copy(mGoToAddress, mMailToAddress); ;//copy goto to mailto } /// /// Get all phone numbers and email address in one string /// /// public string GetPrimaryContactDefaultContactInfo() { System.Text.StringBuilder b = new System.Text.StringBuilder(); b.Append(AyaBizUtils.SS(LocalizedTextTable.GetLocalizedTextDirect("Client.Label.Phone1") + ": ", Phone1, "\r\n")); b.Append(AyaBizUtils.SS(LocalizedTextTable.GetLocalizedTextDirect("Client.Label.Phone2") + ": ", Phone2, "\r\n")); b.Append(AyaBizUtils.SS(LocalizedTextTable.GetLocalizedTextDirect("Client.Label.Phone3") + ": ", Phone3, "\r\n")); b.Append(AyaBizUtils.SS(LocalizedTextTable.GetLocalizedTextDirect("Client.Label.Phone4") + ": ", Phone4, "\r\n")); b.Append(AyaBizUtils.SS(LocalizedTextTable.GetLocalizedTextDirect("Client.Label.Phone5") + ": ", Phone5, "\r\n")); b.Append(AyaBizUtils.SS(LocalizedTextTable.GetLocalizedTextDirect("Client.Label.Email") + ": ", Email, "\r\n")); return b.ToString(); } /// /// Flag - indicates if current user can open the wiki page for this object /// See method for details /// /// This is cached for the lifetime of this object /// public bool CanWiki { get { if (!bCanWiki.HasValue) bCanWiki = WikiPage.ShowWikiLink(RootObjectTypes.Client, mID); return bCanWiki.Value; } } //cache the result in case the UI calls this repeatedly private bool? bCanWiki = null; /// /// If true then will receive any notifications /// set up for this client's region /// public bool SendNotifications { get { return mSendNotifications; } set { if (bReadOnly) ThrowSetError(); else { if (mSendNotifications != value) { mSendNotifications = value; MarkDirty(); } } } } /// /// Indicates if item can be duplicated or not /// Item can be duplicated if the current user /// has write rights to this item and this item /// is not dirty or new and IsValid /// public bool CanDuplicate { get { if (!AyaBizUtils.CanWrite(RootObjectTypes.Client)) return false; if (IsDirty || IsNew || (!IsValid)) return false; return true; } } /// /// Generates a duplicate of this item /// and returns it. /// /// public Client Duplicate() {//case 840 Client dest = Client.NewItem(); dest.Name = DBUtil.CurrentWorkingDateTime.ToString(); dest.AccountNumber = AccountNumber; dest.BillHeadOffice = BillHeadOffice; dest.ClientGroupID = ClientGroupID; dest.Contact = Contact; dest.ContactNotes = ContactNotes; dest.ContractExpires = ContractExpires; dest.ContractID = ContractID; dest.Custom0 = Custom0; dest.Custom1 = Custom1; dest.Custom2 = Custom2; dest.Custom3 = Custom3; dest.Custom4 = Custom4; dest.Custom5 = Custom5; dest.Custom6 = Custom6; dest.Custom7 = Custom7; dest.Custom8 = Custom8; dest.Custom9 = Custom9; dest.DefaultServiceTemplateID = DefaultServiceTemplateID; dest.DispatchZoneID = DispatchZoneID; dest.Email = Email; dest.GoToAddress.City = GoToAddress.City; dest.GoToAddress.Country = GoToAddress.Country; dest.GoToAddress.CountryCode = GoToAddress.CountryCode; dest.GoToAddress.DeliveryAddress = GoToAddress.DeliveryAddress; dest.GoToAddress.LatHemisphere = GoToAddress.LatHemisphere; dest.GoToAddress.Latitude = GoToAddress.Latitude; dest.GoToAddress.LongHemisphere = GoToAddress.LongHemisphere; dest.GoToAddress.Longitude = GoToAddress.Longitude; dest.GoToAddress.Postal = GoToAddress.Postal; dest.GoToAddress.StateProv = GoToAddress.StateProv; dest.MailToAddress.City = MailToAddress.City; dest.MailToAddress.Country = MailToAddress.Country; dest.MailToAddress.CountryCode = MailToAddress.CountryCode; dest.MailToAddress.DeliveryAddress = MailToAddress.DeliveryAddress; dest.MailToAddress.LatHemisphere = MailToAddress.LatHemisphere; dest.MailToAddress.Latitude = MailToAddress.Latitude; dest.MailToAddress.LongHemisphere = MailToAddress.LongHemisphere; dest.MailToAddress.Longitude = MailToAddress.Longitude; dest.MailToAddress.Postal = MailToAddress.Postal; dest.MailToAddress.StateProv = MailToAddress.StateProv; dest.HeadOfficeID = HeadOfficeID; dest.Notes = Notes; dest.Phone1 = Phone1; dest.Phone2 = Phone2; dest.Phone3 = Phone3; dest.Phone4 = Phone4; dest.Phone5 = Phone5; dest.PopUpNotes = PopUpNotes; dest.RegionID = RegionID; dest.SendNotifications = SendNotifications; dest.TechNotes = TechNotes; dest.UsesBanking = UsesBanking; dest.WebAddress = WebAddress; return dest; } /// /// Read only UI convenience property /// true if client has tech notes /// public bool uiHasTechNotes { get { return !string.IsNullOrWhiteSpace(mTechNotes); } } /// /// 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.Client") ) ); } #endregion #region System.object overrides /// /// /// /// public override string ToString() { return "Client" + mID.ToString(); } /// /// /// /// /// public override bool Equals(Object obj) { if ( obj == null || GetType ( ) != obj.GetType ( ) ) return false; Client c=(Client)obj; return mID==c.mID; } /// /// /// /// public override int GetHashCode() { return ("Client"+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) { if(AyaBizUtils.Right("Object.Client")<(int)SecurityLevelTypes.ReadOnly) return new SearchResult(); SearchResult sr=new SearchResult(); System.Text.StringBuilder sb = new System.Text.StringBuilder(); SafeDataReader dr = null; try { dr=DBUtil.GetReaderFromSQLString( "SELECT aRegionID, aCreated, aModified, aCreator, aModifier, aName, " + //case 58 "aWebAddress, aPopUpNotes, aNotes, aTechNotes, AACCOUNTNUMBER, " + "aContactNotes,aContact,aPhone1,aPhone2,aPhone3,aPhone4,aPhone5,aEmail, " + "aCustom1, aCustom2, aCustom3, aCustom4, aCustom5, " + "aCustom6, aCustom7, aCustom8, aCustom9, aCustom0 FROM aClient WHERE (aID = @ID)" ,ID); if(!dr.Read()) return new SearchResult();//DBUtil.ThrowFetchError("SearchResult for ClientID: " + ID.ToString()); if(!AyaBizUtils.InYourRegion(dr.GetGuid("aRegionID"))) return new SearchResult();//case 58 sr.Description=dr.GetString("aName"); sb.Append(sr.Description); sb.Append(" "); sb.Append(dr.GetString("aWebAddress")); sb.Append(" "); sb.Append(dr.GetString("aPopUpNotes")); sb.Append(" "); sb.Append(dr.GetString("aNotes")); sb.Append(" "); sb.Append(dr.GetString("aTechNotes")); sb.Append(" "); sb.Append(dr.GetString("aContactNotes")); sb.Append(" "); sb.Append(dr.GetString("aContact")); sb.Append(" "); sb.Append(dr.GetString("aPhone1")); sb.Append(" "); sb.Append(dr.GetString("aPhone2")); sb.Append(" "); sb.Append(dr.GetString("aPhone3")); sb.Append(" "); sb.Append(dr.GetString("aPhone4")); sb.Append(" "); sb.Append(dr.GetString("aPhone5")); sb.Append(" "); sb.Append(dr.GetString("aEmail")); sb.Append(" "); sb.Append(dr.GetString("AACCOUNTNUMBER")); sb.Append(" "); sb.Append(dr.GetString("aCustom0")); sb.Append(" "); sb.Append(dr.GetString("aCustom1")); sb.Append(" "); sb.Append(dr.GetString("aCustom2")); sb.Append(" "); sb.Append(dr.GetString("aCustom3")); sb.Append(" "); sb.Append(dr.GetString("aCustom4")); sb.Append(" "); sb.Append(dr.GetString("aCustom5")); sb.Append(" "); sb.Append(dr.GetString("aCustom6")); sb.Append(" "); sb.Append(dr.GetString("aCustom7")); sb.Append(" "); sb.Append(dr.GetString("aCustom8")); sb.Append(" "); sb.Append(dr.GetString("aCustom9")); 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(); } //Added 02-Aug-2006 was not returning address search results :( #region Address block try { dr = DBUtil.GetReaderFromSQLString( "SELECT adeliveryaddress, acity, astateprov, acountrycode, acountry, apostal " + "from aaddress " + "where " + "arootobjectid=@ID " , ID); while (dr.Read()) { sb.Append(" "); sb.Append(dr.GetString("adeliveryaddress")); sb.Append(" "); sb.Append(dr.GetString("acity")); sb.Append(" "); sb.Append(dr.GetString("astateprov")); sb.Append(" "); sb.Append(dr.GetString("acountrycode")); sb.Append(" "); sb.Append(dr.GetString("acountry")); sb.Append(" "); sb.Append(dr.GetString("apostal")); } } finally { if (dr != null) dr.Close(); } #endregion //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.Client; return sr; } #endregion #region Static methods //Key to identify which reports can be generated from this object //public static string ReportKey {get{return "ClientList";}} /// /// Create new Client /// /// Client public static Client NewItem() { Client c; if(AyaBizUtils.Right("Object.Client")>(int)SecurityLevelTypes.ReadOnly) { c = new Client(); c.mGoToAddress=Address.NewItem(); c.mGoToAddress.RootObjectID=c.mID; c.mGoToAddress.RootObjectType=RootObjectTypes.Client; c.mGoToAddress.AddressType=AddressTypes.Physical; c.mMailToAddress=Address.NewItem(); c.mMailToAddress.RootObjectID=c.mID; c.mMailToAddress.RootObjectType=RootObjectTypes.Client; c.mMailToAddress.AddressType=AddressTypes.Postal; c.mDocs=AssignedDocs.NewItems(); return c; } else throw new System.Security.SecurityException( string.Format( LocalizedTextTable.GetLocalizedTextDirect("Error.Security.NotAuthorizedToCreate"), LocalizedTextTable.GetLocalizedTextDirect("O.Client"))); } /// /// Fetch client internally without tracking in MRU list /// /// /// /// public static Client GetItemNoMRU(Guid _ID) { if (_ID == AyaBizUtils.NewObjectGuid) return NewItem(); if (AyaBizUtils.Right("Object.Client") > (int)SecurityLevelTypes.NoAccess) { Client c = (Client)DataPortal.Fetch(new Criteria(_ID, false)); return c; } else throw new System.Security.SecurityException( string.Format( LocalizedTextTable.GetLocalizedTextDirect("Error.Security.NotAuthorizedToRetrieve"), LocalizedTextTable.GetLocalizedTextDirect("O.Client"))); } /// /// Fetch existing Client /// /// Client /// Client Guid public static Client GetItem(Guid _ID) { if (_ID == AyaBizUtils.NewObjectGuid) return NewItem(); if (AyaBizUtils.Right("Object.Client") > (int)SecurityLevelTypes.NoAccess) { Client c=(Client)DataPortal.Fetch(new Criteria(_ID,true)); return c; } else throw new System.Security.SecurityException( string.Format( LocalizedTextTable.GetLocalizedTextDirect("Error.Security.NotAuthorizedToRetrieve"), LocalizedTextTable.GetLocalizedTextDirect("O.Client"))); } /// /// Delete Client /// /// Client GUID public static void DeleteItem(Guid _ID) { if (AyaBizUtils.Right("Object.Client") > (int)SecurityLevelTypes.ReadWrite) { DataPortal.Delete(new Criteria(_ID,true)); } else throw new System.Security.SecurityException( string.Format( LocalizedTextTable.GetLocalizedTextDirect("Error.Security.NotAuthorizedToDelete"), LocalizedTextTable.GetLocalizedTextDirect("O.Client"))); } /// /// Delete all Workorders service, quote or PM for client /// ** This is not reversable ** /// Can only be done by manager account /// /// Client GUID /// Text result of operation public static string DeleteAllClientWorkorders(Guid _ID) { System.Text.StringBuilder sbRet = new System.Text.StringBuilder(); if (User.IsAdmin) { Guid clientId = _ID; #region Delete all workorders { //Delete all service workorders string serviceWorkorderListCriteria = " \r\n" + " \r\n" + " \r\n" + " \r\n" + " \r\n" + " \r\n" + ""; //find all service workorders and then try to delete them sbRet.AppendLine("Delete all service workorders..."); var woslist = WorkorderServiceList.GetList(serviceWorkorderListCriteria); if (woslist.Count > 0) { foreach (WorkorderServiceList.WorkorderServiceListInfo i in woslist) { var w = Workorder.GetItemNoMRU(i.LT_O_Workorder.Value); try { if (!w.IsDeleteable) { w.Closed = false; w.Delete(); w.Save(); } else { w.Delete(); w.Save(); } } catch (Exception ex) { while (ex.InnerException != null) ex = ex.InnerException; sbRet.AppendLine("Unable to delete workorder " + w.uiDisplayVisibleIDNumber + " due to: " + ex.Message); } } } //sbRet.AppendLine("completed deleting service workorders"); } { //Delete all quotes string quoteListCriteria = " \r\n" + " \r\n" + " \r\n" + " \r\n" + " \r\n" + " \r\n" + " \r\n"; //find all quotes and then try to delete them sbRet.AppendLine("Delete all Quotes..."); var woq = WorkorderQuoteList.GetList(quoteListCriteria); if (woq.Count > 0) { foreach (WorkorderQuoteList.WorkorderQuoteListInfo i in woq) { var w = Workorder.GetItemNoMRU(i.LT_O_WorkorderQuote.Value); try { if (!w.IsDeleteable) { w.Closed = false; w.Delete(); w.Save(); } else { w.Delete(); w.Save(); } } catch (Exception ex) { while (ex.InnerException != null) ex = ex.InnerException; sbRet.AppendLine("Unable to delete Quote " + w.uiDisplayVisibleIDNumber + " due to: " + ex.Message); } } } //sbRet.AppendLine("completed deleting quotes"); } { //Delete all PM's string pmListCriteria = " \r\n" + " \r\n" + " \r\n" + " \r\n" + " \r\n" + " \r\n" + " "; //find all quotes and then try to delete them sbRet.AppendLine("Delete all Preventive Maintenance records..."); var wopm = WorkorderPMList.GetList(pmListCriteria); if (wopm.Count > 0) { foreach (WorkorderPMList.WorkorderPMListInfo i in wopm) { var w = Workorder.GetItemNoMRU(i.LT_O_WorkorderPreventiveMaintenance.Value); try { if (!w.IsDeleteable) { w.Closed = false; w.Delete(); w.Save(); } else { w.Delete(); w.Save(); } } catch (Exception ex) { while (ex.InnerException != null) ex = ex.InnerException; sbRet.AppendLine("Unable to delete Preventive Maintenance " + w.uiDisplayVisibleIDNumber + " due to: " + ex.Message); } } } // sbRet.AppendLine("completed deleting Preventive Maintenance"); } #endregion; } else { sbRet.AppendLine("Only the administrator account can delete all client workorders"); } return sbRet.ToString(); } /// /// Delete all Units for client /// ** This is not reversable ** /// Can only be done by manager account /// /// Client GUID /// Text result of operation public static string DeleteAllClientUnits(Guid _ID) { System.Text.StringBuilder sbRet = new System.Text.StringBuilder(); if (User.IsAdmin) { Guid clientId = _ID; #region Delete all units { sbRet.AppendLine("Delete all units..."); var upl = UnitPickList.GetListByClient(clientId); if (upl.Count > 0) { foreach (UnitPickList.UnitPickListInfo i in upl) { try { Unit.DeleteItem(i.ID); } catch (Exception ex) { while (ex.InnerException != null) ex = ex.InnerException; sbRet.AppendLine("Unable to delete unit " + i.Serial + " due to: " + ex.Message); } } } // sbRet.AppendLine("completed deleting units"); } #endregion; } else { sbRet.AppendLine("Only the administrator account can delete all client units"); } return sbRet.ToString(); } /// /// Check for the existance of a Client /// in the database by ID OR by Name /// /// Guid of client or Guid.Empty if checking by name /// Name of client (case sensitive) or empty string "" if checking by ID /// public static bool Exists(Guid ID, string Name) { // return ExistsHelper.GetExists(ID,Name); //case 496 return ClientExistanceChecker.ClientExists(ID, Name); } //case 1404 /// /// Get the ID of a client from it's name /// /// Name of client (case sensitive) or empty string "" if checking by ID /// Guid empty if not found else the id of the client with matching name public static Guid IDFromName( string Name) { return ClientExistanceChecker.ClientExists(Name).mClientID; } /// /// Retrieve internal ID from AccountNumber. /// /// /// Text value /// Guid ID value or Guid.Empty if no match public static Guid GetIDFromAccountNumber(string AccountNumber) { return GuidFetcher.GetItem("ACLIENT", "AACCOUNTNUMBER", AccountNumber); } #endregion #region Shared Notification Message Processor internal static NotifyMessage GetNotificationMessage(NotifyMessageRequestData d) { //string Language=User.GetUserLanguage(MessageForUserID); Client c=Client.GetItemNoMRU(d.RootObjectID); string sEventDescription=LocalizedTextTable.GetLocalizedTextDirect("Client.Label.Event.ContractExpire",d.Language); string sMessage=sEventDescription; string sSubject=sEventDescription; NotifyMessage nm=null; //case 1415 string sContractExpires = c.ContractExpires.ToString(); if (!Convert.IsDBNull(c.ContractExpires)) {//if it's not dbnull then it's a date object DateTime dtExpires = (DateTime)c.ContractExpires; if (d.TimeZoneOffset != 0) { dtExpires = dtExpires.ToUniversalTime().AddHours(d.TimeZoneOffset); sContractExpires = dtExpires.ToString(); } } if(d.Format==NotifyDeliveryMessageFormats.Brief) { sMessage += "-" + c.Name + "-" + sContractExpires;//case 1415 if(d.MaxCharacters > 0 && sMessage.Length>d.MaxCharacters) nm=new NotifyMessage("", sMessage.Substring(0,d.MaxCharacters)); else nm=new NotifyMessage("", sMessage); } else { sSubject+=": " + c.Name; sMessage += ": " + sContractExpires + "\r\n" + c.Name + "\r\n" + LocalizedTextTable.GetLocalizedTextDirect("O.Contract", d.Language) + ": " + c.ContractName; nm=new NotifyMessage(sSubject,sMessage); } return nm; } #endregion #region DAL Data Access #region Fetch /// /// protected override void DataPortal_Fetch(object Criteria) { //set to false to load items initially bReadOnly=false; Criteria crit = (Criteria)Criteria; SafeDataReader dr = null; try { //original dr=DBUtil.GetReaderFromSQLString("SELECT * FROM aClient WHERE aID=@ID;",crit.ID); if(!dr.Read()) DBUtil.ThrowFetchError("Client ID: " + crit.ID.ToString()); //Standard fields mID=dr.GetGuid("aID"); mCreated=DBUtil.ToLocal(dr.GetSmartDate("aCreated")); mModified=DBUtil.ToLocal(dr.GetSmartDate("aModified")); mCreator=dr.GetGuid("aCreator"); mModifier=dr.GetGuid("aModifier"); //Custom fields mCustom1=dr.GetString("aCustom1"); mCustom2=dr.GetString("aCustom2"); mCustom3=dr.GetString("aCustom3"); mCustom4=dr.GetString("aCustom4"); mCustom5=dr.GetString("aCustom5"); mCustom6=dr.GetString("aCustom6"); mCustom7=dr.GetString("aCustom7"); mCustom8=dr.GetString("aCustom8"); mCustom9=dr.GetString("aCustom9"); mCustom0=dr.GetString("aCustom0"); //Client fields mActive=dr.GetBoolean("AACTIVE"); //Use the property, NOT the private attribute //because this is pre-broken in the constructor //to ensure a name is chosen / loaded from db //only way to unbreak it is to go through //the property accessor to load from db Name=dr.GetString("aName"); mDispatchZoneID=dr.GetGuid("aDispatchZoneID"); mWebAddress=dr.GetString("aWebAddress"); mPopUpNotes=dr.GetString("aPopUpNotes"); mClientGroupID=dr.GetGuid("aClientGroupID"); mBillHeadOffice=dr.GetBoolean("aBillHeadOffice"); mHeadOfficeID=dr.GetGuid("aHeadOfficeID"); mNotes=dr.GetString("aNotes"); mDefaultServiceTemplateID = dr.GetGuid("ADEFAULTSERVICETEMPLATEID"); mRegionID=dr.GetGuid("aRegionID"); mTechNotes=dr.GetString("aTechNotes"); mAccountNumber=dr.GetString("AACCOUNTNUMBER"); mUsesBanking=dr.GetBoolean("aUsesBanking"); mContractID=dr.GetGuid("aContractID"); mContractExpires=DBUtil.ToLocal(dr.GetSmartDate("aContractExpires")); mContactNotes = dr.GetString("aContactNotes"); mContact = dr.GetString("aContact"); mPhone1 = dr.GetString("aPhone1"); mPhone2 = dr.GetString("aPhone2"); mPhone3 = dr.GetString("aPhone3"); mPhone4 = dr.GetString("aPhone4"); mPhone5 = dr.GetString("aPhone5"); mEmail = dr.GetString("aEmail"); mSendNotifications = dr.GetBoolean("ASENDNOTIFICATIONS"); if(dr!=null) dr.Close(); //Load children: //GoToAddress dr=DBUtil.GetReaderFromSQLString("SELECT * " + "FROM AADDRESS WHERE aRootObjectID=@ID AND " + "aRootObjectType=3 AND AADDRESSTYPE=2",crit.ID); if(dr.Read()) mGoToAddress=Address.GetItem(dr); if(dr!=null) dr.Close(); //MailToAddress dr=DBUtil.GetReaderFromSQLString("SELECT * " + "FROM AADDRESS WHERE aRootObjectID=@ID AND " + "aRootObjectType=3 AND AADDRESSTYPE=1",crit.ID); if(dr.Read()) mMailToAddress=Address.GetItem(dr); if(dr!=null) dr.Close(); //Docs dr=DBUtil.GetReaderFromSQLString("SELECT * FROM AASSIGNEDDOC WHERE (aRootObjectID=@ID AND aRootObjectType=3);",crit.ID); mDocs = AssignedDocs.GetItems(dr, RootObjectTypes.Client, RootObjectTypes.Client); if(dr!=null) dr.Close(); } finally { if(dr!=null) dr.Close(); if(crit.TrackMRU) if(AyaBizUtils.AllowAutomaticMRUOnUpdate) AyaBizUtils.MRU.Add(RootObjectTypes.Client, mID); } MarkOld(); //Get access rights level bReadOnly=AyaBizUtils.Right("Object.Client")<(int)SecurityLevelTypes.ReadWrite; } #endregion #region Update /// /// Called by DataPortal to delete/add/update data into the database /// protected override void DataPortal_Update() { // If not a new record, check if record was modified //by another user since original retrieval: if(!IsNew) DBUtil.CheckSafeToUpdate(this.mModified.Date,this.mID,"aClient"); #region Delete if(IsDeleted) { if(!IsNew) { //Delete object and child objects DBCommandWrapper cmDelete = DBUtil.GetCommandFromSQL("DELETE FROM aClient WHERE aID = @ID;"); cmDelete.AddInParameter("@ID",DbType.Guid,this.mID); //Delete all address record types with matching root object ID DBCommandWrapper cmDeleteAddress = DBUtil.GetCommandFromSQL("DELETE FROM AADDRESS WHERE aRootObjectID = @ID;"); cmDeleteAddress.AddInParameter("@ID",DbType.Guid,this.mID); //case 3598 //Delete all User records that are client type for this client DBCommandWrapper cmDeleteUser = DBUtil.GetCommandFromSQL("DELETE FROM AUSER WHERE ACLIENTID = @ID;"); cmDeleteUser.AddInParameter("@ID", DbType.Guid, this.mID); //case 3600 //Delete all User records that are client type for this client DBCommandWrapper cmDeleteNotes = DBUtil.GetCommandFromSQL("DELETE FROM ACLIENTNOTE WHERE ACLIENTID = @ID;"); cmDeleteNotes.AddInParameter("@ID", DbType.Guid, this.mID); //case 3601 //Delete all User records that are client type for this client DBCommandWrapper cmDeleteCsr = DBUtil.GetCommandFromSQL("DELETE FROM ACLIENTSERVICEREQUEST WHERE ACLIENTID = @ID;"); cmDeleteCsr.AddInParameter("@ID", DbType.Guid, this.mID); //case 3602 DBCommandWrapper cmClearDropShipOnPO = DBUtil.GetCommandFromSQL("UPDATE APURCHASEORDER SET ADROPSHIPTOCLIENTID = null WHERE ADROPSHIPTOCLIENTID = @ID"); cmClearDropShipOnPO.AddInParameter("@ID", DbType.Guid, this.mID); using (IDbConnection connection = DBUtil.DB.GetConnection()) { connection.Open(); IDbTransaction transaction = connection.BeginTransaction(); try { DBUtil.RemoveKeywords(transaction,RootObjectTypes.Client,this.mID); DBUtil.RemoveDocs(transaction,RootObjectTypes.Client,this.mID); DBUtil.DB.ExecuteNonQuery(cmDeleteAddress, transaction); DBUtil.DB.ExecuteNonQuery(cmDeleteUser, transaction);//case 3598 DBUtil.DB.ExecuteNonQuery(cmDeleteNotes, transaction);//case 3600 DBUtil.DB.ExecuteNonQuery(cmDeleteCsr, transaction);//case 3601 DBUtil.DB.ExecuteNonQuery(cmClearDropShipOnPO, transaction);//case 3602 DBUtil.DB.ExecuteNonQuery(cmDelete, transaction); // Commit the transaction transaction.Commit(); } catch { // Rollback transaction transaction.Rollback(); throw; } finally { connection.Close(); } } //Remove any events for this object if (AyaBizUtils.GlobalSettings.UseNotification)//Case 510 { NotifyEvent.RemoveAllEventsForObject(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 aClient (aID, aName, AACTIVE, aDispatchZoneID, aWebAddress, aPopUpNotes, " + "aClientGroupID, aBillHeadOffice, aHeadOfficeID, aNotes, ADEFAULTSERVICETEMPLATEID, " + "aRegionID, aTechNotes, AACCOUNTNUMBER, aCreated, aModified,aCreator,aModifier, " + "aCustom1, aCustom2, aCustom3, aCustom4, aCustom5, aCustom6, aCustom7, aCustom8, aCustom9, aCustom0, " + "aUsesBanking, aContractID, aContractExpires, aContactNotes, aContact, aPhone1, aPhone2, aPhone3, aPhone4, aPhone5, aEmail, " + "aSendNotifications) " + "VALUES (@ID,@Name,@Active,@DispatchZoneID,@WebAddress,@PopUpNotes, " + "@ClientGroupID,@BillHeadOffice,@HeadOfficeID,@Notes,@DefaultServiceTemplateID, " + "@RegionID,@TechNotes,@AccountNumber,@Created, @Modified, @CurrentUserID,@CurrentUserID, " + "@Custom1,@Custom2,@Custom3,@Custom4,@Custom5,@Custom6,@Custom7,@Custom8,@Custom9,@Custom0, " + "@UsesBanking, @ContractID, " + "@ContractExpires, @ContactNotes, @Contact, @Phone1, @Phone2, @Phone3, @Phone4, @Phone5, @Email, @SendNotifications);" ); else cm=DBUtil.GetCommandFromSQL( "UPDATE aClient SET aID=@ID, aName=@Name, AACTIVE=@Active, " + "aDispatchZoneID=@DispatchZoneID, aWebAddress=@WebAddress, " + "aPopUpNotes=@PopUpNotes, aClientGroupID=@ClientGroupID, " + "aBillHeadOffice=@BillHeadOffice, " + "aHeadOfficeID=@HeadOfficeID, aNotes=@Notes, " + "ADEFAULTSERVICETEMPLATEID=@DefaultServiceTemplateID, " + "aRegionID=@RegionID, aTechNotes=@TechNotes, " + "AACCOUNTNUMBER=@AccountNumber, aModifier=@CurrentUserID, " + "aModified=@Modified, aCustom1=@Custom1, " + "aCustom2=@Custom2, aCustom3=@Custom3, aCustom4=@Custom4, " + "aCustom5=@Custom5, aCustom6=@Custom6, " + "aCustom7=@Custom7, aCustom8=@Custom8, aCustom9=@Custom9, " + "aCustom0=@Custom0, aUsesBanking=@UsesBanking, " + "aContractID=@ContractID, aContractExpires=@ContractExpires, " + "aContactNotes=@ContactNotes, " + "aContact=@Contact, aPhone1=@Phone1, aPhone2=@Phone2, aPhone3=@Phone3, aPhone4=@Phone4, aPhone5=@Phone5, aEmail=@Email, " + "aSendNotifications=@SendNotifications " + "WHERE aID=@ID;" ); cm.AddInParameter("@ID",DbType.Guid,mID); cm.AddInParameter("@Active",DbType.Boolean, mActive); cm.AddLargeStringInParameter("@Notes", mNotes); cm.AddInParameter("@DispatchZoneID",DbType.Guid, mDispatchZoneID); cm.AddInParameter("@RegionID",DbType.Guid, mRegionID); cm.AddInParameter("@Name",DbType.String, mName); cm.AddInParameter("@WebAddress",DbType.String, mWebAddress); cm.AddLargeStringInParameter("@PopUpNotes", mPopUpNotes); cm.AddInParameter("@ClientGroupID",DbType.Guid,mClientGroupID); cm.AddInParameter("@BillHeadOffice",DbType.Boolean, mBillHeadOffice); cm.AddInParameter("@HeadOfficeID",DbType.Guid,mHeadOfficeID); cm.AddInParameter("@DefaultServiceTemplateID",DbType.Guid,mDefaultServiceTemplateID); cm.AddLargeStringInParameter("@TechNotes", mTechNotes); cm.AddInParameter("@AccountNumber",DbType.String, mAccountNumber); cm.AddInParameter("@UsesBanking",DbType.Boolean, mUsesBanking); cm.AddInParameter("@ContractID",DbType.Guid,mContractID); //case 763 if(mContractExpires.IsEmpty) mContractExpires.Date = new DateTime(2100, 1, 1); cm.AddInParameter("@ContractExpires",DbType.DateTime, DBUtil.ToUTC(mContractExpires).DBValue);//case 863 was not converting to utc before saving cm.AddLargeStringInParameter("@ContactNotes", mContactNotes); cm.AddInParameter("@Contact", DbType.String, mContact); cm.AddInParameter("@Phone1", DbType.String, mPhone1); cm.AddInParameter("@Phone2", DbType.String, mPhone2); cm.AddInParameter("@Phone3", DbType.String, mPhone3); cm.AddInParameter("@Phone4", DbType.String, mPhone4); cm.AddInParameter("@Phone5", DbType.String, mPhone5); cm.AddInParameter("@Email", DbType.String, mEmail); cm.AddInParameter("@SendNotifications", DbType.Boolean, mSendNotifications); //Standard fields cm.AddInParameter("@CurrentUserID",DbType.Guid, CurrentUserID); cm.AddInParameter("@Created",DbType.DateTime, DBUtil.ToUTC(mCreated).DBValue); cm.AddInParameter("@Modified",DbType.DateTime, DBUtil.ToUTC(dtModified)); //Custom fields cm.AddLargeStringInParameter("@Custom1", mCustom1); cm.AddLargeStringInParameter("@Custom2", mCustom2); cm.AddLargeStringInParameter("@Custom3", mCustom3); cm.AddLargeStringInParameter("@Custom4", mCustom4); cm.AddLargeStringInParameter("@Custom5", mCustom5); cm.AddLargeStringInParameter("@Custom6", mCustom6); cm.AddLargeStringInParameter("@Custom7", mCustom7); cm.AddLargeStringInParameter("@Custom8", mCustom8); cm.AddLargeStringInParameter("@Custom9", mCustom9); cm.AddLargeStringInParameter("@Custom0", mCustom0); using (IDbConnection connection = DBUtil.DB.GetConnection()) { connection.Open(); IDbTransaction transaction = connection.BeginTransaction(); try { DBUtil.DB.ExecuteNonQuery(cm, transaction); //Update child objects //GoToAddress mGoToAddress.Update(RootObjectTypes.Client,mID,AddressTypes.Physical,transaction); //MailToAddress mMailToAddress.Update(RootObjectTypes.Client,mID,AddressTypes.Postal,transaction); //Docs mDocs.Update(transaction); //Process keywords DBUtil.ProcessKeywords(transaction,this.mID,RootObjectTypes.Client,IsNew,AyaBizUtils.Break(false, mAccountNumber,mGoToAddress.FullAddress,mMailToAddress.FullAddress, mName,mNotes,mPopUpNotes,mTechNotes,mWebAddress, mContactNotes, mContact, mPhone1, mPhone2, mPhone3, mPhone4, mPhone5, mEmail, /*Custom fields*/ mCustom1,mCustom2,mCustom3,mCustom4,mCustom5,mCustom6,mCustom7,mCustom8,mCustom9,mCustom0)); MarkOld();//db is now synched with object // Commit the transaction transaction.Commit(); } catch { // Rollback transaction transaction.Rollback(); throw; } finally { connection.Close(); } //Successful update so //change modification time to match this.mModified.Date=dtModified; if (AyaBizUtils.AllowAutomaticMRUOnUpdate) { AyaBizUtils.MRU.Add(RootObjectTypes.Client, mID); //Test with DP: //calling save here *does* save it for a dp connection //so need to call save inside dp if using dp every transaction // And AyaNova needs to use fresh MRU every time so //Ayabizutils should always provide fresh no caching if it's a dp //in use AyaBizUtils.MRU.Save(); } //Process events as necessary if (AyaBizUtils.GlobalSettings.UseNotification)//Case 510 { //Contract expires event changed? if(this.mContractExpiryChanged) { if(this.mContractExpires.IsEmpty) NotifyEvent.RemoveSpecificEventForObject(this.mID,(int)ClientEvent.ContractExpire); else NotifyEvent.AddOrUpdateEvent(RootObjectTypes.Client,this.mID,(int)ClientEvent.ContractExpire,Guid.Empty,this.mContractExpires,Guid.Empty); } } //case 3701 set pm's inactive if client is now inactive if (this.mActiveChanged && this.mActive == false) { //because firebird doesn't support updating through a join statement //Need to fetch as a list object first then update them all... //Find all PM's for this client string pmListCriteria = " \r\n" + " \r\n" + " \r\n" + " \r\n" + " \r\n" + " \r\n" + " "; var wopm = WorkorderPMList.GetList(pmListCriteria); if (wopm.Count > 0) { foreach (WorkorderPMList.WorkorderPMListInfo i in wopm) { if (i.LT_O_WorkorderPreventiveMaintenance.Value != Guid.Empty) { DBCommandWrapper cmPM = DBUtil.GetCommandFromSQL( "UPDATE " + " AWORKORDERPREVENTIVEMAINTENANCE " + " SET " + " AACTIVE=0 " + " WHERE AWORKORDERID=@PMID " ); cmPM.AddInParameter("@PMID", DbType.Guid, i.LT_O_WorkorderPreventiveMaintenance.Value); DBUtil.DB.ExecuteNonQuery(cmPM); } } } } } #endregion } #endregion #region Delete /// /// Remove a Client record . /// /// protected override void DataPortal_Delete(object Criteria) { Criteria crit = (Criteria)Criteria; //Delete object and child objects DBCommandWrapper cmDelete = DBUtil.GetCommandFromSQL("DELETE FROM aClient WHERE aID = @ID;"); cmDelete.AddInParameter("@ID",DbType.Guid,crit.ID); //Delete all address record types with matching root object ID DBCommandWrapper cmDeleteAddress = DBUtil.GetCommandFromSQL("DELETE FROM AADDRESS WHERE aRootObjectID = @ID;"); cmDeleteAddress.AddInParameter("@ID",DbType.Guid,crit.ID); //case 3598 //Delete all User records that are client type for this client DBCommandWrapper cmDeleteUser = DBUtil.GetCommandFromSQL("DELETE FROM AUSER WHERE ACLIENTID = @ID;"); cmDeleteUser.AddInParameter("@ID", DbType.Guid, crit.ID); //case 3600 //Delete all User records that are client type for this client DBCommandWrapper cmDeleteNotes = DBUtil.GetCommandFromSQL("DELETE FROM ACLIENTNOTE WHERE ACLIENTID = @ID;"); cmDeleteNotes.AddInParameter("@ID", DbType.Guid, crit.ID); //case 3601 //Delete all User records that are client type for this client DBCommandWrapper cmDeleteCsr = DBUtil.GetCommandFromSQL("DELETE FROM ACLIENTSERVICEREQUEST WHERE ACLIENTID = @ID;"); cmDeleteCsr.AddInParameter("@ID", DbType.Guid, crit.ID); //case 3602 DBCommandWrapper cmClearDropShipOnPO = DBUtil.GetCommandFromSQL("UPDATE APURCHASEORDER SET ADROPSHIPTOCLIENTID = null WHERE ADROPSHIPTOCLIENTID = @ID"); cmClearDropShipOnPO.AddInParameter("@ID", DbType.Guid, crit.ID); using (IDbConnection connection = DBUtil.DB.GetConnection()) { connection.Open(); IDbTransaction transaction = connection.BeginTransaction(); try { DBUtil.RemoveKeywords(transaction,RootObjectTypes.Client,crit.ID); DBUtil.RemoveDocs(transaction,RootObjectTypes.Client,crit.ID); DBUtil.DB.ExecuteNonQuery(cmDeleteAddress, transaction); DBUtil.DB.ExecuteNonQuery(cmDeleteUser, transaction);//case 3598 DBUtil.DB.ExecuteNonQuery(cmDeleteNotes, transaction);//case 3600 DBUtil.DB.ExecuteNonQuery(cmDeleteCsr, transaction);//case 3601 DBUtil.DB.ExecuteNonQuery(cmClearDropShipOnPO, transaction);//case 3602 DBUtil.DB.ExecuteNonQuery(cmDelete, transaction); // Commit the transaction transaction.Commit(); } catch { // Rollback transaction transaction.Rollback(); throw; } finally { connection.Close(); AyaBizUtils.MRU.Remove(RootObjectTypes.Client, crit.ID); } //Remove any events for this object if (AyaBizUtils.GlobalSettings.UseNotification)//Case 510 { NotifyEvent.RemoveAllEventsForObject(crit.ID); } } } #endregion #endregion #region Override IsValid / IsDirty //Override base class version if there are child objects /// /// /// public override bool IsValid { get { return base.IsValid && mGoToAddress.IsValid && mMailToAddress.IsValid && mDocs.IsValid; } } /// /// /// public override bool IsDirty { get { return base.IsDirty || mGoToAddress.IsDirty || mMailToAddress.IsDirty || mDocs.IsDirty; } } #endregion #region criteria /// /// Criteria for identifying existing object /// [Serializable] private class Criteria { public Guid ID; public bool TrackMRU; public Criteria(Guid _ID, bool _TrackMRU) { ID = _ID; TrackMRU = _TrackMRU; } } #endregion #region Exists //case 496 //[Serializable(), System.ComponentModel.Browsable(false)] // public class ExistsHelper //{ // bool _Exists = false; // Guid _ID; // string _Name; // public ExistsHelper(Guid ID, string Name) // { // _ID=ID; // _Name=Name; // } // public static bool GetExists(Guid ID, string Name) // { // ExistsHelper e=new ExistsHelper(ID,Name); // DataPortal.Update(e); // return e._Exists; // } // public void DataPortal_Update() // { // if(_Name!=null && _Name!="") // { // DBCommandWrapper dbCommandWrapper = DBUtil.DB.GetSqlStringCommandWrapper( // "SELECT aID FROM aClient WHERE " + // "(aName = @ANAME)" // ); // dbCommandWrapper.AddInParameter("@ANAME",DbType.String,_Name); // if(DBUtil.ToGuid(DBUtil.DB.ExecuteScalar(dbCommandWrapper))==Guid.Empty) // this._Exists=false; // else // this._Exists=true; // } // else // { // if(DBUtil.ToGuid(DBUtil.GetScalarFromSQLString( // "SELECT aID FROM aClient WHERE " + // "(aID = @ID)",_ID // ))==Guid.Empty) // this._Exists=false; // else // this._Exists=true; // } // } //} #endregion }//end Client #region Notification events /// /// /// public enum ClientEvent : int { /// /// /// [Description("LT:Client.Label.Event.ContractExpire")] ContractExpire=256 } #endregion }//end namespace GZTW.AyaNova.BLL