uses
  'UfebsDefault',
  '..\UfebsTools',

  'Un_UfebsMinFinRyazanOblLog',
  '..\Un_Log',
  '..\UfebsConst',
  '..\Un_Progress',
  '..\WorkUfebsVersion.inc',
  '..\WorkAppVersion.inc',
  '..\UfebsVersionInc.inc',
  '..\Un_Debug';

function SpawnPayOrder(Ed, Doc: Variant): Boolean;
var
  FlagNP: Boolean;
  Line, Row, VarValue: Variant;
begin
  Result := False;
  Xml := CreateOleObject('Microsoft.XmlDom');
  Xml.loadXml(ExecProc('DOCUMENT', ['action', 'read', 'class',
    Doc.getAttribute('DOCUMENTCLASS_ID'), 'ID', Doc.getAttribute('ID')]));
  Xml := Xml.documentElement;
  // Exchange #2244
  if Copy(Xml.getAttribute('REC_ACCOUNT'), 1, 5) = '40601' then
  begin
    WriteLog('По счету, который начинается на 40601, строки расшифровки не создаются');
    Exit;
  end;
  WriteLog('Создание строки расшифровки');
  Line := Xml.SelectSingleNode('PAYORDERLINE');
  Line := Line.appendChild(Line.ownerDocument.createElement('PAYORDERLINE'));
  Line.setAttribute('AMOUNT', Xml.getAttribute('AMOUNT'));
  //Exchange #2176
  if Copy(Xml.getAttribute('REC_ACCOUNT'), 1, 5) = '40302' then
  begin
    //проверка получателя из выписки и счета получателя
    if Xml.getAttribute('REC_ACCOUNT') <> '' then
    begin
      Row := QueryXml('Select Oa.Id' +
        ' From OrgAccount Oa' +
        ' Join Org O on O.Id = Oa.Org_id' +
        ' Join OrgRoles Ors on Ors.Org_Id = O.Id' +
        ' Join OrgRole Orl on Ors.OrgRole_Id = Orl.Id' +
        ' Where Oa.Account_Number = ? and Oa.Orgacctype_Id = 2' +
        ' and Oa.Close_Date is null and Orl.Id = 5',
        [Xml.getAttribute('REC_ACCOUNT')]);
      if Row.documentElement.childNodes.length = 1 then
        Xml.setAttribute('REC_ACC_ID',
          Row.documentElement.childNodes.Item[0].getAttribute('ID'))
      else begin
        WriteLog('Не найден Id счета у организации с ролью "Орган ФК" по номеру ' +
          Xml.getAttribute('REC_ACCOUNT'));
      end;
    end
    else begin
      WriteLog('Не заполнен счет получателя');
      Exit;
    end;
    if Xml.getAttribute('ORG_ID') <> '' then
    begin
      //поиск внебюджетного не закрытого счета 5-го типа
      Row := QueryXml('Select O.Description Org_Name, O.Taxcode, O.Kpp,' +
        ' Ls.Id Ls_Id, Ls.Account_Number Ls_Number,' +
        ' Bs.Id Bs_Id, Bs.Account_Number Bs_Number, Ufk.Id Ufk_Id,' +
        ' Ufk.Description Ufk_Name, Tofk.Id Tofk_Id, Tofk.Description Tofk_Name,' +
        ' B.Bic, B.Description Bank_Name, B.CorAccount' +
        ' From Org O' +
        ' Join OrgAccount Ls on Ls.Org_id = O.Id' +
        ' Join OrgAccount Bs on Bs.Id = Ls.ExecuterAcc_Id' +
        ' Join Org Ufk on Ufk.Id = Ls.Executer_id' +
        ' Join Org Tofk on Tofk.Id = Ls.Keeper_id' +
        ' Join Bank B on B.Id = Bs.Bank_Id' +
        ' Where Ls.Org_Id = ? and Bs.Id = ? and Ls.Orgacctype_Id = 5' +
        '   and Ls.Budget_Flag = 0 and Ls.Close_Date is null',
        [Xml.getAttribute('ORG_ID'), Xml.getAttribute('REC_ACC_ID')]);
      if Row.documentElement.childNodes.length <> 1 then
      begin
        WriteLog('Не найден внебюджетный лицевый счет в ФК у организации с Id=' +
          Xml.getAttribute('ORG_ID') + ', который открыт на счете с Id=' +
          Xml.getAttribute('REC_ACC_ID'));
        Exit;
      end;
      Row := Row.documentElement.childNodes.item[0];
      //заполняем 24 класс новыми данными
      Xml.setAttribute('REC_ID', Xml.getAttribute('ORG_ID'));
      Xml.setAttribute('REC_TAXCODE', Row.getAttribute('TAXCODE'));
      Xml.setAttribute('REC_KPP', Row.getAttribute('KPP'));
      Xml.setAttribute('REC_NAME', Row.getAttribute('ORG_NAME'));
      Xml.setAttribute('REC_ACC_ID', Row.getAttribute('LS_ID'));
      Xml.setAttribute('REC_ACCOUNT', Row.getAttribute('LS_NUMBER'));
      Xml.setAttribute('REC_UFK_ACCOUNT', Row.getAttribute('BS_NUMBER'));
      Xml.setAttribute('REC_UFK_ACC_ID', Row.getAttribute('BS_ID'));
      Xml.setAttribute('REC_BIC', Row.getAttribute('BIC'));
      Xml.setAttribute('REC_CORACCOUNT', Row.getAttribute('CORACCOUNT'));
      Xml.setAttribute('REC_UFK_NAME', Row.getAttribute('UFK_NAME'));
      Xml.setAttribute('REC_OFK_NAME', Row.getAttribute('TOFK_NAME'));
      Xml.setAttribute('REC_B_NAME', Row.getAttribute('BANK_NAME'));
      //строки
      Line.setAttribute('ANAL_KIND', 1);
      Line.setAttribute('KADMD_CODE', 0);
      Line.setAttribute('KD_CODE', 0);
      Line.setAttribute('KESD_CODE', 0);
      Line.setAttribute('KDD_CODE', 0);
      Line.setAttribute('FSD_ID', 3);
      Line.setAttribute('DESCRIPTION', 'Доходы во временном распоряжении');
      Row := QueryXml('Select R.Id From Receiver R Where R.Org_Id = ?' +
        ' and R.Budget_Id = ?', [Xml.getAttribute('ORG_ID'),
        Xml.getAttribute('BUDGET_ID')]);
      if Row.documentElement.childNodes.length = 0 then
        WriteLog('Не найден получатель доходов у организации с Id=' +
          Xml.getAttribute('ORG_ID') + ' в бюджете документа')
      else if Row.documentElement.childNodes.length > 1 then
        WriteLog('Несколько получателей доходов у организации с Id=' +
          Xml.getAttribute('ORG_ID') + ' в бюджете документа')
      else
        Line.setAttribute('RECEIVER_ID',
          Row.documentElement.childNodes.item[0].getAttribute('ID'));
    end
    else begin
      WriteLog('Id получателя из выписки не определен');
      Exit;
    end;
  end
  else begin
    Line.setAttribute('FSD_ID', 2);
    Line.setAttribute('DESCRIPTION', 'Перечисление доходов от предпринимательской' +
      ' и иной приносящий доход деятельности');
    FlagNP := False;
    if (Xml.getAttribute('PI_ANAL_KIND') = 1)
      and (Length(Xml.getAttribute('PI_BUDGET_CODE')) = 20) then
    begin
      if Xml.getAttribute('ORG_ID') <> '' then
        VarValue := QueryField('Select A.Id' +
          ' From OrgAccount A' +
          ' Where A.Org_Id = ? And A.OrgAccType_Id = 5' +
          ' And A.Budget_Flag = 0 And A.Close_Date Is Null',
          [Xml.getAttribute('ORG_ID')], 'ID')
      else
        VarValue := nil;
      Line.setAttribute('ANAL_KIND', Xml.getAttribute('PI_ANAL_KIND'));
      Line.setAttribute('KADMD_CODE', Copy(Xml.getAttribute('PI_BUDGET_CODE'), 1, 3));
      Line.setAttribute('KD_CODE', Copy(Xml.getAttribute('PI_BUDGET_CODE'), 4, 14));
      Line.setAttribute('KESD_CODE', Copy(Xml.getAttribute('PI_BUDGET_CODE'), 18, 3));
      if not CheckCode('KADM', Line.getAttribute('KADMD_CODE')) or
        not CheckCode('KD', Line.getAttribute('KD_CODE')) or
        not CheckCode('KES', Line.getAttribute('KESD_CODE')) or
        (VarValue = nil) then
      begin
        FlagNP := True;
        WriteInfo(edtName[Ed.EDType] + Format(' № %d', [Ed.EDNo]) +
          ' Дата: ' + FormatDateTime('dd.mm.yyyy', Ed.EDDate) +
          ' Сумма: ' + Format('%.2f', [Ed.Sum]) +
          ' - Постановка на невыясненные' +
          IfThen(VarValue = nil, ' (Не найдена организация или счет получателя)',
          '(Не корректный КБК)'));
        Line.setAttribute('KADMD_CODE', '292');
        Line.setAttribute('KD_CODE', '30398020020000');
        Line.setAttribute('KESD_CODE', '180');
      end;
    end
    else
    begin
      FlagNP := True;
        WriteInfo(edtName[Ed.EDType] + Format(' № %d', [Ed.EDNo]) +
          ' Дата: ' + FormatDateTime('dd.mm.yyyy', Ed.EDDate) +
          ' Сумма: ' + Format('%.2f', [Ed.Sum]) +
          ' - Постановка на невыясненные (Не корректный КБК)');
      Xml.setAttribute('PI_ANAL_KIND', '1');
      Line.setAttribute('ANAL_KIND', '1');
      Line.setAttribute('KADMD_CODE', '292');
      Line.setAttribute('KD_CODE', '30398020020000');
      Line.setAttribute('KESD_CODE', '180');
    end;
    if Xml.getAttribute('ORG_ID') = '' then
    begin
      Row := QueryXml('Select Id From Receiver Where Budget_id = ? And IsDefault = 1',
        [Xml.getAttribute('BUDGET_ID')]);
      if Row.documentElement.childNodes.length = 0 then
        WriteLog('Не найден получатель доходов по умолчанию в бюджете документа')
      else if Row.documentElement.childNodes.length > 1 then
        WriteLog('Несколько получателей доходов по умолчанию в бюджете документа')
      else
        Line.setAttribute('RECEIVER_ID',
          Row.documentElement.childNodes.item[0].getAttribute('ID'));
    end
    else
    begin
      Row := QueryXml('Select Id From Receiver Where Budget_id = ? And Org_Id = ?',
        [Xml.getAttribute('BUDGET_ID'), Xml.getAttribute('ORG_ID')]);
      if Row.documentElement.childNodes.length = 0 then
        WriteLog('Не найден получатель доходов по референсу организации ' +
          Xml.getAttribute('ORG_ID') + ', в бюджете документа')
      else if Row.documentElement.childNodes.length > 1 then
        WriteLog('Несколько получателей доходов по референсу организации ' +
          Xml.getAttribute('ORG_ID') + ', в бюджете документа')
      else
        Line.setAttribute('RECEIVER_ID', Row.documentElement.childNodes.item[0].getAttribute('ID'));
      if FlagNP = False then
      begin
        Row := QueryXml('Select A.Id, A.Account_Number, UfkBank.Description Bank_Name' +
          ', UfkAcc.Account_Number Ufk_Account_Number, UfkBank.CorAccount, UfkBank.Bic' +
          ', Ufk.Description Ufk_Name, Ofk.Description Ofk_Name, O.Description' +
          ' From OrgAccount A' +
          ' Join Org O On O.Id = A.Org_Id' +
          ' Join OrgAccount UfkAcc On UfkAcc.Id =  A.ExecuterAcc_Id' +
          ' Join Bank UfkBank On UfkBank.Id = UfkAcc.Bank_Id' +
          ' Join Org Ufk On Ufk.Id = A.Executer_Id' +
          ' Join Org Ofk On Ofk.Id = A.Keeper_Id' +
          ' Where A.Org_Id = ? And A.Budget_Flag = 0 And A.Close_Date Is Null',
          [Xml.getAttribute('ORG_ID')]);
        if Row.documentElement.childNodes.length = 1 then
        begin
          Row := Row.documentElement.childNodes.item[0];
          Xml.setAttribute('REC_ID', Xml.getAttribute('ORG_ID'));
          Xml.setAttribute('REC_TAXCODE', Xml.getAttribute('ORG_TAXCODE'));
          Xml.setAttribute('REC_KPP', Xml.getAttribute('ORG_KPP'));
          Xml.setAttribute('REC_NAME', Row.getAttribute('DESCRIPTION'));
          Xml.setAttribute('REC_ACC_ID', Row.getAttribute('ID'));
          Xml.setAttribute('REC_ACCOUNT', Row.getAttribute('ACCOUNT_NUMBER'));
          Xml.setAttribute('REC_UFK_ACCOUNT', Row.getAttribute('UFK_ACCOUNT_NUMBER'));
          Xml.setAttribute('REC_BIC', Row.getAttribute('BIC'));
          Xml.setAttribute('REC_CORACCOUNT', Row.getAttribute('CORACCOUNT'));
          Xml.setAttribute('REC_UFK_NAME', Row.getAttribute('UFK_NAME'));
          Xml.setAttribute('REC_OFK_NAME', Row.getAttribute('OFK_NAME'));
          Xml.setAttribute('REC_B_NAME', Row.getAttribute('BANK_NAME'));
        end;
      end;
    end;
    if FlagNP = True then
    begin
      Row := QueryXml('Select A.Org_Id, A.Id, A.Account_Number, UfkBank.Description Bank_Name' +
        ', UfkAcc.Account_Number Ufk_Account_Number, UfkBank.CorAccount, UfkBank.Bic' +
        ', Ufk.Description Ufk_Name, Ofk.Description Ofk_Name, O.Description, O.TaxCode, O.Kpp' +
        ' From Budget B' +
        ' Join OrgAccount A On A.Org_Id = B.Org_Id' +
        ' Join Org O On O.Id = A.Org_Id' +
        ' Join OrgAccount UfkAcc On UfkAcc.Id =  A.ExecuterAcc_Id' +
        ' Join Bank UfkBank On UfkBank.Id = UfkAcc.Bank_Id' +
        ' Join Org Ufk On Ufk.Id = A.Executer_Id' +
        ' Join Org Ofk On Ofk.Id = A.Keeper_Id' +
        ' Where B.Id = ? And A.Budget_Flag = 0 And A.Close_Date Is Null And A.Distributive_Flag = 0',
        [Budget_Id]);
      if Row.documentElement.childNodes.length = 1 then
      begin
        Row := Row.documentElement.childNodes.item[0];
        Xml.setAttribute('REC_ID', Row.getAttribute('ORG_ID'));
        Xml.setAttribute('REC_TAXCODE', Row.getAttribute('TAXCODE'));
        Xml.setAttribute('REC_KPP', Row.getAttribute('KPP'));
        Xml.setAttribute('REC_NAME', Row.getAttribute('DESCRIPTION'));
        Xml.setAttribute('REC_ACC_ID', Row.getAttribute('ID'));
        Xml.setAttribute('REC_ACCOUNT', Row.getAttribute('ACCOUNT_NUMBER'));
        Xml.setAttribute('REC_UFK_ACCOUNT', Row.getAttribute('UFK_ACCOUNT_NUMBER'));
        Xml.setAttribute('REC_BIC', Row.getAttribute('BIC'));
        Xml.setAttribute('REC_CORACCOUNT', Row.getAttribute('CORACCOUNT'));
        Xml.setAttribute('REC_UFK_NAME', Row.getAttribute('UFK_NAME'));
        Xml.setAttribute('REC_OFK_NAME', Row.getAttribute('OFK_NAME'));
        Xml.setAttribute('REC_B_NAME', Row.getAttribute('BANK_NAME'));
        Row := QueryXml('Select Id From Receiver Where Budget_id = ? And Org_Id = ?',
          [Xml.getAttribute('BUDGET_ID'), Xml.getAttribute('REC_ID')]);
        if Row.documentElement.childNodes.length = 0 then
          WriteLog('Не найден получатель доходов по референсу организации ' +
            Xml.getAttribute('REC_ID') + ', в бюджете документа')
        else if Row.documentElement.childNodes.length > 1 then
          WriteLog('Несколько получателей доходов по референсу организации ' +
            Xml.getAttribute('REC_ID') + ', в бюджете документа')
        else
          Line.setAttribute('RECEIVER_ID',
            Row.documentElement.childNodes.item[0].getAttribute('ID'));
      end;
    end;
  end;
  Xml.setAttribute('action', 'update');
  Xml.setAttribute('class', Doc.getAttribute('DOCUMENTCLASS_ID'));
  if not CheckCode('KADM', Line.getAttribute('KADMD_CODE'), True) or
    not CheckCode('KD', Line.getAttribute('KD_CODE'), True) or
    not CheckCode('KES', Line.getAttribute('KESD_CODE'), True) then
      Exit;
  ExecXml(Xml.xml);
  Result := True;
