Программа импорта платежек из файла *.dbf

Автор:Alexander
Дата:06.08.2002
Просмотров:2794
Скачиваний:809
Оценка: - , Оценок - 0
Скачать (rar-файл; Размер - 14663)

Обсудить в форуме

Описание

Модуль импорта.

Модуль импорта выполняет импорт платежных документов из файла формата dBASE III. Путь и имя файла для импорта берется из параметра ImpDir файла ClientW32.ini программы "Клиент банка", если этот параметр не задан (пусто или закомментирован), файл выбирается из диалоговой панели выбора файлов. Файл содержит следующие обязательные поля:

Имя поля Тип поля Длина поля Содержание поля
N_DOCUMENT Character 7 Номер платежного документа
DATADOC Date 8 Дата платежного документа
SUM Numeric 20.2 Сумма платежного документа
ACC_PAYER Character 25 Счет плательщика*
INN_PAYER Character 12 ИНН плательщика**
BIC_PAYER Character 9 Бик банка плательщика***
PAYER Character 160 Наименование плательщика****
ACC_REC Character 25 Счет получателя
RECEIVER Character 160 Наименование получателя
INN_REC Character 12 ИНН получателя
MFO Character 9 БИК банка получателя
GROUND Character 210 Назначение платежа *****
INFO Character 70 Назначение платежа (хвост) ******
ORDER Character 2 Очередность платежа
KPPPAY Character 9 КПП плательщика
KPPREC Character 9 КПП получателя
SSTATUS Character 2 Cтатус составителя расчетного документа
CODBCLAS Character 19 КБК - код бюджетной классификации
CODOKATO Character 11 Код ОКАТО
NALPLAT Character 2 Основание налогового платежа
NALPER Character 10 Налоговый период
NDNAL Character 15 Номер налогового документа
DDNAL Character 10 Дата налогового документа
TYPNAL Character 2 Тип налогового платежа

*- Наименование плательщика, ИНН плательщика, БИК банка плательщика определяются модулем импорта на основании номера счета плательщика и данных внутренних справочников программы "Клиент банка".
**- Поле INN_PAYER не обязательное (может отсутствовать), при наличии не пустого поля INN_PAYER, его значение сравнивается со значением из справочника клиента.
*** - при отсутствии поля BIC_PAYER, БИК банка = 042007705 (ВоронежПромБанк)
****- Поле PAYER не обязательное (может отсутствовать). При наличии не пустого поля PAYER заменяем им наименование плательщика.
***** - суммарная длина полей GROUND + INFO не должна превышать 210. Между полем GROUND и INFO ничего не вставляется.
****** - поле INFO оставлено для совместимости со старой версией.

Количество документов в файле не ограничено.
Во время выполнения импорта модуль производит проверку корректности документов по следующим параметрам:
Наличие банков плательщика и получателя во внутреннем справочнике банков программы.
Наличие счета плательщика во внутреннем справочнике счетов программы.
Несовпадение импортируемого документа с ранее введенным, хотя бы по одному из следующих параметров: счет плательщика, БИК банка плательщика, счет получателя, БИК банка получателя, сумма платежного документа, номер платежного документа, дата платежного документа (документ не дублируется).
В случае обнаружения некорректности по одному из трех вышеперечисленных пунктов документ отвергается. После завершения импорта на экран выводится информация о номерах записей с отвергнутыми и импортированными документами (если такие имеются), причина отказа отвергнутого документа, общее количество импортированных и отвергнутых документов. Если количество отвергнутых документов равно нулю, файл импорта удаляется.
В противном случае:
если все отвергнутые документы это дубли уже введенных документов, то выдается запрос на удаление файл импорта.
если не все отвергнутые документы это дубли уже введенных документов, то файл импорта не удаляется

Текст примера

 //=================
//некоторые моменты - примеры из кода
//=================
Обратите внимание на константу Const Bic_vpb="042007705";  -исправьте под свой банк, в случае если поле f_imp.BIC_PAYER пустое или отсутствует.
   acc.BIC=Bic_Vpb;/*БИК ВоронежПромБанка*/
   if(FldIndex(f_imp,"BIC_PAYER")!=-1)
    if(trim(f_imp.BIC_PAYER)!="")
      acc.BIC=trim (f_imp.BIC_PAYER);
    end;
   end;
//===================
//а это для специфичного клиента, который платит не за себя (за других)
//===================
   /*наименование плательщика*/
   Stroka=org.NamR;
   /*
   вставка 04.11.2002 для ГорФинУпр.
   Если есть поле с именем PAYER то заменяем им плательщика
   наименование плательшика берем из базы f_imp
   (добавляем его к плательшику)
   */
   if(FldIndex(f_imp,"PAYER")!=-1)
     if(trim(f_imp.PAYER)!="")
       Stroka=trim(f_imp.PAYER);/*заменяем плательшика*/
     end;
   end;
   /*!!!*/
   DocSetByName ("payerName", DosToWin(Stroka));  /* присвоение значения полю */
