protected void SaveOrUpdateContact(object sender, CommandEventArgs e)
        {
            try
            {
                var            dao = Global.DaoFactory;
                Contact        contact;
                List <Contact> contactsForSetManager = new List <Contact>();

                var typeAddedContact = Request["typeAddedContact"];


                #region Rights part #1

                ShareType shareType = ShareType.None;// 0 - NotShared, 1 - ReadWriting, 2 - Reading

                if (!String.IsNullOrEmpty(Request["isPublicContact"]))
                {
                    try
                    {
                        shareType = (ShareType)(Convert.ToInt32(Request["isPublicContact"]));
                    }
                    catch (Exception)
                    {
                        throw new ArgumentException();
                    }
                }


                #endregion

                #region BaseInfo

                var companyID = 0;

                if (!String.IsNullOrEmpty(Request["baseInfo_compID"]))
                {
                    companyID = Convert.ToInt32(Request["baseInfo_compID"]);
                }
                else if (!String.IsNullOrEmpty(Request["baseInfo_compName"]))
                {
                    var peopleCompany = new Company
                    {
                        CompanyName = Request["baseInfo_compName"].Trim(),
                        ShareType   = shareType
                    };

                    peopleCompany.ID = dao.GetContactDao().SaveContact(peopleCompany);

                    companyID = peopleCompany.ID;
                    contactsForSetManager.Add(peopleCompany);
                }


                if (typeAddedContact.Equals("people"))
                {
                    contact = new Person
                    {
                        FirstName = Request["baseInfo_firstName"].Trim(),
                        LastName  = Request["baseInfo_lastName"].Trim(),
                        JobTitle  = Request["baseInfo_personPosition"].Trim(),
                        CompanyID = companyID
                    };
                }
                else
                {
                    contact = new Company
                    {
                        CompanyName = Request["baseInfo_companyName"].Trim()
                    };
                }


                contact.About     = !String.IsNullOrEmpty(Request["baseInfo_contactOverview"]) ? Request["baseInfo_contactOverview"].Trim() : null;
                contact.ShareType = shareType;

                #endregion

                #region ContactType and Currency

                contact.ContactTypeID = Convert.ToInt32(Request["baseInfo_contactType"]);
                if (contact.ContactTypeID != 0)
                {
                    var listItem = dao.GetListItemDao().GetByID(contact.ContactTypeID);
                    if (listItem == null)
                    {
                        throw new Exception(CRMErrorsResource.ContactTypeNotFound);
                    }
                }

                contact.Currency = Convert.ToString(Request["baseInfo_currency"]);
                if (!String.IsNullOrEmpty(contact.Currency))
                {
                    var currency = CurrencyProvider.Get(contact.Currency);
                    if (currency == null)
                    {
                        throw new Exception(CRMErrorsResource.CurrencyNotFound);
                    }
                }

                #endregion

                #region Base Operation Of Save/Update

                if (TargetContact != null)
                {
                    contact.ID       = TargetContact.ID;
                    contact.StatusID = TargetContact.StatusID;
                    dao.GetContactDao().UpdateContact(contact);

                    var messageAction = contact is Company ? MessageAction.CompanyUpdated : MessageAction.PersonUpdated;
                    MessageService.Send(HttpContext.Current.Request, messageAction, contact.GetTitle());

                    contact = dao.GetContactDao().GetByID(contact.ID);
                }
                else
                {
                    contact.ID = dao.GetContactDao().SaveContact(contact);

                    var messageAction = contact is Company ? MessageAction.CompanyCreated : MessageAction.PersonCreated;
                    MessageService.Send(HttpContext.Current.Request, messageAction, contact.GetTitle());

                    contact = dao.GetContactDao().GetByID(contact.ID);
                }

                contactsForSetManager.Add(contact);

                #endregion

                #region persons for company

                if (contact is Company)
                {
                    var assignedContactsIDs = new List <int>();

                    if (!String.IsNullOrEmpty(Request["baseInfo_assignedNewContactsIDs"]))
                    {
                        try
                        {
                            var assignedContactsObjs = JArray.Parse(Request["baseInfo_assignedNewContactsIDs"]);
                            var newAssignedContacts  = new List <Contact>();
                            var recordIndex          = 0;

                            foreach (var assignedContactsObj in assignedContactsObjs)
                            {
                                newAssignedContacts.Add(new Person
                                {
                                    ID        = recordIndex,
                                    ShareType = shareType,
                                    CompanyID = contact.ID,
                                    FirstName = assignedContactsObj.Value <String>("FirstName"),
                                    LastName  = assignedContactsObj.Value <String>("LastName")
                                });
                                recordIndex++;
                            }

                            dao.GetContactDao().SaveContactList(newAssignedContacts);

                            if (newAssignedContacts.Count != 0)
                            {
                                contactsForSetManager.AddRange(newAssignedContacts);
                                assignedContactsIDs.AddRange(newAssignedContacts.Select(c => c.ID).ToList());
                            }
                        }
                        catch (Exception ex)
                        {
                            log4net.LogManager.GetLogger("ASC.CRM").Error(ex);
                        }
                    }

                    if (!String.IsNullOrEmpty(Request["baseInfo_assignedContactsIDs"]))
                    {
                        assignedContactsIDs.AddRange(Request["baseInfo_assignedContactsIDs"].Split(',').Select(item => Convert.ToInt32(item)).ToList());
                    }


                    if (TargetContact != null && !CRMSecurity.IsAdmin)
                    {
                        var restrictedMembers = dao.GetContactDao().GetRestrictedMembers(contact.ID);
                        assignedContactsIDs.AddRange(restrictedMembers.Select(m => m.ID).ToList());
                    }

                    dao.GetContactDao().SetMembers(contact.ID, assignedContactsIDs.ToArray());
                }

                #endregion

                #region tags

                var assignedTags = Request["baseInfo_assignedTags"];
                if (assignedTags != null)
                {
                    var oldTagList = dao.GetTagDao().GetEntityTags(EntityType.Contact, contact.ID);
                    foreach (var tag in oldTagList)
                    {
                        dao.GetTagDao().DeleteTagFromEntity(EntityType.Contact, contact.ID, tag);
                    }
                    if (assignedTags != string.Empty)
                    {
                        var tagListInfo = JObject.Parse(assignedTags)["tagListInfo"].ToArray();
                        var newTagList  = tagListInfo.Select(t => t.ToString()).ToArray();
                        dao.GetTagDao().SetTagToEntity(EntityType.Contact, contact.ID, newTagList);
                    }
                }

                #endregion

                #region contact infos (addresses, mailes, phones etc.)

                var contactInfos    = new List <ContactInfo>();
                var addressList     = new Dictionary <int, ContactInfo>();
                var addressTemplate = new JObject();

                foreach (String addressPartName in Enum.GetNames(typeof(AddressPart)))
                {
                    addressTemplate.Add(addressPartName.ToLower(), "");
                }

                var addressTemplateStr = addressTemplate.ToString();

                foreach (var item in Request.Form.AllKeys)
                {
                    if (item.StartsWith("customField_"))
                    {
                        int    fieldID    = Convert.ToInt32(item.Split('_')[1]);
                        String fieldValue = Request.Form[item].Trim();

                        if (contact is Person)
                        {
                            if (!String.IsNullOrEmpty(fieldValue))
                            {
                                dao.GetCustomFieldDao().SetFieldValue(EntityType.Person, contact.ID, fieldID, "");
                            }
                            dao.GetCustomFieldDao().SetFieldValue(EntityType.Person, contact.ID, fieldID, fieldValue);
                        }
                        else
                        {
                            if (!String.IsNullOrEmpty(fieldValue))
                            {
                                dao.GetCustomFieldDao().SetFieldValue(EntityType.Company, contact.ID, fieldID, "");
                            }
                            dao.GetCustomFieldDao().SetFieldValue(EntityType.Company, contact.ID, fieldID, fieldValue);
                        }
                    }
                    else if (item.StartsWith("contactInfo_"))
                    {
                        var nameParts       = item.Split('_').Skip(1).ToList();
                        var contactInfoType = (ContactInfoType)Enum.Parse(typeof(ContactInfoType), nameParts[0]);
                        var category        = Convert.ToInt32(nameParts[2]);

                        if (contactInfoType == ContactInfoType.Address)
                        {
                            var index            = Convert.ToInt32(nameParts[1]);
                            var addressPart      = (AddressPart)Enum.Parse(typeof(AddressPart), nameParts[3]);
                            var isPrimaryAddress = Convert.ToInt32(nameParts[4]) == 1;
                            var dataValues       = Request.Form.GetValues(item).Select(n => n.Trim()).ToList();

                            if (!addressList.ContainsKey(index))
                            {
                                var newAddress = new ContactInfo
                                {
                                    Category  = category,
                                    InfoType  = contactInfoType,
                                    Data      = addressTemplateStr,
                                    IsPrimary = isPrimaryAddress,
                                    ContactID = contact.ID
                                };
                                addressList.Add(index, newAddress);
                            }

                            foreach (var data in dataValues)
                            {
                                var addressParts = JObject.Parse(addressList[index].Data);
                                addressParts[addressPart.ToString().ToLower()] = data;
                                addressList[index].Data = addressParts.ToString();
                            }
                            continue;
                        }

                        var isPrimary = Convert.ToInt32(nameParts[3]) == 1;
                        if (Request.Form.GetValues(item) != null)
                        {
                            var dataValues = Request.Form.GetValues(item).Where(n => !string.IsNullOrEmpty(n.Trim())).ToList();

                            contactInfos.AddRange(dataValues.Select(dataValue => new ContactInfo
                            {
                                Category  = category,
                                InfoType  = contactInfoType,
                                Data      = dataValue.Trim(),
                                IsPrimary = isPrimary,
                                ContactID = contact.ID
                            }));
                        }
                    }
                }

                if (addressList.Count > 0)
                {
                    contactInfos.AddRange(addressList.Values.ToList());
                }

                dao.GetContactInfoDao().DeleteByContact(contact.ID);
                dao.GetContactInfoDao().SaveList(contactInfos);

                #endregion

                #region Photo

                var photoPath = Request["uploadPhotoPath"];

                if (!String.IsNullOrEmpty(photoPath))
                {
                    if (photoPath != "null")
                    {
                        if (photoPath.StartsWith(PathProvider.BaseAbsolutePath))
                        {
                            var tmpDirName = photoPath.Substring(0, photoPath.LastIndexOf('/'));
                            ContactPhotoManager.TryUploadPhotoFromTmp(contact.ID, TargetContact == null, tmpDirName);
                        }
                        else
                        {
                            ContactPhotoManager.UploadPhoto(photoPath, contact.ID);
                        }
                    }
                }
                else if (TargetContact != null)
                {
                    ContactPhotoManager.DeletePhoto(TargetContact.ID);
                }
                #endregion


                #region Rights part #2

                SetContactManager(contactsForSetManager);

                #endregion

                #region Link with mail message

                int result;
                var linkMessageId = int.TryParse(Request["linkMessageId"], out result) ? result : 0;

                if (linkMessageId > 0)
                {
                    try
                    {
                        LinkWithMessage(linkMessageId, contact.ID);
                    }
                    catch (Exception ex)
                    {
                        log4net.LogManager.GetLogger("ASC.CRM").Error(ex);
                    }
                }

                #endregion

                Response.Redirect(String.Compare(e.CommandArgument.ToString(), "0", true) == 0
                                      ? String.Format("default.aspx?id={0}{1}", contact.ID,
                                                      contact is Company
                                                          ? ""
                                                          : String.Format("&{0}=people", UrlConstant.Type))
                                      : String.Format("default.aspx?action=manage{0}",
                                                      contact is Company
                                                          ? ""
                                                          : String.Format("&{0}=people", UrlConstant.Type)), false);
                Context.ApplicationInstance.CompleteRequest();
            }
            catch (Exception ex)
            {
                log4net.LogManager.GetLogger("ASC.CRM").Error(ex);
                var cookie = HttpContext.Current.Request.Cookies.Get(ErrorCookieKey);
                if (cookie == null)
                {
                    cookie = new HttpCookie(ErrorCookieKey)
                    {
                        Value = ex.Message
                    };
                    HttpContext.Current.Response.Cookies.Add(cookie);
                }
            }
        }
