public async Task <ClientResponse <ContactDto> > CreateContact(CreateContactDto contactDto)
        {
            var response = new ClientResponse <ContactDto>();

            try
            {
                if (contactDto.BirthDate > DateTime.Now)
                {
                    response.Message = E.ErrHigherBirthDate;
                    response.Status  = System.Net.HttpStatusCode.BadRequest;
                    return(response);
                }
                if (await validateContactNotExists(contactDto.Email, contactDto.Name))
                {
                    response.Message = E.ErrContactAlreadyExists;
                    response.Status  = System.Net.HttpStatusCode.BadRequest;
                    return(response);
                }
                if (await validateCityAndCompany(contactDto.CityID, contactDto.CompanyID))
                {
                    var contact = new Mo.Contact
                    {
                        Name         = H.UppercaseFirst(contactDto.Name),
                        BirthDate    = contactDto.BirthDate,
                        StreetName   = H.UppercaseFirst(contactDto.StreetName),
                        StreetNumber = contactDto.StreetNumber,
                        CompanyID    = contactDto.CompanyID,
                        CityID       = contactDto.CityID,
                        ProfileImage = contactDto.ProfileImage,
                        Email        = contactDto.Email.ToLower(),
                        Phones       = new List <Mo.Phone>(),
                        Active       = true
                    };

                    contact.CreatedAt = DateTime.Now;
                    foreach (PhoneDto p in contactDto.Phones)
                    {
                        contact.Phones.Add(_mapper.Map <Mo.Phone>(p));
                    }
                    _repository.Contacts.Add(contact);

                    await _repository.SaveChangesAsync();

                    return(await GetContactById(contact.ID));
                }
                response.Message = E.ErrGeneric;
                response.Status  = System.Net.HttpStatusCode.InternalServerError;
                return(response);
            }
            catch (Exception ex)
            {
                response.Message = ex.Message;
                response.Status  = System.Net.HttpStatusCode.InternalServerError;
                return(response);
            }
        }
        private void updateContactMap(ref Mo.Contact contact, UpdateContactDto updatedContact)
        {
            contact.CityID       = updatedContact.CityID;
            contact.CompanyID    = updatedContact.CompanyID;
            contact.ProfileImage = updatedContact.ProfileImage;
            contact.Name         = H.UppercaseFirst(updatedContact.Name);
            contact.Email        = updatedContact.Email.ToLower();
            contact.StreetName   = H.UppercaseFirst(updatedContact.StreetName);
            contact.StreetNumber = updatedContact.StreetNumber;
            contact.BirthDate    = updatedContact.BirthDate;

            var phoneIds = new HashSet <long>();

            foreach (PhoneDto p in updatedContact.Phones)
            {
                // Add only new phones
                if (p.ID == 0)
                {
                    contact.Phones.Add(_mapper.Map <Mo.Phone>(p));
                }
                // keep old valid phones
                if (p.ID > 0)
                {
                    phoneIds.Add(p.ID);
                }
            }

            // Soft Delete older phones
            foreach (Mo.Phone p in contact.Phones)
            {
                if (p.ID > 0 && !phoneIds.Contains(p.ID))
                {
                    p.Active    = false;
                    p.DeletedAt = DateTime.Now;
                }
                else
                {
                    p.Active = true;
                }
            }
            contact.UpdatedAt = DateTime.Now;
        }