//============================
//основной блок обработки
//============================
  VclInitProgress (NRecords(f_imp),dostowin ("Импорт платежных документов"));       /* рисуем progress bar */
  while(next(f_imp))
     err =false;
     err_=false;
     i=i+1;
     /* иниц. пустого документа указанного типа и формы */
     if (Not DocInitNew (IsPay, FormId))
         VclMsgBox ("Ошибка иниализации документа. Возможно, неверен тип или номер формы.");
         return;
     end;
     N_record=trim(f_imp.N_DOCUMENT);
     SumDoc/*N_record*/=Obrabotka_(err);

/* Проверка на дублирование документов */
            _accd=DocGetByName ("AccD");     /* Номер счета плательщика*/
            _acc=DocGetByName ("Acc");     /* Номер счета плательщика*/
            _BICD=DocGetByName ("BICD");     /* МФО Банка плательщика  */
            _accc=DocGetByName ("AccC");     /* Номер счета получателя */
            _BICC=DocGetByName ("BICC");     /* МФО Банка получателя   */
            _amm=DocGetByName ("Amm");       /* Сумма                  */
            _Nown=DocGetByName ("Nown");     /* Номер документа        */
            _Down=DocGetByName ("Down");     /* Дата документа         */

            pdoc.Down=_Down;
            flag=geteq (pdoc);
            while (flag and (pdoc.Down==_Down))
              if (
                  (pdoc.Acc==_acc) and
                  (pdoc.AccD==_accd) and
                  (pdoc.BICD==_BICD) and
                  (pdoc.AccC==_accc) and
                  (pdoc.BICC==_BICC) and
                  (pdoc.Amm==_amm)   and
                  (pdoc.Nown==_Nown) and     /* НЕ отвергнутые документы */
                  ((pdoc.IdSta<3000) or (pdoc.IdSta>4000))/*не отказы */
                 )
                [#](dostowin (string(pdoc.Down," ":7)+" документ номер "+_Nown+" дублируется В ВВЕДЕННЫХ "));
                err_=true;
                flag=false;
              else
                flag=next (pdoc);
              end;
            end;

            if(not err_)
              /*прогоняем вторично, ищем ранее введенные но удаленные документы*/
              pdoc.Down=_Down;
              flag=geteq (pdoc);
              while (flag and (pdoc.Down==_Down))
                if( (
                    (pdoc.Acc==_acc) and
                    (pdoc.AccD==_accd) and
                    (pdoc.BICD==_BICD) and
                    (pdoc.AccC==_accc) and
                    (pdoc.BICC==_BICC) and
                    (pdoc.Amm==_amm)   and
                    (pdoc.Nown==_Nown)
                   ) and
                  ((3000<=pdoc.IdSta) and (pdoc.IdSta<4000))/*отказы */
/*
                   ((pdoc.IdSta==3000) or     /* удален клиентом */
                    (pdoc.IdSta==3100) or     /* отказан банком */
                    (pdoc.IdSta==3200) or     /* удален банком */
                    (pdoc.IdSta==3800) or     /* отозван */
                    (pdoc.IdSta==3900)        /* удален банком после проводки */
                   )
*/
                  )
                   if(VclGetTrue(False,dostowin ("Документ N "+_Nown+" есть в списке удаленных! Импортировать вторично?")))
                    flag=false;
                   else
                    [#](dostowin (string(pdoc.Down," ":7)+" документ номер "+_Nown+" дублируется. "));
                    err_=true;
                    flag=false;
                   end;
                else
                  flag=next (pdoc);
                end;
              end;
            end;

            /* сохраняем документ в стадии ВВЕДЕН */
            if ((not err)and(not err_)) /*нет ошибок в реквизитах и нет дублей*/
              if (Not DocSave ())
                VclMsgBox (string(_Down:8," ":7)+" Ошибка сохранения документа. Данные не были импортированы.");
                otv=otv+1;
                SumDocOtv=SumDocOtv+SumDoc;
              else
                imp_doc(imp)=string(N_record:8);
                imp=imp+1;
                SumDocImp=SumDocImp+SumDoc;
              end;
            else
              otv=otv+1;
              SumDocOtv=SumDocOtv+SumDoc;
            end;
            if(err_)
              duble_=duble_+1;
            end;
     VclUseProgress (i);                         /* рисуем progress bar чтобы не скучать */
  end;
  VclRemProgress ();                 /* удалям progress bar */