{ exchange #2739
  при выгрузке ZR (11,195) и ZS (11,194)
  проверяется наименование отправителя (ORG_NAME (11й класс)/PAY_NAME(194-й
  или 195й классы) с официальным наименованием организации плательщика.
  если названия не совпадают, формируется отдельный журнал таких сообщений,
  который в результате добавляется к журналу info.
  если включен контроль валидности, то будет вопрос - продолжать выгрузку
  или прервать, если есть расхождения в названиях.}

var
  vCheckByExch2739List: TStringList;
  vCheckByExch2739Count: integer;


{~FinalizeByExch2739
  записывает результат проверки в журнал info.
  если есть сообщения, то проверяется, если валидация включена,
  то будет диалог с вопросом: прервать или продолжить выгрузку?
  при этом отображается блокнот только с сообщениями о несовпадении
  названий в ЭД, прочие сообщения не отображаются.
  после выполнения функции список сообщений будет разрушен. это необходимо
  делать для освобождения ресурсов.
  результат:
    =true - продолжать выгрузку
    =false - прервать выгрузку.
  параметры:
    aParamCtlValidOn - контроль валидации (=true = да).}
function FinalizeByExch2739( aParamCtlValidOn: boolean): boolean;
var
  xFileInfo: string;
begin

    try

      if (vCheckByExch2739List = NIL)
        then Result := TRUE
        else begin
          // в любом случае дописываем сообщения в основной журнал info
          WriteInfo( vCheckByExch2739List.Text);

          // если контроль валидности отключен, сохраняем сообщения в файле
          // диалог не отображаем и продолжаем выгрузку.
          if NOT aParamCtlValidOn
            then Result := TRUE
            else begin
              // формируем промежуточный файл
              xFileInfo := ChangeFileExt( FileInfo, '.infoex');
              if FileExists( xFileInfo) then DeleteFile( xFileInfo);
              // сохраняем сообщение в файле и открываем блокнот
              WriteLogFile( xFileInfo, TRIM( vCheckByExch2739List.Text));
              ShellExecute( 'NotePad', xFileInfo, False);
              // отображаем диалог с выбором
              if (MessageDlg( 'В отдельных документах не совпадают наименование отправителя'#13#10
                             +'с официальным наименованием организации плательщика.'#13#10
                             +'Продолжить выгрузку?',
                             mtConfirmation,
                             mbYes + mbNo,
                             0) = mrYes)
                then Result := TRUE
                else begin
                  Result := FALSE;
                  WriteInfo( 'Выгрузка прервана пользователем.');
                end;
            end;

          // разрушаем объект сообщений
          vCheckByExch2739List.Free;
          vCheckByExch2739List := NIL;
        end;
      // сбрасываем общее число проверенных ЭД
      vCheckByExch2739Count := 0;

      except
        ExceptionLog( 'Сбой Un_Exch2739.FinalizeByExch2739');
    end;

end;


{~CheckByExch2739
  проверяет название орг. в документе aDocXml.
  aFileMarker - маркер формата: ZR или ZS.
  если названия не совпадут, сообщение сохранится в журнале в глоб.переменной
  vCheckByExch2739List с продолжением выгрузки.}
procedure CheckByExch2739( aDocXml: Variant; aFileMarker: string);
var
  xOrgName: string;
  xDocClass: string;
  xDocName: string;
  xFieldName: string;
  xFieldNameAccID: string;
  xFieldNameOrgID: string;
begin

    try
      xDocClass := aDocXml.getAttribute('DOCUMENTCLASS_ID');
      case aFileMarker of
        'ZR': if NOT (xDocClass in [ '11','195']) then EXIT;
        'ZS': if NOT (xDocClass in [ '11','194']) then EXIT;
        'ZN': if NOT (xDocClass in [ '11','194']) then EXIT;
      end;//case//

      // подсчитываем общее число проверенных ЭД
      if VarIsNull( vCheckByExch2739Count)
        then vCheckByExch2739Count := 0;
      INC( vCheckByExch2739Count);

      // pltcm
      case xDocClass of
        '11': begin
                xDocName := 'Заявка на оплату расходов';
                xFieldName := 'ORG_NAME';
                xFieldNameAccID := 'ORGACCOUNT_ID';
                xFieldNameOrgID := 'ORG_ID';
              end;
       '194': begin
                xDocName := 'Заявка БУ/АУ на получение наличных денег';
                xFieldNameOrgID := 'PAY_ID';
                xFieldName := 'PAY_NAME';
                xFieldNameAccID := 'PAY_ACC_ID';
              end;
       '195': begin
                xDocName := 'Заявка БУ/АУ на выплату средств';
                xFieldNameOrgID := 'PAY_ID';
                xFieldName := 'PAY_NAME';
                xFieldNameAccID := 'PAY_ACC_ID';
              end;
      end;//case//

      if (QueryField(  ' select count( * ) N from orgaccount A'
                      +' where A.Id=? and A.CREDENTIALS_FLAG=0'
                      +' and A.OTHER_RECEIVER_FLAG=0',
                       [ aDocXml.getAttribute( xFieldNameAccID)],
                         'N') <> '1')
        then EXIT;

      xOrgName := QueryField(  ' select O.DESCRIPTION N from org O'
                              +' where O.Id=?',
                               [ aDocXml.getAttribute( xFieldNameOrgID)],
                                 'N');

      if (xOrgName = aDocXml.getAttribute( xFieldName))
        then EXIT;

      // создаем список сообщений
      if (vCheckByExch2739List = NIL)
        then vCheckByExch2739List := TStringList.Create;

      // добавляем в журнал
      vCheckByExch2739List.Add(
          FORMAT(  #13#10'Наименование отправителя не соответствует официальному названию организации плательщика:'
                  +#13#10'   ЭД "%s" № %s дата %s на сумму %s'
                  +#13#10'      Наименование отправителя: %s'
                  +#13#10'      Официальное название организации плательщика: %s.',
                   [ xDocName,
                     TRIM( aDocXml.GetAttribute( 'DOC_NUMBER')),
                     aDocXml.GetAttribute( 'DOC_DATE'),
                     aDocXml.GetAttribute( 'AMOUNT'),
                     aDocXml.GetAttribute( xFieldName),
                     xOrgName]));
      except
        ExceptionLog( 'Сбой Un_Exch2739.CheckByExch2739');
    end;

end;


{~DoAppendZNKBK_
   exchange #3098
   добавляем раздел ZNKBK в список разделов.
   при этом контролируем идентичность полей:
   TYPE_KBK, KBK,ADD_CLASS.
   для одинаковых полей суммируем поле SUMMA.
   делаем это так:
   ищем одинаковость полей от текущего раздела выше до ближайшего
   раздела не ZNKBK. если не нашли - добавляем раздел в хвост.
   если нащли - суммируем поле SUMMA и новый раздел не добавляем.}
procedure DoAppendZNKBK_( aXmlFile, aXmlZNKBK: variant);
begin
  try
    DoAppendUniqueChild(aXmlFile, aXmlZNKBK, 'TYPE_KBK,KBK,ADD_CLASS', 'SUMMA', 'ZNKBK');
    except
      ExceptionProc( 'DoAppendZNKBK_');
  end;
end;


begin
end.
