{~CreateDoc118
  создает документ 118 класса на основе данных файла IK.ZR

  aXmlED118 - описание создаваемого эд 118го
  aXmlZR - узел из входного файла

  результат:
    =true - эд aXmlED11 создан
    =false - эд aXmlED11 не создан.

  exchange #3062
    перенос функционала проверки кбк в строках сюда.}
function CreateDoc118(aXmlED118, aXmlZR, aXmlIK: Variant): Boolean;
var
  i: Integer;
  Fio, Dolzhnost: String;
  XmlOrg, XmlAcc, Kbk: Variant;
  xBudgetID: string;
begin

    try
      Result := False;

      xBudgetID := aXmlED118.getAttribute('F_BUDGET_ID');

      // exchange #3062 - перенос проверки строк ZRST в создание эд
      // проверка выполняется уже после того, как в логе указано
      // какой эд создается.
      if NOT CheckKBK_All_ZRST( aXmlZR, xBudgetID)
        then EXIT;

      aXmlED118.setAttribute('action', 'insert');
      aXmlED118.setAttribute('BUDGET_ID', xBudgetID);//aXmlED118.getAttribute('F_BUDGET_ID'));
      aXmlED118.setAttribute('GUID_FK', aXmlED118.getAttribute('FOREIGN_KEY'));
      aXmlED118.setAttribute('DOC_DATE', DateTimeToXml(StrToDate(aXmlED118.getAttribute('DOC_DATE'))));
      if aXmlZR.getAttribute('ORDER_PL') <> '0' then
        aXmlED118.setAttribute('QUEUE_KIND', aXmlZR.getAttribute('ORDER_PL'))
      else
        aXmlED118.setAttribute('QUEUE_KIND', GetQueueKind);
      //Exchange#2239
      if aXmlED118.getAttribute('QUEUE_KIND') = '=' then
        aXmlED118.setAttribute('QUEUE_KIND', '6');
      aXmlED118.setAttribute('LIMITING_DATE', aXmlZR.getAttribute('DATE_ISP'));
      if aXmlED118.getAttribute('LIMITING_DATE') <> '' then
        aXmlED118.setAttribute('LIMITING_DATE',
          DateTimeToXml(StrToDate(aXmlED118.getAttribute('LIMITING_DATE'))));
      aXmlED118.setAttribute('EXTSTATUS_ID', 0);
      aXmlED118.setAttribute('AMOUNT', 0);
      aXmlED118.setAttribute('SIGN_VOLUME', aXmlZR.getAttribute('TYPE'));
      aXmlED118.setAttribute('PAYKIND', PayKindSetAsAzk(aXmlZR.getAttribute('VID_PL')));
      aXmlED118.setAttribute('MAINORG_KADM', aXmlZR.selectSingleNode('ZRST').getAttribute('KADMI_CODE'));
      aXmlED118.setAttribute('MAINORG_NAME', '');
      Kbk := QueryXml('Select Kl.* From Kadm_lines Kl Left Join kadm K on K.Id = Kl.master_id' +
        ' Where Kl.Budget_Id = ? and K.Code = ? order by Kl.Begin_Date desc', [aXmlED118.getAttribute('BUDGET_ID'),
        aXmlZR.selectSingleNode('ZRST').getAttribute('KADMI_CODE')]);
      Kbk := Kbk.ChildNodes.Item[0];
      if Kbk.ChildNodes.Length = 1 then
        aXmlED118.setAttribute('MAINORG_NAME', Kbk.ChildNodes.item[0].getAttribute('DESCRIPTION'))
      else begin
        for i := 0 to Kbk.ChildNodes.Length -1 do
        begin
          Kbk := Kbk.ChildNodes.item[i];
          if Kbk.getAttribute('END_DATE') = '' then
            aXmlED118.setAttribute('MAINORG_NAME', Kbk.getAttribute('DESCRIPTION'))
          else if (Work_Date >= XmlToDateTime(Kbk.getAttribute('BEGIN_DATE'))) and
            (Work_Date <= XmlToDateTime(Kbk.getAttribute('END_DATE'))) then
            aXmlED118.setAttribute('MAINORG_NAME', Kbk.getAttribute('DESCRIPTION'));
          Kbk := Kbk.parentNode;
        end;
        if aXmlED118.getAttribute('MAINORG_NAME') = '' then
          aXmlED118.setAttribute('MAINORG_NAME', Kbk.selectSingleNode('ROW').getAttribute('DESCRIPTION'));
      end;
      // определяем плательщика
      WriteLog('Заполнение данных плательщика', True);
      aXmlED118.setAttribute('PAY_TAXCODE', aXmlIK.getAttribute('INN_UBP'));
      aXmlED118.setAttribute('PAY_KPP', aXmlIK.getAttribute('KPP_UBP'));
      aXmlED118.setAttribute('PAY_NAME', aXmlIK.getAttribute('NAME_UBP_PUBP'));
      WriteLog('Поиск референса плательщика по ИНН и КПП', True);
      aXmlED118.setAttribute('PAY_ID', '');
      //поиск референса плательщика
      if Trim(aXmlIK.getAttribute('INN_UBP')) <> '' then
      begin
        XmlOrg := GetOrgByTaxKpp(aXmlIK.getAttribute('INN_UBP'),
          aXmlIK.getAttribute('KPP_UBP'), '', '', False, aXmlED118);
        if not ((XmlOrg.documentElement.childNodes.Length = 1)
          and HasOrgRole(XmlOrg.documentElement.childNodes.Item[0].getAttribute('ID'), '10')
          and IsActual(XmlOrg.documentElement.childNodes.Item[0].getAttribute('ID'),
            aXmlED118.getAttribute('BUDGET_ID'))) then
        begin
          WriteLog('Не удалось найти референс плательщика по ИНН и КПП. Поиск' +
            ' референса плательщика по ИНН, КПП и коду организации');
          //Exchange#2093
          XmlOrg := GetOrgByTaxKppBudgIdCode(aXmlIK.getAttribute('INN_UBP'),
            aXmlIK.getAttribute('KPP_UBP'), aXmlED118.getAttribute('BUDGET_ID'),
            aXmlIK.getAttribute('KOD_UBP_PUBP'), '10');
        end;
        if XmlOrg.documentElement.childNodes.Length = 1 then
        begin
          XmlOrg := XmlOrg.documentElement.childNodes.Item[0];
          aXmlED118.setAttribute('PAY_ID', XmlOrg.getAttribute('ID'));
          WriteLog('Найден плательщик с референсом: ' + XmlOrg.getAttribute('ID'));
          // определяем счет для плательщика
          if aXmlIK.getAttribute('LS_UBP') = '' then
          begin
            WriteInfo('Не создан - не определен счет плательщика');
            Result := False;
            Exit;
          end
          else begin
            // Exchange #2040
            XmlAcc := GetAccAllRekByOrgIdAccNum(aXmlED118.getAttribute('PAY_ID'),
              aXmlIK.getAttribute('LS_UBP'), '7', '1', True);
            if XmlAcc.documentElement.childNodes.Length = 1 then
            begin
              XmlAcc := XmlAcc.documentElement.childNodes.Item[0];
              aXmlED118.setAttribute('PAY_ACC_ID', XmlAcc.getAttribute('ID'));
              //Заполняем данные по счету плательщика
              aXmlED118.setAttribute('PAY_ACCOUNT', aXmlIK.getAttribute('LS_UBP'));
              aXmlED118.setAttribute('PAY_OFK_NAME', XmlAcc.getAttribute('OFK_DESCRIPTION'));
              aXmlED118.setAttribute('PAY_UFK_NAME', XmlAcc.getAttribute('UFK_DESCRIPTION'));
              aXmlED118.setAttribute('PAY_UFK_ACCOUNT', XmlAcc.getAttribute('INCUFK_ACCOUNT_NUMBER'));
              aXmlED118.setAttribute('PAY_UFK_ACC_ID', XmlAcc.getAttribute('INCUFK_ACC_ID'));
              aXmlED118.setAttribute('PAY_BIC', XmlAcc.getAttribute('INCBIC'));
              aXmlED118.setAttribute('PAY_B_NAME', XmlAcc.getAttribute('INCB_NAME'));
              aXmlED118.setAttribute('PAY_CORACCOUNT', XmlAcc.getAttribute('INCCORACCOUNT'));
            end
            else begin
              WriteInfo('Не создан - не определен референс счета плательщика');
              Result := False;
              Exit;
            end;
          end;
        end
        else begin
          WriteInfo('Не создан - не определен референс плательщика');
          Result := False;
          Exit;
        end;
      end
      else begin
        WriteInfo('Не создан - не определен референс плательщика');
        Result := False;
        Exit;
      end;
      //блок получатель
      WriteLog('Заполнение данных получателя', True);
      aXmlED118.setAttribute('REC_TAXCODE', aXmlZR.getAttribute('INN_RCP'));
      aXmlED118.setAttribute('REC_KPP', aXmlZR.getAttribute('KPP_RCP'));
      aXmlED118.setAttribute('REC_NAME', aXmlZR.getAttribute('NAME_RCP'));
      WriteLog('Поиск референса получателя по ИНН и КПП', True);
      aXmlED118.setAttribute('REC_ID', '');
      if ((IsSysparamOn('org.require_taxcode') and (aXmlED118.getAttribute('REC_TAXCODE') = ''))
        or (IsSysparamOn('org.require_kpp') and (aXmlED118.getAttribute('REC_KPP') = ''))) then
      begin
        WriteInfo('Не создан - не заполнены ИНН или КПП контрагента');
        Result := False;
        Exit;
      end
      else begin
        if aXmlED118.getAttribute('REC_TAXCODE') <> '' then
        begin
          XmlOrg := GetOrgByTaxKpp(aXmlZR.getAttribute('INN_RCP'),
            aXmlZR.getAttribute('KPP_RCP'), '', '', False, aXmlED118);
          if (XmlOrg.documentElement.childNodes.Length = 1) and
            IsActual(XmlOrg.documentElement.childNodes.Item[0].getAttribute('ID'),
              aXmlED118.getAttribute('BUDGET_ID')) then
          begin
            XmlOrg := XmlOrg.documentElement.childNodes.Item[0];
            aXmlED118.setAttribute('REC_ID', XmlOrg.getAttribute('ID'));
            WriteLog('Найден получатель с референсом: ' + XmlOrg.getAttribute('ID'));
          end
          else
            WriteLog('Референс получателя не опеределен', True);
        end
        else begin
          WriteLog('Референс получателя не опеределен', True);
          if (not IsSysparamOn('org.permit_empty_taxcode')) then
          begin
            WriteInfo('Не создан - не заполнен ИНН контрагента и настройка "Позволять ' +
              'указывать в ЭД организацию-контрагент не из справочника без ИНН" выключена');
            Result := False;
            Exit;
          end;
        end;
      end;
      // заполняем поля по счету блока получатель
      if aXmlZR.getAttribute('LS_UBP_RCP') <> '' then
      begin
        aXmlED118.setAttribute('REC_ACCOUNT', aXmlZR.getAttribute('LS_UBP_RCP'));
        if aXmlED118.getAttribute('REC_ID') <> '' then
        begin
          WriteLog('Поиск референса счета получателя', True);
          // Exchange #2040
          XmlAcc := GetAccAllRekByOrgIdAccNum(aXmlED118.getAttribute('REC_ID'),
            aXmlED118.getAttribute('REC_ACCOUNT'), '7, 8, 9', '', True);
          if XmlAcc.documentElement.childNodes.Length = 1 then
          begin
            XmlAcc := XmlAcc.documentElement.childNodes.Item[0];
            aXmlED118.setAttribute('REC_ACC_ID', XmlAcc.getAttribute('ID'));
            aXmlED118.setAttribute('REC_OFK_NAME', XmlAcc.getAttribute('OFK_DESCRIPTION'));
            aXmlED118.setAttribute('REC_UFK_NAME', XmlAcc.getAttribute('UFK_DESCRIPTION'));
            if (GetAccType(XmlAcc.getAttribute('ID')) = '9') or
              ((aXmlZR.getAttribute('BS_RCP') <> '') and (aXmlZR.getAttribute('BS_RCP') =
              XmlAcc.getAttribute('UFK_ACCOUNT_NUMBER'))) then
            begin
              aXmlED118.setAttribute('REC_UFK_ACCOUNT', XmlAcc.getAttribute('UFK_ACCOUNT_NUMBER'));
              aXmlED118.setAttribute('REC_UFK_ACC_ID', XmlAcc.getAttribute('UFK_ACC_ID'));
            end
            else begin
              aXmlED118.setAttribute('REC_UFK_ACCOUNT', XmlAcc.getAttribute('INCUFK_ACCOUNT_NUMBER'));
              aXmlED118.setAttribute('REC_UFK_ACC_ID', XmlAcc.getAttribute('INCUFK_ACC_ID'));
            end;
            WriteLog('Найден счет получателя с референсом: ' + XmlAcc.getAttribute('ID'));
          end
          else
            WriteLog('Референс счета получателя не опеределен', True);
        end;
      end
      else begin
        aXmlED118.setAttribute('REC_ACCOUNT', aXmlZR.getAttribute('BS_RCP'));
        if aXmlED118.getAttribute('REC_ID') <> '' then
        begin
          WriteLog('Поиск референса счета получателя', True);
          XmlAcc := QueryXml(sqlAccByOrgId + ' and Account_Number = ? and OrgAccType_Id in (2, 3)',
            [aXmlED118.getAttribute('REC_ID'), aXmlED118.getAttribute('REC_ACCOUNT')]);
          if XmlAcc.documentElement.childNodes.Length = 1 then
          begin
            XmlAcc := XmlAcc.documentElement.childNodes.Item[0];
            aXmlED118.setAttribute('REC_ACC_ID', XmlAcc.getAttribute('ID'));
            WriteLog('Найден счет получателя с референсом: ' + XmlAcc.getAttribute('ID'));
          end
          else
            WriteLog('Референс счета получателя не опеределен', True);
        end;
      end;
      aXmlED118.setAttribute('REC_BIC', aXmlZR.getAttribute('BIC_RCP'));
      aXmlED118.setAttribute('REC_B_NAME', aXmlZR.getAttribute('NAME_BIC_RCP'));
      aXmlED118.setAttribute('REC_CORACCOUNT', aXmlZR.getAttribute('KS_BIC_RCP'));
      aXmlED118.setAttribute('DESCRIPTION', aXmlZR.getAttribute('PURPOSE'));

      // exchange #2616 - ТФФ12
      // поле aXmlIK.ZR.SUM_V_NDS удалено, поэтому тут проверяем поле с проверкой
      // его отсутствия
      if VarToStr( aXmlZR.getAttribute('SUM_V_NDS')) = ''
        then aXmlED118.setAttribute('VAT', '0.00')
        else aXmlED118.setAttribute('VAT', aXmlZR.getAttribute('SUM_V_NDS'));

      //заполняем идентификатор
      // exchange #3062 - унификация кода
      if NOT FillDepartamentalinfo_ImpIK_ZR( aXmlED118, aXmlZR)
        then EXIT;
        (*
      aXmlED118.setAttribute('AUTHOR_ID', Get_Author_Id(aXmlZR.getAttribute('PAYSTATUS')));
      //Exchange #771, если KDOH не пусто, а AUTHOR_ID пусто, то AUTHOR_ID заполняем нулем.
      if (aXmlED118.getAttribute('AUTHOR_ID') = '') and (aXmlZR.getAttribute('KDOH') <> '') then
        aXmlED118.setAttribute('AUTHOR_ID', 0);
      if aXmlED118.getAttribute('AUTHOR_ID') <> '' then
      begin
        // exchange #2791 - проверка КБК в ид.платежа
        // если проверка =false - не создаем эд.
        // при этом ошибку указываем в журнале info
        if NOT DoCheck_2791_LoadKBK0_PI_BUDGET_CODE( aXmlZR.getAttribute('KDOH'))
          then begin
            Result := False;
            EXIT;
          end;

        // exchange #3062 - удален косгу
        // принимается всегда доходы
        aXmlED118.setAttribute('PI_ANAL_KIND', '1');
        {
        aXmlED118.setAttribute('PI_ANAL_KIND', GetPi_Anal_Kind(
          Copy(aXmlZR.getAttribute('KDOH'), 18, 3)));}
        aXmlED118.setAttribute('PI_BUDGET_CODE', aXmlZR.getAttribute('KDOH'));
        aXmlED118.setAttribute('PAY_OKATO', aXmlZR.getAttribute('OKATO'));
        aXmlED118.setAttribute('GROUND_ID', GetGrnd_Ground_Id(aXmlZR.getAttribute('OSN_PL')));
        aXmlED118.setAttribute('TAXPERIOD', aXmlZR.getAttribute('NAL_PER'));
        aXmlED118.setAttribute('GRND_DOC_NUMBER', aXmlZR.getAttribute('NOM_DOK'));
        aXmlED118.setAttribute('GRND_DOC_DATE', aXmlZR.getAttribute('DATE_DOK'));
        aXmlED118.setAttribute('PAYTYPE_ID', GetGrnd_PayType_Id(aXmlZR.getAttribute('TYPE_PL')));
      end
      else begin
        aXmlED118.setAttribute('PI_BUDGET_CODE', '');
        aXmlED118.setAttribute('PAY_OKATO', '');
        aXmlED118.setAttribute('TAXPERIOD', '');
        aXmlED118.setAttribute('GRND_DOC_NUMBER', '');
        aXmlED118.setAttribute('GRND_DOC_DATE', '');
      end;
      *)
      //заполняем контрагента
      aXmlED118.setAttribute('COUNTERAGENT_ID', aXmlED118.getAttribute('REC_ID'));
      //заполняем закладку "ответственные лица и чек"
      // exchange #2549
      // выборка ответственных лиц с флагом актуальности
      GetRespersonEx(aXmlED118.getAttribute('PAY_ID'),'-2' , Fio, Dolzhnost);
      aXmlED118.setAttribute('BOSS_FIO', Fio);
      aXmlED118.setAttribute('BOSS_POST', Dolzhnost);
      // exchange #2549
      // выборка ответственных лиц с флагом актуальности
      GetRespersonEx(aXmlED118.getAttribute('PAY_ID'),'-3' , Fio, Dolzhnost);
      aXmlED118.setAttribute('EXECUTOR_FIO', Fio);
      aXmlED118.setAttribute('EXECUTOR_POST', Dolzhnost);
      aXmlED118.setAttribute('SIGN_DATE', aXmlED118.getAttribute('DOC_DATE'));
      aXmlED118 := aXmlED118.appendChild(aXmlED118.ownerDocument.createElement('GROUND_DOC'));
      for i := 0 to aXmlZR.ChildNodes.Length - 1 do
      begin
        aXmlZR := aXmlZR.ChildNodes.Item[i];
        if aXmlZR.NodeName = 'ZROSN' then
        begin
          aXmlED118 := aXmlED118.appendChild(aXmlED118.ownerDocument.createElement('GROUND_DOC'));
          aXmlED118.setAttribute('KIND', aXmlZR.getAttribute('VID_OSN'));
          aXmlED118.setAttribute('DOC_NUMBER', aXmlZR.getAttribute('NOM_OSN'));
          aXmlED118.setAttribute('DOC_DATE', aXmlZR.getAttribute('DATE_OSN'));
          if aXmlED118.getAttribute('DOC_DATE') <> '' then
            aXmlED118.setAttribute('DOC_DATE',
              DateTimeToXml(StrToDate(aXmlED118.getAttribute('DOC_DATE'))));
          aXmlED118.setAttribute('DESCRIPTION', aXmlZR.getAttribute('OSN'));
          aXmlED118 := aXmlED118.parentNode;
        end;
        aXmlZR := aXmlZR.parentNode;
      end;
      aXmlED118 := aXmlED118.ownerDocument.documentElement;
      aXmlED118 := aXmlED118.appendChild(aXmlED118.ownerDocument.createElement('LINES'));
      for i := 0 to aXmlZR.ChildNodes.Length - 1 do
      begin
        aXmlZR := aXmlZR.ChildNodes.Item[i];
        if aXmlZR.NodeName = 'ZRST' then
        begin
          aXmlED118 := aXmlED118.appendChild(aXmlED118.ownerDocument.createElement('LINE'));
          aXmlED118.setAttribute('QUEUE_KIND',aXmlED118.parentNode.parentNode.getAttribute('QUEUE_KIND'));
          aXmlED118.setAttribute('PAYKIND',aXmlED118.parentNode.parentNode.getAttribute('PAYKIND'));
          aXmlED118.setAttribute('COUNTERAGENT_ID', aXmlED118.parentNode.parentNode.getAttribute('COUNTERAGENT_ID'));
          aXmlED118.setAttribute('BOSS_FIO', aXmlED118.parentNode.parentNode.getAttribute('BOSS_FIO'));
          aXmlED118.setAttribute('BOSS_POST', aXmlED118.parentNode.parentNode.getAttribute('BOSS_POST'));
          aXmlED118.setAttribute('EXECUTOR_FIO', aXmlED118.parentNode.parentNode.getAttribute('EXECUTOR_FIO'));
          aXmlED118.setAttribute('EXECUTOR_POST', aXmlED118.parentNode.parentNode.getAttribute('EXECUTOR_POST'));
          //АЦК не проставляет ID счета УФК в однострочных доках
          aXmlED118.setAttribute('PAY_UFK_ACC_ID', aXmlED118.parentNode.parentNode.getAttribute('PAY_UFK_ACC_ID'));
          aXmlED118.setAttribute('SIGN_VOLUME', aXmlED118.parentNode.parentNode.getAttribute('SIGN_VOLUME'));
          if aXmlZR.parentNode.getAttribute('TYPE') = 2 then
            aXmlED118.setAttribute('AMOUNT', Format('%0.2f', [StrToCurrDef(aXmlZR.parentNode.getAttribute('SUM_V'), 0)]))
          else
            aXmlED118.setAttribute('AMOUNT', Format('%0.2f', [StrToCurrDef(aXmlZR.getAttribute('SUM_V_KBK'), 0)]));
          aXmlED118.parentNode.parentNode.setAttribute('AMOUNT',
            StrToCurrDef(aXmlED118.parentNode.parentNode.getAttribute('AMOUNT'), 0) +
            StrToCurrDef(aXmlED118.getAttribute('AMOUNT'), 0));
          aXmlED118.setAttribute('KADMI_CODE', aXmlZR.getAttribute('KADMI_CODE'));
          aXmlED118.setAttribute('KI_CODE', aXmlZR.getAttribute('KI_CODE'));
          // exchange #3062 - удален косгу
          // поле копируется при наличие
          CopyNodeAttributeEx( aXmlED118, 'KESI_CODE', aXmlZR, 'KESI_CODE');
    //        aXmlED118.setAttribute('KESI_CODE', aXmlZR.getAttribute('KESI_CODE'));
          aXmlED118.setAttribute('FSI_ID', aXmlZR.getAttribute('FSI_ID'));
          aXmlED118.setAttribute('NOTE', aXmlZR.getAttribute('NOTE_KBK'));
          aXmlED118 := aXmlED118.parentNode;
        end;
        aXmlZR := aXmlZR.parentNode;
      end;

      aXmlZR := aXmlZR.ownerDocument.documentElement;
      aXmlED118 := aXmlED118.ownerDocument;
      Result := True;

      except
        ExceptionProc( 'CreateDoc118');
    end;

end;

begin
end.
