{
   Модуль описания функций инициализации скриптов.
}

//uses 'FK_VerConst.inc';

{~InitializeMain
  инициализация всех модулей для начала работы главного скрипта.
  эти операции одинаковые для всех сприптов, поэтому вынесены в подпрограмму.
  последовательность инициализации не должна быть нарушена!
  aXml - входное задание XML.
    <>NULL - будет сохранено как тестовое в файле aTestFileName.
              если aXml тестовое задание будет возвращено значение =NULL.
    =NULL - будет попытка загрузить тестовое задание из файла aTestFileName
            и результат будет возвращен как загруженный xml.
  aProcFinalize - имя подпрограммы завершения (финализации) в главном скрипте.
                  по умолчанию оно предопределено как Finalize.
                  в каждом скрипте должна быть подпрограмма Finalize, которая
                  должна выполнить операции завершения работы скрипта (чистка
                  ресурсов, закрытие окон и др).
  результат:
    либо входная XML из параметра aXml, либо, если указана опция отладки,
    то будет загружена XML из файла, указанного по конфигурации отладки.}
function InitializeMain( aXml: variant;
                         aTestFileName: string;
                         aProcFinalize: string = 'Finalize'): variant;
begin
  try
//    InitializeDebug;        // инициализация модуля Un_Debug
    InitializeLog;   // инициализация модуля Un_Log

    InitializeSystem( aProcFinalize);   // инициализация модуля Un_System
//    InitializeUnVersionSupport;          // инициализация модуля Un_VersionSupport
//    InitializeProgressControl;    // инициализация модуля контролов отображения прогресса
//    InitializeMessageValid( '','');  // инициализация модуля сообщений в окнах
//    DecimalSeparator('.');
    Result := XmlTestTask( aXml, aTestFileName);  // загрузка/сохранение тестовой XML
    if VarIsNull( Result) then EXIT;

    except
      ExceptionLog( 'Сбой скрипта: "Un_Default.InitializeMain".');
  end;
end;

{~FinalizeMain
  завершение работы модулей в главном скрипте:
    1) завершение модуля отладки
    2) завершение модуля контролов прогрессов и сброс прогрессов.
  эта подпрограмма должна вызываться из подпрограммы Finalize целевого скрипта
  в последнюю очередь.}
procedure FinalizeMain;
begin
  // добавлено в связи с доработкой модуля поддержки версий ТФФ
//  FinalizeUnVersionSupport;
  FinalizeDebug;
  // инициализируем контролы
  ShowProgress( 0);
//  StatusBarSimpleText( '');
  // сбрасываем контролы прогресс/статус баров
//  FinalizeProgressControl;
end;

