пятница, 20 мая 2011 г.

Форматирование адреса для налоговой

Вот за что я люблю нашу украинскую налоговую, так это за то что благодаря ее стараниям без работы никогда не останусь. То крестики на нолики поменяют, то заставят писать каждый символ в отдельную ячейку(хотя софт самой налоговой этого не умеет), то таблицы в отчетной форме местами поменяют. А самое главное делают все это задним числом, в результате чего на вопрос клиентов на когда надо получаю стандартный ответ "на вчера".
Вот на днях опять разродились разъяснениями.

Суть истории. 

В течении десятилетия налоговая принимала накладные с произвольно заполненным адресом. Ну программа естественно выгружала адрес в том формате который требуется статотчетностью нацбанка, ФАТФом, фондом гарантирования вкладов физлиц. Зато теперь налоговая ввела новый формат адреса

Было: Донецкая обл,Шахтерский район,86200,с. Маринка,ул. Университетская,д. 10,кв. 1,Украина
Стало: Университетская, 10, 1, маринка, шахтерский, Донецкая, 86200


Казалось бы, а вот из-за сего  нововведения фирме могут отказать в возмещении налога на добавленную стоимость и "мягко наклонить" при помощи штрафа.
Естественно ради одной налоговой менять формат хранения адреса в базе никто не будет. Надо переконверчивать адрес  "налету" (в смысле побороть полет мысли налоговиков).
Для данного переформатирования был написан небольшой метод

        private string formaterAddress(string address)
        {
            string[] wholeAdress = address.Split(',');
            string taxAddress = "";
            if (wholeAdress.Length >= 8)
                taxAddress = String.Format("{0}, {1}, {2}, {3}, {4}, {5}, {6}",
                    wholeAdress[4].Trim(),    //0-Улица
                    wholeAdress[5].Trim(), //1-Дом
                    wholeAdress[6].Trim(), //2-Офис
                    wholeAdress[3].Trim(),//3-місто (населений пункт),
                    wholeAdress[1].Trim(),//4-район (якщо населений пункт не є райцентром),
                    wholeAdress[0].Trim(),//5-область (якщо місто не є обласним центром),
                    wholeAdress[2].Trim()//6-поштовий індекс.
                    );
            else
                taxAddress = address;
            return taxAddress;
        }

Ну а потом еще на закуску сделал перекодировку номера телефона, т.к. теперь в номере под страхом расстрела пользователей не должно быть пробелов, кавычек, чёрточек

Было: +3 8(044) 9-205-926
Стало: 0449205926

Реализация метода ниже

        private string formaterPhone(string phone)
        {
            phone = phone.Replace("+", "");
            phone = phone.Replace(" ", "");
            phone = phone.Replace("(", "");
            phone = phone.Replace(")", "");
            phone = phone.Replace("-", "");
            phone = phone.Replace(",", "");
            phone = phone.Replace(".", "");
            phone = phone.Replace(";", "");
            if (phone.Length < 10)
                return phone;
            else
                return phone.Substring(phone.Length-10);
        }

2 комментария:

  1. Насчет форматирования номера - можно еще вот так:

    private static readonly Regex _regex = new Regex(@"\D", RegexOptions.Compiled);

    private static string FormatPhoneNumber(string value)
    {
    Contract.Requires(null != value);
    Contract.Ensures(null != Contract.Result());

    var result = _regex.Replace(value, string.Empty);

    if (result.Length > 10)
    result = result.Substring(result.Length - 10);

    return result;
    }

    Плюс: отсекается все, что не цифра.
    Минус: скорость обработки раза в 2 больше.

    ОтветитьУдалить
  2. Вариант.

    Но бухгалтера сказали что им лучше увидеть и исправить ошибки в виде букв в номере телефона самим, чем когда это увидят во время проверки.

    ОтветитьУдалить