end; {End SpawnPayOrder}

var
  Ed, Doc: Variant;

begin
  FileTest := 'C:\Temp\UfebsLoad.Xml';
  if not FileExists(FileTest) then
  begin
    ShowMessage('Не найден тестовый пример: ' + FileTest);
    Exit;
  end;
  Xml := CreateOleObject('Microsoft.XmlDom');
  if not Xml.Load(FileTest) then
  begin
    ShowMessage('Ошибка при загрузке: ' + FileTest);
    Exit;
  end;
  FileTest := 'C:\Temp\Doc.Xml';
  if not FileExists(FileTest) then
  begin
    ShowMessage('Не найден тестовый пример: ' + FileTest);
    Exit;
  end;
  Doc := CreateOleObject('Microsoft.XmlDom');
  if not Doc.Load(FileTest) then
  begin
    ShowMessage('Ошибка при загрузке: ' + FileTest);
    Exit;
  end;
  FileTest := 'C:\Temp\Ed.Xml';
  if not FileExists(FileTest) then
  begin
    ShowMessage('Не найден тестовый пример: ' + FileTest);
    Exit;
  end;
  Ed := CreateOleObject('Ufebs.Ed101');
  Ed.NSType[nstEd] := 'ed';
  Ed := Ed.LoadFromFile(FileTest);
  IsLogined := AzkIsLogin;
  if not IsLogined then
    if not AzkLogin then
      Exit;
  try
    Initialize(Xml);
    SpawnPayOrder(Ed, Doc.documentElement);
  finally
    Finalize;
    if not IsLogined then
      AzkLogout;
  end;
end.