(*

{~InitializeDefault
Инициализация кэша запросов, создание каталогов, проверки совместимости и т.п.
Xml - входящая xml с параметрами выгрузки/загрузки
FileLogInfoName - имя файла лога без расширения (передаем имя файла конфига)
Unload - флаг инициализации выгрузки/загрузки. Для загрузки нек.каталоги не создаем.}
function InitializeDefault( Xml: Variant;
                            FileLogInfoName: String;
                            Unload: Boolean = True;
                            aCreateObjects: boolean = TRUE): String;
var
  SL: TStringList;
begin
  try
    
    // удаляем точку справа от имени файла, если точка - последний символ
    if (LENGTH( FileLogInfoName) > 0) then
      if (FileLogInfoName[ LENGTH( FileLogInfoName)] = '.')
        then DELETE( FileLogInfoName, LENGTH( FileLogInfoName), 1);
    

    QueryInitialization(Xml);
    DirIni := ExtractFilePath(Xml.documentElement.getAttribute('INI_FILE'));


    // каталог скриптов. это необходимо для модуля Un_System
    vDirScripts := DirIni;
    
    FirstInfo := False;
    if aCreateObjects then begin
      RegExp := CreateOleObject('VBScript.RegExp');
      RegExp.Global := True;
      Data := CreateOleObject('Microsoft.XmlDom');
      Data.appendChild(Data.createElement('FORMAT'));
    end;
    SL:= TStringList.Create;
    with Xml.documentElement, SL do
    try
      FileLog := DirIni + FileLogInfoName + '.Log';


      // промежуточный журнал операции
      vJournalTmp := DirIni + FileLogInfoName + '.журнал';
      if FileExists( vJournalTmp) then DeleteFile( vJournalTmp);


      FileInfo := DirIni + FileLogInfoName + '.Info';
      if FileExists(FileInfo) then DeleteFile(FileInfo);


      FileValidate := DirIni + FileLogInfoName + '.Validate';
      if FileExists(FileValidate) then DeleteFile(FileValidate);



      // exchange #2336 ошибка при проверке версии
      if CompareVersionEx(AppVersion, WorkAppVersion, 0) < 0 then
        raise('Скрипты работают с AzkExchange.Exe начиная с версии: ' + WorkAppVersion +
          ''#13#10'Текущая версия AzkExchange.Exe: ' + AppVersion);

      // exchange #2336 ошибка при проверке версии
      // exchange #2472 проверяем только две старшие группы версии (x.x)
      if CompareVersionEx(AzkVersion, WorkAzkVersion, 2) < 0 then
        raise('Скрипты работают с АЦК-Финансы начиная с версии: ' + WorkAzkVersion +
          ''#13#10'Текущая версия АЦК-Финансы: ' + AzkVersion);




      WriteLog('=== ИНИЦИАЛИЗАЦИЯ ===');
      WriteLog('Версия скриптов: ' + FK_Version);
      CommaText := getAttribute('CONFIG');

      Result := getAttribute('CONFIG');
      DirTmp := DirIni + 'Temp\';

      ForceDirectories(DirTmp);
      if not DirectoryExists(DirTmp) then
        raise('Ошибка при определении временного каталога: ' + DirTmp);
      DirOut := Trim(Values['Исходящий каталог']);
      if DirOut = '' then DirOut := 'Out';
      if (DirOut[Length(DirOut)] <> '\') then
        DirOut := DirOut + '\';
      if ExtractFileDrive(DirOut) = '' then
        DirOut := DirIni + DirOut;

      ForceDirectories(DirOut);
      if not DirectoryExists(DirOut) then
        raise('Ошибка при определении исходящего каталога: ' + DirOut);
      DirArh := Trim(Values['Архивный каталог']);
      //для выгрузки создаем каталог архива когда параметр архивный каталог заполнен
      if (not Unload) or (DirArh <> '') then
      begin
        if DirArh = '' then DirArh := 'Arh';
        if (DirArh[Length(DirArh)] <> '\') then
          DirArh := DirArh + '\';
        if ExtractFileDrive(DirArh) = '' then
          DirArh := DirIni + DirArh;

        ForceDirectories(DirArh);
        if not DirectoryExists(DirArh) then
          raise('Ошибка при определении архивного каталога: ' + DirArh);
      end;
      if DirTmp = DirOut then
        Raise('Исходящий каталог не должен совпадать с временным каталогом.');
      DirRep := Trim(Values['Каталог отчётов']);
      if DirRep = '' then DirRep := 'Rep';
      if (DirRep[Length(DirRep)] <> '\') then
        DirRep := DirRep + '\';
      if ExtractFileDrive(DirRep) = '' then
        DirRep := DirIni + DirRep;

      ForceDirectories(DirRep);
      if not DirectoryExists(DirRep) then
        raise('Ошибка при определении каталога отчётов: ' + DirRep);
      DirIn := Trim(Values['Каталог поиска']);
      if ExtractFileDrive(DirIn) = '' then
        DirIn := DirIni + DirIn;
      //параметры одинаковые для всех выгрузок
      //влияют на формирование файла
      FileOutIsLocalNet := Values['Файл формируется в выделенной ' +
        'локальной вычислительной сети'] = 'Да';
      FileOutOrgCodeIsFk := Values['Код организации присвоен ОрФК'] = 'Да';
      //связаны с контролем валидности
      param_CtlValidOn := Values['Контроль валидности'] = 'Вкл';
      param_StopAllUnloadDocNotValid := Values['Останавливать выгрузку при не ' +
        'прохождении валидности отдельными документами'] = 'Да';
      param_changeKBK := Values['Разрешить заменять незаведенные КБК на 0'] = 'Да';
      // Exchange 2336: поддерживаемая версия
      ParseParametersVersionSupport( DirIni, SL);
    finally
      SL.Free;
    end;

    
    except
      ExceptionLog( 'Сбой скрипта: "Un_Default.InitializeDefault".');
  end;
end; {End InitializeDefault}

{~FinalizeDefault
  завершение скрипта:
  1) вызывается закрытие модуля запросов QueryFinalization.
  2) удаляется временный файл журнала операций скрипта (vJournalTmp).}
procedure FinalizeDefault(Xml: Variant; Unload: Boolean = True);
begin
  QueryFinalization(Xml);
  WriteLog('===   ЗАВЕРШЕНИЕ  ===');
  // при завершщении операции удаляется файл временного журнала
  {
  if FileExists( vJournalTmp) then begin
    DeleteFile( vJournalTmp);
    vJournalTmp := '';
  end;
  }
end; {End FinalizeDefault}
*)

begin
end.