Esempio n. 2
0
        protected void SaveOrUpdateContact(object sender, CommandEventArgs e)
        {
            Contact contact;

            var typeAddedContact = Request["typeAddedContact"];

            var companyID = 0;

            if (!String.IsNullOrEmpty(Request["baseInfo_compID"]))
            {
                companyID = Convert.ToInt32(Request["baseInfo_compID"]);
            }
            else if (!String.IsNullOrEmpty(Request["baseInfo_compName"]))
            {
                var peopleCompany = new Company
                {
                    CompanyName = Request["baseInfo_compName"].Trim()
                };

                peopleCompany.ID = Global.DaoFactory.GetContactDao().SaveContact(peopleCompany);

                CRMSecurity.MakePublic(peopleCompany);

                companyID = peopleCompany.ID;
            }

            if (typeAddedContact.Equals("people"))
            {
                contact = new Person
                {
                    FirstName = Request["baseInfo_firstName"].Trim(),
                    LastName  = Request["baseInfo_lastName"].Trim(),
                    JobTitle  = Request["baseInfo_personPosition"].Trim(),
                    CompanyID = companyID
                };
            }
            else
            {
                contact = new Company
                {
                    CompanyName = Request["baseInfo_companyName"].Trim()
                };
            }

            if (!String.IsNullOrEmpty(Request["baseInfo_contactOverview"]))
            {
                contact.About = Request["baseInfo_contactOverview"].Trim();
            }

            Boolean isSharedContact;

            if (bool.TryParse(Request["isPublicContact"], out isSharedContact))
            {
                contact.IsShared = isSharedContact;
            }

            contact.ContactTypeID = Convert.ToInt32(Request["baseInfo_contactType"]);

            if (TargetContact != null)
            {
                contact.ID       = TargetContact.ID;
                contact.StatusID = TargetContact.StatusID;
                Global.DaoFactory.GetContactDao().UpdateContact(contact);
                contact = Global.DaoFactory.GetContactDao().GetByID(contact.ID);
            }
            else
            {
                contact.ID = Global.DaoFactory.GetContactDao().SaveContact(contact);
                contact    = Global.DaoFactory.GetContactDao().GetByID(contact.ID);
            }

            SetContactManager(contact);

            if (contact is Company)
            {
                int[] assignedContactsIDs = null;

                if (!String.IsNullOrEmpty(Request["baseInfo_assignedContactsIDs"]))
                {
                    assignedContactsIDs = Request["baseInfo_assignedContactsIDs"].Split(',').Select(item => Convert.ToInt32(item)).ToArray();
                }

                Global.DaoFactory.GetContactDao().SetMembers(contact.ID, assignedContactsIDs);
            }

            var assignedTags = Request["baseInfo_assignedTags"];

            if (assignedTags != null)
            {
                var oldTagList = Global.DaoFactory.GetTagDao().GetEntityTags(EntityType.Contact, contact.ID);
                foreach (var tag in oldTagList)
                {
                    Global.DaoFactory.GetTagDao().DeleteTagFromEntity(EntityType.Contact, contact.ID, tag);
                }
                if (assignedTags != string.Empty)
                {
                    var tagListInfo = JObject.Parse(assignedTags)["tagListInfo"].ToArray();
                    var newTagList  = tagListInfo.Select(t => t.ToString()).ToArray();
                    Global.DaoFactory.GetTagDao().SetTagToEntity(EntityType.Contact, contact.ID, newTagList);
                }
            }

            var contactInfos    = new List <ContactInfo>();
            var addressList     = new Dictionary <int, ContactInfo>();
            var addressTemplate = new JObject();

            foreach (String addressPartName in Enum.GetNames(typeof(AddressPart)))
            {
                addressTemplate.Add(addressPartName.ToLower(), "");
            }

            var addressTemplateStr = addressTemplate.ToString();

            foreach (var item in Request.Form.AllKeys)
            {
                if (item.StartsWith("customField_"))
                {
                    int    fieldID    = Convert.ToInt32(item.Split('_')[1]);
                    String fieldValue = Request.Form[item].Trim();

                    if (contact is Person)
                    {
                        Global.DaoFactory.GetCustomFieldDao().SetFieldValue(EntityType.Person, contact.ID, fieldID, fieldValue);
                    }
                    else
                    {
                        Global.DaoFactory.GetCustomFieldDao().SetFieldValue(EntityType.Company, contact.ID, fieldID, fieldValue);
                    }
                }
                else if (item.StartsWith("contactInfo_"))
                {
                    var nameParts       = item.Split('_').Skip(1).ToList();
                    var contactInfoType = (ContactInfoType)Enum.Parse(typeof(ContactInfoType), nameParts[0]);
                    var category        = Convert.ToInt32(nameParts[2]);

                    if (contactInfoType == ContactInfoType.Address)
                    {
                        var index            = Convert.ToInt32(nameParts[1]);
                        var addressPart      = (AddressPart)Enum.Parse(typeof(AddressPart), nameParts[3]);
                        var isPrimaryAddress = Convert.ToInt32(nameParts[4]) == 1;
                        var dataValues       = Request.Form.GetValues(item).Select(n => n.Trim()).ToList();

                        if (!addressList.ContainsKey(index))
                        {
                            var newAddress = new ContactInfo
                            {
                                Category  = category,
                                InfoType  = contactInfoType,
                                Data      = addressTemplateStr,
                                IsPrimary = isPrimaryAddress,
                                ContactID = contact.ID
                            };
                            addressList.Add(index, newAddress);
                        }

                        foreach (var data in dataValues)
                        {
                            var addressParts = JObject.Parse(addressList[index].Data);
                            addressParts[addressPart.ToString().ToLower()] = data;
                            addressList[index].Data = addressParts.ToString();
                        }
                        continue;
                    }

                    var isPrimary = Convert.ToInt32(nameParts[3]) == 1;
                    if (Request.Form.GetValues(item) != null)
                    {
                        var dataValues = Request.Form.GetValues(item).Where(n => !string.IsNullOrEmpty(n.Trim())).ToList();

                        contactInfos.AddRange(dataValues.Select(dataValue => new ContactInfo
                        {
                            Category  = category,
                            InfoType  = contactInfoType,
                            Data      = dataValue.Trim(),
                            IsPrimary = isPrimary,
                            ContactID = contact.ID
                        }));
                    }
                }
            }

            if (addressList.Count > 0)
            {
                contactInfos.AddRange(addressList.Values.ToList());
            }

            Global.DaoFactory.GetContactInfoDao().DeleteByContact(contact.ID);
            Global.DaoFactory.GetContactInfoDao().SaveList(contactInfos);

            var emails = contactInfos
                         .Where(item => item.InfoType == ContactInfoType.Email)
                         .Select(item => item.Data)
                         .ToList();

            if (emails.Count > 0)
            {
                var userIds = CRMSecurity.GetAccessSubjectTo(contact).Keys.ToList();
                Global.DaoFactory.GetContactInfoDao().UpdateMailAggregator(emails, userIds);
            }

            var photoPath = Request["uploadPhotoPath"];

            if (!String.IsNullOrEmpty(photoPath))
            {
                if (photoPath != "null")
                {
                    if (photoPath.StartsWith(PathProvider.BaseAbsolutePath))
                    {
                        var tmpDirName = photoPath.Substring(0, photoPath.LastIndexOf('/'));
                        ContactPhotoManager.TryUploadPhotoFromTmp(contact.ID, TargetContact == null, tmpDirName);
                    }
                    else
                    {
                        ContactPhotoManager.UploadPhoto(photoPath, contact.ID);
                    }
                }
            }
            else if (TargetContact != null)
            {
                ContactPhotoManager.DeletePhoto(TargetContact.ID);
            }

            Response.Redirect(String.Compare(e.CommandArgument.ToString(), "0", true) == 0
                                  ? String.Format("default.aspx?id={0}{1}", contact.ID,
                                                  contact is Company
                                                      ? ""
                                                      : String.Format("&{0}=people", UrlConstant.Type))
                                  : String.Format("default.aspx?action=manage{0}",
                                                  contact is Company
                                                      ? ""
                                                      : String.Format("&{0}=people", UrlConstant.Type)));
        }