//Модуль отчетных процедур и функций.

var
  XmlReport: Variant;

//Процедура создает Xml отчетов для выгруженных ПП, для передачи в VBA макрос.
//RepSession - параметр отчет по сессии
//RepTemplate - шаблон отчета
//Xml - xml параметров AzkExchange.
procedure MakeReport(RepSession: Boolean; RepTemplate: String; Xml: Variant);
var
  i: Integer;
  ProcessNodePP: Boolean; //флаг для обработки нода PP
begin
  //не указан шаблон отчетов.
  if Trim(RepTemplate) = '' then Exit;
  //если файл не сохранялся и отчет не по сессии, то выходим.
  //если отчет по сессии и файл не сохранялся и не последний в пакете, тоже выходим
  if ((not StrToBool(Xml.getAttribute('save_unload_file'))) and (not RepSession))
    or ((not StrToBool(Xml.getAttribute('save_unload_file'))) and (RepSession)
      and (not (StrToBool(Xml.getAttribute('PACKETLAST'))))) then Exit;
  //если отчет по сессии и последний пакет не сохраняли, то печатем то что
  //сохранили ранее и выходим.
  if (RepSession) and (not StrToBool(Xml.getAttribute('save_unload_file')))
    and (StrToBool(Xml.getAttribute('PACKETLAST')))
      and (FileExists(DirIni + '~Report.Xml')) then
  begin
    XmlReport := CreateOleObject('Microsoft.XmlDom');
    XmlReport.Load(DirIni + '~Report.Xml');
    RunReport(RepTemplate, Xml);
    Exit;
  end;
  ProcessNodePP := True;
  XmlReport := CreateOleObject('Microsoft.XmlDom');
  //отчет по сесии
  if RepSession then
    if FileExists(DirIni + '~Report.Xml') then
    begin
      XmlReport.Load(DirIni + '~Report.Xml');
      XmlReport := XmlReport.documentElement;
      Data := Data.documentElement;
      XmlReport.selectSingleNode('PP').setAttribute('SUM_TOTAL',
        StrToCurr(XmlReport.selectSingleNode('PP').getAttribute('SUM_TOTAL')) +
        StrToCurr(Data.selectSingleNode('PP').getAttribute('SUM_TOTAL')));
      XmlReport.selectSingleNode('PP').setAttribute('KOL',
        StrToInt(XmlReport.selectSingleNode('PP').getAttribute('KOL')) +
        StrToInt(Data.selectSingleNode('PP').getAttribute('KOL')));
      XmlReport := XmlReport.ownerDocument;
      Data := Data.ownerDocument;
      ProcessNodePP := False;
    end
    else
      XmlReport.appendChild(XmlReport.createElement('REPORT'))
  else //отчет по выгруженному файлу
    XmlReport.appendChild(XmlReport.createElement('REPORT'));
  XmlReport := XmlReport.documentElement;
  //нет данных для сохранения в отчет
  if VarIsNull(Data) then Exit;
  Data := Data.documentElement;
  //заполняем xml отчетов
  for i := 0 to Data.childNodes.Length - 1 do
  begin
    Data := Data.childNodes.Item[i];
    //строки пп и служ. инф. не нужна.
    if ((ProcessNodePP) and (Data.NodeName = 'PP')) or (Data.NodeName = 'PPT') then
      XmlReport.appendChild(XmlReport.ownerDocument.documentElement.appendChild(
        Data.cloneNode(False)));
    Data := Data.parentNode;
  end;
  XmlReport := XmlReport.ownerDocument;
  if (RepSession) and (not (Xml.getAttribute('PACKETLAST'))) then
  begin
    XmlReport.Save(DirIni + '~Report.Xml');
    Exit
  end;
  RunReport(RepTemplate, Xml);
end;

procedure RunReport(RepTemplate: String; Xml: Variant);
var
  RepFileName: String;
  Word: Variant;
begin
  WriteLog('Формирование отчета', True);
  RepTemplate := DirIni + 'Reports\' + RepTemplate;
  if not FileExists(RepTemplate) then
  begin
    WriteInfo('Не найден шаблон отчета: ' + RepTemplate);
    Exit;
  end;
  RepFileName := DirRep + 'Reestr_' + Xml.getAttribute('EXCH_DATE') + '_' +
    StringReplace(Format('%3d',[StrToInt(Xml.getAttribute('EXCH_PACKET'))]),
      ' ', '0') + '.RTF';
  try
    try
      Word := GetActiveOleObject('Word.Application');
    except
      Word := CreateOleObject('Word.Application');
    end;
    Word.Documents.Add(RepTemplate);
    Word.Application.Run('Module.Start', XmlReport.xml);
    Word.ActiveDocument.SaveAs(RepFileName, 6);
    with GetActiveOleObject('Word.Application') do
    begin
      Visible := True;
      ActiveDocument.Activate;
    end;
    WriteLog('Отчет сформирован успешно', True);
  except
    WriteInfo('Ошибка при формировании отчета: ' + LastException.Message);
  end;
end;

begin
end.