Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет stden ([info]stden)
@ 2007-02-20 13:17:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
myOutlook
Утилита для корректировки адресной книги Outlook. Удаляет дубли из телефонной книги. Исправляет ФИО. Выводит на консоль свои действия. Программа соединяется с открытым Outlook'ом.

using System;
using System.Collections;
using Microsoft.Office.Interop.Outlook;
using csUnit;

namespace myOutlook
{
  public class Program
  {
    static bool контактИзменен;
    static ContactItem текущийКонтакт;
    static Hashtable СтарыеЗначенияПолей;
    
    private static void Main(string[] args)
    {
      Application Outlook = new Application();
      NameSpace nameSpace = Outlook.GetNamespace("MAPI");
      Items КонтактыВOutlook = nameSpace.GetDefaultFolder(OlDefaultFolders.olFolderContacts).Items;

      Hashtable КонтактПоПолномуИмени = new Hashtable();
      Hashtable КонтактПоНомеруТелефона = new Hashtable();

      foreach (ContactItem контакт in КонтактыВOutlook)
      {
        if (контакт.Class != OlObjectClass.olContact) continue;

        текущийКонтакт = контакт;
        контактИзменен = false;
        СтарыеЗначенияПолей = new Hashtable();
        
        контакт.PropertyChange += new ItemEvents_10_PropertyChangeEventHandler(ИзмененоПоле);

        foreach (ItemProperty Поле in контакт.ItemProperties)
        {
          if (Поле.Name.Contains("phone") || (Поле.Name.Contains("fax")) ||
            Поле.Name.Contains("FileAs") || (Поле.Name.Contains("FullName")))
          {
            СтарыеЗначенияПолей[Поле.Name] = Поле.Value;
          }
          if (Поле.Name.Contains("phone") || (Поле.Name.Contains("fax")))
          {
            if (Поле.Value.ToString() != "")
            {
              string Старый = (string)Поле.Value;
              string Новый = Телефон(Старый);
              if (Старый != Новый)
              {
                Console.WriteLine("Assert.Equals( \"{0}\", Program.Телефон(\"{1}\") );",
                                  Старый, Новый);
                Поле.Value = Новый;
              }
              if (КонтактПоНомеруТелефона.Contains(Новый))
              {
                Console.WriteLine("Дубль телефона: " + Новый +
                  " " + контакт.FullName + " " + ((ContactItem)КонтактПоНомеруТелефона[Новый]).FullName);
              }
              else
              {
                КонтактПоНомеруТелефона.Add(Новый, контакт);
              }
            }
          }
        }
        
        if (КонтактПоПолномуИмени.Contains(контакт.FullName))
        {
          Console.WriteLine("Удаляю дубль: " + контакт.FullName);
          контакт.Delete();
          continue;
        }
        else
        {
          КонтактПоПолномуИмени.Add(контакт.FullName, контакт);
        } 

        if (контакт.FileAs != контакт.FullName)
        {
          контакт.FileAs = контакт.FullName;
        }
        if (контакт.FullName != ФИО(контакт.FullName))
        {
          контакт.FullName = ФИО(контакт.FullName);
        }

        if (контактИзменен) 
          контакт.Save();
      }
    }

    private static void ИзмененоПоле(string Name)
    {
      Console.WriteLine("["+текущийКонтакт.FileAs+"]."+Name+" = "+
                        СтарыеЗначенияПолей[Name]+" => "+
                        текущийКонтакт.ItemProperties[Name].Value);
      контактИзменен = true;   
    }

    /// <summary>
    /// Конвертирование ФИО в правильное написание
    /// </summary>
    /// <param name="фио">ФИО как оно есть</param>
    /// <returns>ФИО как должно быть</returns>
    public static string ФИО(string фио)
    {
      switch (фио)
      {
        case "Михаил Павловский":
          return "Миша Павловский";
        case "Марченко Влад":
          return "Влад Марченко";
        // ...и так далее..
        default:
          return фио;
      }
    }

    /// <summary>
    /// Конвертирование номера телефона в нужный формат
    /// </summary>
    /// <param name="номер">Номер телефона как есть сейчас</param>
    /// <returns>Номер телефона как он должен быть</returns>
    public static string Телефон(string номер)
    {
      // Обработка служебных номеров
      if ((номер.StartsWith("0")) || номер.Length < 7)
        return номер;
      // Обработка изменения кодов
      номер = номер.Replace("+7 (011", "+7 (401"); // Kaliningrad
      номер = номер.Replace("+7 (0", "+7 (4");
      // Добаляем плюс в начало, если его нету
      if (!номер.StartsWith("+"))
        номер = "+" + номер;
      if (номер.StartsWith("+8") && номер.Length == 12)
      {
        номер = "+7" + номер.Substring(2);
      }
      // Добавляем к Питерским номерам 812
      if (номер.Length == 8)
      {
        номер = номер.Insert(1, "7812");
      }
      // Российские номера начинаются с +7 
      if (номер.StartsWith("+") && номер.Length == 12)
      {
        номер = номер.Insert(5, ") ");
        номер = номер.Insert(2, " (");
      }
      return номер;
    }
  }

  [TestFixture()]
  class Tests
  {
    [Test]
    public void КонвертацияНомеров()
    {
      Assert.Equals(Program.Телефон("0"), "0");
      Assert.Equals(Program.Телефон("+78122674695"), "+7 (812) 2674695");
      Assert.Equals(Program.Телефон("88122674695"), "+7 (812) 2674695");
      Assert.Equals(Program.Телефон("78122674695"), "+7 (812) 2674695");
      Assert.Equals(Program.Телефон("5113195"), "+7 (812) 5113195");
      Assert.Equals(Program.Телефон("77017621290"), "+7 (701) 7621290");
      Assert.Equals(Program.Телефон("16464362545"), "+1 (646) 4362545");
    }
  }
}