{
   Exchange #2334
   ведение уникального номера Перечня.
   необходимо для каждого учредителя, при выгрузке, создавать новый номер.
   этот номер клиент сверяет со своим номером(в диалоге).
   при каждой выгрузке необходимо создавать свои номера учреждений.
   в результате, этот номер записывается поле TL.NOM_TL файла *.TL.

   ведется файл Send.dat вида:

[СУБСИДИЯ]
20120628=22
20120629=46

[БЮДЖЕТ_N]
УЧРЕЖДЕНИЕ_a=num1
УЧРЕЖДЕНИЕ_a_ВЫГР=n1
УЧРЕЖДЕНИЕ_b=num2
УЧРЕЖДЕНИЕ_b_ВЫГР=n2

  секция БЮДЖЕТ_N содержит перечень номеров для каждого учреждения для
  этого бюджета. так же каждое учреждение сохранят номер операции выгрузки,
  в которой сохранялся номер учреждения (это описано ниже).
  
  задача:
    при выполнении выгрузки, для каждого учреждения хранить некий номер,
  который будет использоваться для заполнения поля TL.NOM_TL для каждого
  учреждения индивидуально.
    при выгрузке этот номер используется для нумерования учреждения и
  синхронизируется с номером учреждения пользователя вручную, в диалоге
  подтверждения номера пользователем.
    в каждой операции выгрузки этот номер будет инкрементироваться и
  подтверждаться пользователем в диалоге (для каждого учреждения индивидуально).
  для одинаковых учреждений, диалог повторно вызываться не должен.

[ОПЕРАЦИЯ]
НОМЕР_ЭКСПОРТА=n

   чтобы при выполнении одной выгрузки постоянно не задавался вопрос о новом
   номере одного и того же учредителя (в одной выгрузке спрашивать нужно об
   учередителе только единожды), то вводим номер операции выгрузки
   (vActionExportNomTL), который ведем в этом же файле.
   суть такая:
     в начале экспорта этот номер выгружается из файла и инкрементируется.
     в процессе экспорта этот номер не меняется. при следующем экспорте этот
     номер будет новый.
     помимо параметра УЧРЕЖДЕНИЕ_N=nom будем хранить еще и параметр
     УЧРЕЖДЕНИЕ_N_ВЫГР=операция, в котором операция и будет нашим текущим
     vActionExportNomTL. если при получении этого номера из файла он не
     будет совпадать с текущим vActionExportNomTL - то откроем диалог с
     подтверждением номер. после закрытия диалога обновится этот параметр
     в файле для этого учреждения и в следующий раз, номер будет совпадать
     с номером текущей выгрузки и диалог показывать не будем.
}
{ при отладке разблокировать описание uses.
uses 'Un_Log';{ не удалять!}

const
  cnIniFileName                           = 'Schems\Send.dat';

  cnIniSection_NomTL                      = 'СУБСИДИЯ';
  cnIniSection_Budget                     = 'БЮДЖЕТ_%s';
    cnIniParam_OrgID                      = 'УЧРЕЖДЕНИЕ_%s';
    cnIniParam_OrgID_EXP                  = 'УЧРЕЖДЕНИЕ_%s_ВЫГР';
  cnIniSection_ActionExportNomTL          = 'ОПЕРАЦИЯ';
    cnIniParam_ActionExportNomTL          = 'НОМЕР_ЭКСПОРТА';

var
  // уникальный номер операции экспорта
  vActionExportNomTL: integer = 0;
  

//Запись номера посылки в течении дня
//  aDirIni - корневой каталог скриптов
//  aPacketNumber - текущий номер перечня
procedure SavePacketNumber( aDirIni: string; aPacketNumber: integer);
begin
  with TIniFile.Create( aDirIni + cnIniFileName) do
    try
      WriteString(
          cnIniSection_NomTL,
          FormatDateTime('yyyymmdd', Now),
          IntToStr(aPacketNumber));
      finally
        Free;
    end;
end;


// Чтение номера посылки.
//  aDirIni - корневой каталог скриптов
function LoadPacketNumber( aDirIni: string): integer;
begin
  with TIniFile.Create(aDirIni + cnIniFileName) do
    try
      Result := StrToInt(
                    ReadString(
                      cnIniSection_NomTL,
                      FormatDateTime('yyyymmdd', Now),
                      '0')) + 1;
      finally
        Free;
    end;
end;


// эту подпрограмму нужно вызывать в начале экспорта.
// при повторе экспорта нужно так же вызвать функцию еще раз.
procedure InializeActionExportNomTL( aDirIni: string);
begin
  with TIniFile.Create(aDirIni + cnIniFileName) do
    try
      // получаем номер и сразу же инкрементируем
      vActionExportNomTL :=
            ReadInteger(
              cnIniSection_ActionExportNomTL,
              cnIniParam_ActionExportNomTL,
              0) + 1;
      // сразу же сохраняем новый номер
      WriteInteger(
              cnIniSection_ActionExportNomTL,
              cnIniParam_ActionExportNomTL,
              vActionExportNomTL);
      finally
        Free;
    end;
end;


function LoadNomTLOfBudgetAndOrgID(
            aDirIni: string;
            aBudgetID, aOrgID: string;
            var aActionID: integer): string;
var n: integer;
begin
  with TIniFile.Create(aDirIni + cnIniFileName) do
    try
      Result := TRIM(
                   ReadString(
                      FORMAT( cnIniSection_Budget, [ aBudgetID]),
                      FORMAT( cnIniParam_OrgID, [ aOrgID]),
                      '0'));// + 1;
      // пытаемся преобразовать в число и инкрементировать.
      try
        n := STRTOINT( Result);
        Result := INTTOSTR( n + 1);
        except
          // если не число - оставляем как есть
      end;
      // читаем параметр операции экспорта, в которой было выполнено обновление
      // номера учреждения в последний раз
      aActionID := ReadInteger(
                      FORMAT( cnIniSection_Budget, [ aBudgetID]),
                      FORMAT( cnIniParam_OrgID_EXP, [ aOrgID]),
                      0);
      finally
        Free;
    end;
end;

procedure SaveNomTLOfBudgetAndOrgID(
            aDirIni: string;
            aBudgetID, aOrgID, aNumber: string);
begin
  with TIniFile.Create(aDirIni + cnIniFileName) do
    try
      WriteString(
            FORMAT( cnIniSection_Budget, [ aBudgetID]),
            FORMAT( cnIniParam_OrgID, [ aOrgID]),
            aNumber);
      // в качестве номера операции экспорта сохраняем текущий номер
      // операции экспорта из глобальной переменной.
      WriteInteger(
            FORMAT( cnIniSection_Budget, [ aBudgetID]),
            FORMAT( cnIniParam_OrgID_EXP, [ aOrgID]),
            vActionExportNomTL);
      finally
        Free;
    end;
end;



function GetExportNomTL(
            aDirIni: string;
            aBudgetID, aOrgID, aOrgName: string): string;
var
  xForm: TForm;
  xMemoOrgName: TMemo;
  xEdNomTL: TLabeledEdit;
  xActionID: integer;
  xCanceled: boolean;
begin
  xCanceled := FALSE;   // отмены закрытия формы еще небыло
  try
    
    
    // получаем номер учреждения из файла.
    Result := LoadNomTLOfBudgetAndOrgID(
                  aDirIni, aBudgetID, aOrgID, xActionID);
    // если номер операции совпадает с текущим номером, значит номер учреждения
    // уже был проверен и подтвержден, поэтому возвращаем этот номер и
    // диалог подтверждения уже не открываем.
    if (xActionID = vActionExportNomTL) then begin
      
      EXIT;
    end;
                  
    // открываемдиалог подтверждения номера учреждения
    xForm := TForm.Create(Application);
    try
      LoadForm( aDirIni + 'Forms\Form_ConfirmNumTL.dfm', xForm);
//  xForm.Caption := '  Субсидии и инвестиции';
      xMemoOrgName:= TMemo( xForm.FindComponent('mmOrgName'));
      xMemoOrgName.Lines.Text := aOrgName;
      xEdNomTL:= TLabeledEdit( xForm.FindComponent('edNomTL'));
      xEdNomTL.Text := Result;
    
      if (xForm.ShowModal <> mrOk) then begin
        Result := '';
        xCanceled := TRUE;  // отмена закрытия формы
        // без записи
        // вместо диалога пишем сообщение в журнал info
        //ShowMessage( 'Выгрузка отменена пользователем.');
        //raise('Выгрузка отменена пользователем.');
        WriteInfo( 'Выгрузка отменена пользователем.');
        Result := '';
        EXIT;
      end;
      
      // проверяем на пустую строку. не известно как правильно: разрешать
      // пустую строку или нет, поэтому пропускаем все что ввели.
      // при пустой строке добавляем пробел.
      Result := TRIM( xEdNomTL.Text);
      if (LENGTH( xEdNomTL.Text) <= 0) then Result := ' ';
//        if MessageDlg( 'Введен пустой номер учреждения.', mtInformation, mbCancel, 0);

      // сохраняем новый номер
      SaveNomTLOfBudgetAndOrgID( aDirIni, aBudgetID, aOrgID, Result);
      
      finally
        xForm.Free;
    end;
    except
      Result := '';
      if NOT xCanceled
        then ExceptionLog( 'Сбой скрипта: "Un_Generator_NomTL.GetExportNomTL".');
  end;
end;

begin
  { отладка
  InializeActionExportNomTL( 'D:\work\AzkScript\FK2009\');
  
  ShowMessage(
    GetExportNomTL(
      'D:\work\AzkScript\FK2009\',
      '1',
      '10',
      'тестирование'));

  ShowMessage(
    GetExportNomTL(
      'D:\work\AzkScript\FK2009\',
      '1',
      '10',
      'тестирование'));
  {не стирать эти строки!}
end.
