using System; using System.Collections.Generic; using System.Text; using GZTW.AyaNova.BLL; using Outlook = Microsoft.Office.Interop.Outlook; using Office = Microsoft.Office.Core; using System.Windows.Forms; using System.Collections; namespace AyaNovaOL { public class ExportContactsToAyaNova { private RootObjectTypes olRootObjectType; private Dictionary mIDList; public bool DoExport(bool bSelectedOnly, Outlook.Explorer exp) { Cursor.Current = Cursors.WaitCursor; if (bSelectedOnly && exp.Selection.Count < 1) return true; olRootObjectType = (RootObjectTypes)AyaNovaOL.Properties.Settings.Default.RootObjectType; //Because fuzzy fetch can only work with client object types we need to build a list of other types first if (olRootObjectType == RootObjectTypes.HeadOffice) { if (mIDList == null) mIDList = new Dictionary(); mIDList.Clear(); GenericNVList l = GenericNVList.GetList("HEADOFFICE", "ID", "NAME", true, false, true); foreach (DictionaryEntry d in l.BindableList) mIDList.Add(d.Value.ToString().ToLower(),new Guid(d.Key.ToString())); } else if (olRootObjectType == RootObjectTypes.Vendor) { if (mIDList == null) mIDList = new Dictionary(); mIDList.Clear(); VendorPickList cpl = VendorPickList.GetList((VendorTypes)AyaNovaOL.Properties.Settings.Default.VendorType); foreach (VendorPickList.VendorPickListInfo i in cpl) mIDList.Add(i.Name.ToLower(), i.ID); } if (bSelectedOnly) { for (int x = 0; x < exp.Selection.Count; x++) { ExportItem((Outlook.ContactItem)exp.Selection[x+1]); } } else { for (int x = 0; x < exp.CurrentFolder.Items.Count; x++) { ExportItem((Outlook.ContactItem)exp.CurrentFolder.Items[x + 1]); } } return true; } private string GetPhoneNumber(RootObjectTypes obType, int nAyaPhoneSlot, Outlook.ContactItem ci) { //////Util.d("Get phone number top. OBTYPE: " + obType.ToString() + ", slot: " + nAyaPhoneSlot.ToString()); #region GetPhoneNumber AYOLPhoneNumberType ptype = AYOLPhoneNumberType.BusinessTelephoneNumber; switch (obType) { case RootObjectTypes.Client: switch (nAyaPhoneSlot) { case 1: ptype = (AYOLPhoneNumberType)AyaNovaOL.Properties.Settings.Default.ClientPhone1; break; case 2: ptype = (AYOLPhoneNumberType)AyaNovaOL.Properties.Settings.Default.ClientPhone2; break; case 3: ptype = (AYOLPhoneNumberType)AyaNovaOL.Properties.Settings.Default.ClientPhone3; break; case 4: ptype = (AYOLPhoneNumberType)AyaNovaOL.Properties.Settings.Default.ClientPhone4; break; case 5: ptype = (AYOLPhoneNumberType)AyaNovaOL.Properties.Settings.Default.ClientPhone5; break; } break; case RootObjectTypes.HeadOffice: switch (nAyaPhoneSlot) { case 1: ptype = (AYOLPhoneNumberType)AyaNovaOL.Properties.Settings.Default.HeadOfficePhone1; break; case 2: ptype = (AYOLPhoneNumberType)AyaNovaOL.Properties.Settings.Default.HeadOfficePhone2; break; case 3: ptype = (AYOLPhoneNumberType)AyaNovaOL.Properties.Settings.Default.HeadOfficePhone3; break; case 4: ptype = (AYOLPhoneNumberType)AyaNovaOL.Properties.Settings.Default.HeadOfficePhone4; break; case 5: ptype = (AYOLPhoneNumberType)AyaNovaOL.Properties.Settings.Default.HeadOfficePhone5; break; } break; case RootObjectTypes.Vendor: switch (nAyaPhoneSlot) { case 1: ptype = (AYOLPhoneNumberType)AyaNovaOL.Properties.Settings.Default.VendorPhone1; break; case 2: ptype = (AYOLPhoneNumberType)AyaNovaOL.Properties.Settings.Default.VendorPhone2; break; case 3: ptype = (AYOLPhoneNumberType)AyaNovaOL.Properties.Settings.Default.VendorPhone3; break; case 4: ptype = (AYOLPhoneNumberType)AyaNovaOL.Properties.Settings.Default.VendorPhone4; break; case 5: ptype = (AYOLPhoneNumberType)AyaNovaOL.Properties.Settings.Default.VendorPhone5; break; } break; } //////Util.d("Get phone number - Got type: " + ptype.ToString()); switch (ptype) { case AYOLPhoneNumberType.Unused: return ""; case AYOLPhoneNumberType.AssistantTelephoneNumber: return ss(ci.AssistantTelephoneNumber); case AYOLPhoneNumberType.Business2TelephoneNumber: return ss(ci.Business2TelephoneNumber); case AYOLPhoneNumberType.BusinessFaxNumber: return ss(ci.BusinessFaxNumber); case AYOLPhoneNumberType.BusinessTelephoneNumber: return ss(ci.BusinessTelephoneNumber); case AYOLPhoneNumberType.CallbackTelephoneNumber: return ss(ci.CallbackTelephoneNumber); case AYOLPhoneNumberType.CarTelephoneNumber: return ss(ci.CarTelephoneNumber); case AYOLPhoneNumberType.CompanyMainTelephoneNumber: return ss(ci.CompanyMainTelephoneNumber); case AYOLPhoneNumberType.Home2TelephoneNumber: return ss(ci.Home2TelephoneNumber); case AYOLPhoneNumberType.HomeFaxNumber: return ss(ci.HomeFaxNumber); case AYOLPhoneNumberType.HomeTelephoneNumber: return ss(ci.HomeTelephoneNumber); case AYOLPhoneNumberType.ISDNNumber: return ss(ci.ISDNNumber); case AYOLPhoneNumberType.MobileTelephoneNumber: return ss(ci.MobileTelephoneNumber); case AYOLPhoneNumberType.OtherFaxNumber: return ss(ci.OtherFaxNumber); case AYOLPhoneNumberType.OtherTelephoneNumber: return ss(ci.OtherTelephoneNumber); case AYOLPhoneNumberType.PagerNumber: return ss(ci.PagerNumber); case AYOLPhoneNumberType.PrimaryTelephoneNumber: return ss(ci.PrimaryTelephoneNumber); case AYOLPhoneNumberType.RadioTelephoneNumber: return ss(ci.RadioTelephoneNumber); case AYOLPhoneNumberType.TelexNumber: return ss(ci.TelexNumber); case AYOLPhoneNumberType.TTYTDDTelephoneNumber: return ss(ci.TTYTDDTelephoneNumber); } return ""; #endregion getphone number } /// /// Get the lowest numbered (most primary) email address /// that actually contains information /// /// /// private string GetEmailAddress(Outlook.ContactItem ci) { string sEmail = ""; if(!string.IsNullOrEmpty(ss(ci.Email3Address))) sEmail = ss(ci.Email3Address); if (!string.IsNullOrEmpty(ss(ci.Email2Address))) sEmail = ss(ci.Email2Address); if (!string.IsNullOrEmpty(ss(ci.Email1Address))) sEmail = ss(ci.Email1Address); return sEmail; } private void SetAddress(AddressTypes adrType, GZTW.AyaNova.BLL.Address adr, Outlook.ContactItem ci) { //Util.d("Set Address top. adrType: " + adrType.ToString() + ", Address: " + adr.ToString()); #region is postal and use ThisIsTheMailingAddress if (adrType == AddressTypes.Postal && !AyaNovaOL.Properties.Settings.Default.IgnoreThisIsTheMailingAddress) { //User has chosen to use the mailing address //see if it's empty and use it if it's not if (!string.IsNullOrEmpty(ss(ci.MailingAddress))) { //Util.d("Set address. Using ThisIsTheMailingAddress"); adr.DeliveryAddress = ss(ci.MailingAddressStreet); if (!string.IsNullOrEmpty(ss(ci.MailingAddressPostOfficeBox))) adr.DeliveryAddress += "\r\n" + ss(ci.MailingAddressPostOfficeBox); adr.City = ss(ci.MailingAddressCity); adr.StateProv = ss(ci.MailingAddressState); adr.Country = ss(ci.MailingAddressCountry); adr.Postal = ss(ci.MailingAddressPostalCode); return; } } #endregion #region Forced address setting AYOLAddressType OLAddressTypeToUse = AYOLAddressType.Unused; if (adrType == AddressTypes.Physical) OLAddressTypeToUse = (AYOLAddressType)AyaNovaOL.Properties.Settings.Default.PhysicalAddressEquals; else OLAddressTypeToUse = (AYOLAddressType)AyaNovaOL.Properties.Settings.Default.PostalAddressEquals; switch (OLAddressTypeToUse) { case AYOLAddressType.Business: { //Util.d("Set address. Using biz"); //see if it's empty and use it if it's not if (!string.IsNullOrEmpty(ss(ci.BusinessAddress))) { adr.DeliveryAddress = ss(ci.BusinessAddressStreet); if (!string.IsNullOrEmpty(ss(ci.BusinessAddressPostOfficeBox))) adr.DeliveryAddress += "\r\n" + ss(ci.BusinessAddressPostOfficeBox); adr.City = ss(ci.BusinessAddressCity); adr.StateProv = ss(ci.BusinessAddressState); adr.Country = ss(ci.BusinessAddressCountry); adr.Postal = ss(ci.BusinessAddressPostalCode); } return; } case AYOLAddressType.Home: { //Util.d("Set address. Using Home"); try { //see if it's empty and use it if it's not if (!string.IsNullOrEmpty(ss(ci.HomeAddress))) { adr.DeliveryAddress = ss(ci.HomeAddressStreet); if (!string.IsNullOrEmpty(ss(ci.HomeAddressPostOfficeBox))) adr.DeliveryAddress += "\r\n" + ss(ci.HomeAddressPostOfficeBox); adr.City = ss(ci.HomeAddressCity); adr.StateProv = ss(ci.HomeAddressState); adr.Country = ss(ci.HomeAddressCountry); adr.Postal = ss(ci.HomeAddressPostalCode); } } catch (Exception ex) { MessageBox.Show(ex.Message + "\r\nStack trace:\r\n" + ex.StackTrace); throw (ex); } return; } case AYOLAddressType.Other: { //Util.d("Set address. Using Other"); //see if it's empty and use it if it's not if (!string.IsNullOrEmpty(ss(ci.OtherAddress))) { adr.DeliveryAddress = ss(ci.OtherAddressStreet); if (!string.IsNullOrEmpty(ss(ci.OtherAddressPostOfficeBox))) adr.DeliveryAddress += "\r\n" + ss(ci.OtherAddressPostOfficeBox); adr.City = ss(ci.OtherAddressCity); adr.StateProv = ss(ci.OtherAddressState); adr.Country = ss(ci.OtherAddressCountry); adr.Postal = ss(ci.OtherAddressPostalCode); } return; } }//switch #endregion //Util.d("Set address done"); } private bool ExportItem(Outlook.ContactItem ci) { string sName = ci.CompanyName; if (string.IsNullOrEmpty(sName)) sName = ci.FullName; if (string.IsNullOrEmpty(sName)) return false; switch (olRootObjectType) { case RootObjectTypes.Client: { ////Util.d("Top of export client"); Client c = FuzzyFetch.GetMeThe(sName); c.RegionID = AyaNovaOL.Properties.Settings.Default.Region; c.DispatchZoneID = AyaNovaOL.Properties.Settings.Default.Zone; c.ContractID = AyaNovaOL.Properties.Settings.Default.Contract; if (c.IsNew) { c.ContractExpires = DateTime.Now.AddYears(1); c.ContactNotes = "Imported from Outlook: " + System.DateTime.Now.ToString(); } ////Util.d("export client - email"); c.Email = GetEmailAddress(ci); c.Notes = ss(ci.Body); ////Util.d("export client - phone numbers"); c.Phone1 = GetPhoneNumber(RootObjectTypes.Client, 1,ci); c.Phone2 = GetPhoneNumber(RootObjectTypes.Client, 2, ci); c.Phone3 = GetPhoneNumber(RootObjectTypes.Client, 3, ci); c.Phone4 = GetPhoneNumber(RootObjectTypes.Client, 4, ci); ////Util.d("Get slot 5 number..."); c.Phone5 = GetPhoneNumber(RootObjectTypes.Client, 5, ci); ////Util.d("export client - Address physical"); SetAddress(AddressTypes.Physical, c.GoToAddress, ci); ////Util.d("export client - Address mail to"); SetAddress(AddressTypes.Postal, c.MailToAddress, ci); c.Contact = ss(ci.FullName); c.WebAddress = ss(ci.WebPage); if (c.IsSavable) c.Save(); ////Util.d("export client - saved/done"); } break; case RootObjectTypes.HeadOffice: { HeadOffice c = null; if (mIDList.ContainsKey(sName.ToLower())) { c=HeadOffice.GetItem(mIDList[sName.ToLower()]); } else { c=HeadOffice.NewItem(); c.Name=sName; } //FuzzyFetch.GetMeThe(sName); c.RegionID = AyaNovaOL.Properties.Settings.Default.Region; c.ContractID = AyaNovaOL.Properties.Settings.Default.Contract; if (c.IsNew) { c.ContractExpires = DateTime.Now.AddYears(1); c.ContactNotes = "Imported from Outlook: " + System.DateTime.Now.ToString(); } c.Email = GetEmailAddress(ci); c.Notes = ss(ci.Body); c.Phone1 = GetPhoneNumber(RootObjectTypes.Client, 1, ci); c.Phone2 = GetPhoneNumber(RootObjectTypes.Client, 2, ci); c.Phone3 = GetPhoneNumber(RootObjectTypes.Client, 3, ci); c.Phone4 = GetPhoneNumber(RootObjectTypes.Client, 4, ci); ////Util.d("Getting phone slot 5..."); c.Phone5 = GetPhoneNumber(RootObjectTypes.Client, 5, ci); ////Util.d("Got slot 5, getting physical address"); SetAddress(AddressTypes.Physical, c.GoToAddress, ci); SetAddress(AddressTypes.Postal, c.MailToAddress, ci); c.Contact = ss(ci.FullName); c.WebAddress = ss(ci.WebPage); if (c.IsSavable) c.Save(); } break; case RootObjectTypes.Vendor: { //Vendor c = FuzzyFetch.GetMeThe(sName); Vendor c = null; if (mIDList.ContainsKey(sName.ToLower())) { c = Vendor.GetItem(mIDList[sName.ToLower()]); } else { c = Vendor.NewItem(); c.Name = sName; } c.VendorType = (VendorTypes)AyaNovaOL.Properties.Settings.Default.VendorType; if (c.IsNew) { c.ContactNotes = "Imported from Outlook: " + System.DateTime.Now.ToString(); } c.Email = GetEmailAddress(ci); c.Notes = ss(ci.Body); c.Phone1 = GetPhoneNumber(RootObjectTypes.Client, 1, ci); c.Phone2 = GetPhoneNumber(RootObjectTypes.Client, 2, ci); c.Phone3 = GetPhoneNumber(RootObjectTypes.Client, 3, ci); c.Phone4 = GetPhoneNumber(RootObjectTypes.Client, 4, ci); c.Phone5 = GetPhoneNumber(RootObjectTypes.Client, 5, ci); SetAddress(AddressTypes.Physical, c.GoToAddress, ci); SetAddress(AddressTypes.Postal, c.MailToAddress, ci); c.Contact = ss(ci.FullName); c.WebAddress = ss(ci.WebPage); if (c.IsSavable) c.Save(); } break; } return true; } //Note: though it's not documented anywhere it appears that outlook //or the interop layer at least throws a null reference exception //if you try to return an empty phone number or one that isn't selected as one of the visible //ones in the outlook UI //tried to find out why but could get no results however the below method works //why setting a variable from the phone number works while returning it throws an exception is a mystery private string ss(object ContactItemField) { if (ContactItemField == null) return ""; return ContactItemField.ToString(); } }//end of class //end of namespace }