// открытие счетов в ПАО "Банк Открытие"
// ОСР_01.08.2015

var CTabl;  // объект класса для работы таблицей  

int 
   idxOrder       = 0,
   idxCitizen     = 1,
   idxTN          = 2,
   idxF           = 3,
   idxI           = 4,
   idxO           = 5,
   idxPasport     = 6,
   idxPasp_ser    = 7,
   idxPasp_ser2   = 8,
   idxPasp_num    = 9,
   idxPasp_kem    = 10,
   idxPasp_date   = 11,
   idxPasp_kod    = 12,
   idxDateB       = 13,
   idxOblastR     = 14,
   idxRaionR      = 15,
   idxGorodR      = 16,
   idxMesto_r     = 17,
   idxEmboss_f    = 18,
   idxEmboss_i    = 19,
   idxEmboss      = 20,
   idxAdressR     = 21,
   idxAdressRN    = 22,
   idxAdressF     = 23,
   idxAdressFN    = 24,
   idxPhone1      = 25,
   idxPhone2      = 26,
   idxPhone3      = 27,
   idxMail        = 28,
   idxINN         = 29,
   idxSecret      = 30,
   idxTarif       = 31,
   idxCard        = 32,
   idxOrg         = 33,
   idxOrg_address = 34,
   idxDolgn       = 35,
   idxDate_rb     = 36,
   idxSrDoxod     = 37,
   idxSposob_pol  = 38,
   idxGorod_vyd   = 39,
   idxDop_of      = 40,
   idxOf_vyd      = 41,
   
   nFld=42;  // число элементов в массиве Fld

double tmp = 0.0,
       eps = 0.001;

int    Fld[nFld];

TransfOpen(AdrCTabl, AdrCListTabl, RcrInList)
{
  var CFile=CreateObject("CurPrnFile"); // объект класса для работы с текущим файлом печати
  CFile.SetFlagBrowse(0);               // запрещаем просмотр
  CFile.SetFlag_Print(0);

  CTabl=CreateObject("CurPrnTbl");  // объект класса для работы с текущей таблицей
  CTabl.Initial(AdrCTabl); 
  
  int cr=CTabl.Count_Rcr();         // число рабочих записей в таблице   
  if ( !cr || (cr==1 && CTabl.Check_Empty_Rcr(0)) ) return false;
  //CTabl.Sort_Field(Fld[idxF]);

  char Dir[128];                     // строка для текущей директории
  GetCurrentDirectory(128,Dir);      // получаем текущую директорию (это корень каталога ZPL из которого запустили АМБу)
  string nm="open_reestr.xlt";                        // имя Excel'евского файла
  var WorkDir = Dir + "\\"+NameCommonDir()+"\\";         
  // Имя файла из панели
      char NameStr[256];
      var OptionsT = CreateObject("TransferOptions");
      stccpy(NameStr,OptionsT.GetNameFile(),200);
      FreeSpaceString(NameStr,3," ");
	  //AmbaMessageBox(to_string(NameStr),"1",0,0);
    
  tPrepereOfficeForWork(); // определяем работать на Excel или на Calc (определяем какой из офисов (MS Office или OpenOffice) установлен и какой предпочтительнее)
  tCreateXlsObjects(WorkDir+nm,"Список сотрудников на открытие счетов"); // создание основных объектов
    
  tGetWshByIndex(1); // получаем ссылку на лист (worksheet)
  tWshSelect();

  var CMsg = 0;    // Процент выполненной работы

  int bTime = false;   // false-показывать процент,
                       // true-показывать оставшееся время

  CMsg=CreateObject("ProgressBar");
  CMsg.Initial(0,100,1);
  CMsg.SetShowTime(static_cast_to_int(bTime));


  if ( !FillNumFld() ) return false; //определяем необходимые нам номера полей

  int len =256;
  char Org[len], Inn[len];
  char str[256], str1[256], str2[256],str3[256], nnn[256], sss[256];
  double sum, ItogSum=0; 

  bool flag=true ;
  bool fl  =true ;
  int tn,j=1;

  try
  {
   int ShStr=4; int num;
   char str1[256]; char InoFIO[256];

   /*var mapKey = CreateObject("MapString");
   mapKey.Clear();
   RusToTransInit(mapKey); // заполняем таблицу
   InoFIO = "";*/

   // цикл по записям таблицы
   for (int zap=0; zap<cr; zap++)
   {
      // progress bar - чтобы видеть процент выполненной работы до того как появится результат
      if ( CMsg.Msg_Proc(" Подождите немного. Идет подготовка к печати. ",100.*zap/cr)==ESC )
      {
         return 0;
      }

      // Гражданство
      str=CTabl.Text(Fld[idxCitizen],zap); FreeSpaceString(str,3,"");
      sprintf(nnn,"A%d",ShStr); OemToChar(str,str);
      tWriteStringToCell(nnn,str);
	  
	  // Фамилия
      str=CTabl.Text(Fld[idxF],zap); FreeSpaceString(str,3,"");
      sprintf(nnn,"B%d",ShStr); OemToChar(str,str);
      tWriteStringToCell(nnn,str);
	  
	  // Имя
      str=CTabl.Text(Fld[idxI],zap); FreeSpaceString(str,3,"");
      sprintf(nnn,"C%d",ShStr); OemToChar(str,str);
      tWriteStringToCell(nnn,str);
	  
	  // Отчество
      str=CTabl.Text(Fld[idxO],zap); FreeSpaceString(str,3,"");
      sprintf(nnn,"D%d",ShStr); OemToChar(str,str);
      tWriteStringToCell(nnn,str);
	  
	  // Серия паспорта
      str=CTabl.Text(Fld[idxPasp_ser],zap); FreeSpaceString(str,3,"");
      sprintf(nnn,"E%d",ShStr); OemToChar(str,str);
      tWriteStringToCell(nnn,str);
	  
	  // Номер паспорта
      str=CTabl.Text(Fld[idxPasp_num],zap); FreeSpaceString(str,3,"");
      sprintf(nnn,"F%d",ShStr); OemToChar(str,str);
      tWriteStringToCell(nnn,str);
	  
	  // Кем выдан паспорт
      str=CTabl.Text(Fld[idxPasp_kem],zap); FreeSpaceString(str,3,"");
      sprintf(nnn,"G%d",ShStr); OemToChar(str,str);
      tWriteStringToCell(nnn,str);
	  
	  // Когда выдан паспорт
      str=CTabl.Text(Fld[idxPasp_date],zap); FreeSpaceString(str,3,"");
      sprintf(nnn,"H%d",ShStr); OemToChar(str,str);
      tWriteStringToCell(nnn,str);
	  
	  // Код подразделения паспорт
      str=CTabl.Text(Fld[idxPasp_kod],zap); FreeSpaceString(str,3,"");
      sprintf(nnn,"J%d",ShStr); OemToChar(str,str);
      tWriteStringToCell(nnn,str);
	  
	  // Дата рождения
      str=CTabl.Text(Fld[idxDateB],zap); FreeSpaceString(str,3,"");
      sprintf(nnn,"T%d",ShStr); OemToChar(str,str);
      tWriteStringToCell(nnn,str);
	  
	  // Место рождения
      str=CTabl.Text(Fld[idxMesto_r],zap); FreeSpaceString(str,3,"");
      sprintf(nnn,"U%d",ShStr); OemToChar(str,str);
      tWriteStringToCell(nnn,str);
	  
	  // Имя и фимилия эмбосс
      str=CTabl.Text(Fld[idxEmboss],zap); FreeSpaceString(str,3,"");
      sprintf(nnn,"V%d",ShStr); OemToChar(str,str);
      tWriteStringToCell(nnn,str);
	  
	  // Адрес регистрации (норма)
      str=CTabl.Text(Fld[idxAdressRN],zap); FreeSpaceString(str,3,"");
      sprintf(nnn,"W%d",ShStr); OemToChar(str,str);
      tWriteStringToCell(nnn,str);
	  
	  // Адрес фактический (норма)
      str=CTabl.Text(Fld[idxAdressFN],zap); FreeSpaceString(str,3,"");
      sprintf(nnn,"X%d",ShStr); OemToChar(str,str);
      tWriteStringToCell(nnn,str);
	  
	  // Телефон по адресу регистрации
      str=CTabl.Text(Fld[idxPhone1],zap); FreeSpaceString(str,3,"");
      sprintf(nnn,"Y%d",ShStr); OemToChar(str,str);
      tWriteStringToCell(nnn,str);
	  
	  // Рабочий телефон
      str=CTabl.Text(Fld[idxPhone2],zap); FreeSpaceString(str,3,"");
      sprintf(nnn,"Z%d",ShStr); OemToChar(str,str);
      tWriteStringToCell(nnn,str);
	  
	  // Мобильный телефон
      str=CTabl.Text(Fld[idxPhone3],zap); FreeSpaceString(str,3,"");
      sprintf(nnn,"AA%d",ShStr); OemToChar(str,str);
      tWriteStringToCell(nnn,str);
	  
	  // E-mail
      str=CTabl.Text(Fld[idxMail],zap); FreeSpaceString(str,3,"");
      sprintf(nnn,"AB%d",ShStr); OemToChar(str,str);
      tWriteStringToCell(nnn,str);
	  
	  // ИНН
      str=CTabl.Text(Fld[idxINN],zap); FreeSpaceString(str,3,"");
      sprintf(nnn,"AC%d",ShStr); OemToChar(str,str);
      tWriteStringToCell(nnn,str);
	  
	  // Кодовое слово
      str=CTabl.Text(Fld[idxSecret],zap); FreeSpaceString(str,3,"");
      sprintf(nnn,"AD%d",ShStr); OemToChar(str,str);
      tWriteStringToCell(nnn,str);
	  
	  // Тариф
      str=CTabl.Text(Fld[idxTarif],zap); FreeSpaceString(str,3,"");
      sprintf(nnn,"AE%d",ShStr); OemToChar(str,str);
      tWriteStringToCell(nnn,str);
	  
	  // Тип карты
      str=CTabl.Text(Fld[idxCard],zap); FreeSpaceString(str,3,"");
      sprintf(nnn,"AF%d",ShStr); OemToChar(str,str);
      tWriteStringToCell(nnn,str);
	  
	  // Организация
      str=CTabl.Text(Fld[idxOrg],zap); FreeSpaceString(str,3,"");
      sprintf(nnn,"AG%d",ShStr); OemToChar(str,str);
      tWriteStringToCell(nnn,str);
	  
	  // Организация адрес
      str=CTabl.Text(Fld[idxOrg_address],zap); FreeSpaceString(str,3,"");
      sprintf(nnn,"AH%d",ShStr); OemToChar(str,str);
      tWriteStringToCell(nnn,str);
	  
	  // Должность
      str=CTabl.Text(Fld[idxDolgn],zap); FreeSpaceString(str,3,"");
      sprintf(nnn,"AI%d",ShStr); OemToChar(str,str);
      tWriteStringToCell(nnn,str);
	  
	  // Средний доход
      str=CTabl.Text(Fld[idxSrDoxod],zap); FreeSpaceString(str,3,"");
      sprintf(nnn,"AJ%d",ShStr); OemToChar(str,str);
      tWriteStringToCell(nnn,str);
	  
	  // Дата начала работы в организации
      str=CTabl.Text(Fld[idxDate_rb],zap); FreeSpaceString(str,3,"");
      sprintf(nnn,"AK%d",ShStr); OemToChar(str,str);
      tWriteStringToCell(nnn,str);
	  
	  // Способ получения карты
      str=CTabl.Text(Fld[idxSposob_pol],zap); FreeSpaceString(str,3,"");
      sprintf(nnn,"AL%d",ShStr); OemToChar(str,str);
      tWriteStringToCell(nnn,str);
	  
	  // Город
      str=CTabl.Text(Fld[idxGorod_vyd],zap); FreeSpaceString(str,3,"");
      sprintf(nnn,"AM%d",ShStr); OemToChar(str,str);
      tWriteStringToCell(nnn,str);
	  
	  // Доп.офис
      str=CTabl.Text(Fld[idxDop_of],zap); FreeSpaceString(str,3,"");
      sprintf(nnn,"AN%d",ShStr); OemToChar(str,str);
      tWriteStringToCell(nnn,str);
	  
	  // Офис выдачи
      str=CTabl.Text(Fld[idxOf_vyd],zap); FreeSpaceString(str,3,"");
      sprintf(nnn,"AO%d",ShStr); OemToChar(str,str);
      tWriteStringToCell(nnn,str);
	  
	  	  
	  ShStr++;
      tInsertRows(ShStr+1,1); tCopyRow(ShStr+1);       
   }

   tDeleteRows(ShStr,4);
  
   // чтобы не было выделенной строки после всех манипуляций с копированием
   // выделим отдельную ячейку.
   tWshCellSelect(1,1);       

   tGetWshByIndex(1); // получаем ссылку на лист (worksheet)
   tWshSelect();
   //tSaveXlsObjects(to_string(NameStr)); // и вот так вот жопно сохраняем   
  }

  //что Excel не остовался в памяти
  catch(object err)
  {
     SayError(err);
  }
  catch(...)
  {
     ;
  }

  tEndXlsWork(1); // делаем форму видимой 
  
  return 0;
}

// Функция перевода в эмбосс
var mapKey = CreateObject("MapString");
RusToTran(inputstr)
{
   char str[256];
   string s;
   for ( int i=0; i<strlen(inputstr) ;i++ )
   {
      s = SubStr(static_cast_to_string(inputstr),i,1);
      if (mapKey.IsExist(s))
      {
         str += mapKey.GetValue(s);
      }
   }
   return str;
}
//======================================================
// Инициализация функции RusToTransMB
RusToTransInit()
{
   mapKey=SysTransliterationInit(1);
   return 0;
}



FillNumFld()
//=============================================================================
// Находим поля в таблице
//=============================================================================
{
   Fld[idxOrder]       = CTabl.Find_Name_Fld("Order");
   Fld[idxCitizen]     = CTabl.Find_Name_Fld("citizen");
   Fld[idxTN]          = CTabl.Find_Name_Fld("C_FIO");
   Fld[idxF]           = CTabl.Find_Name_Fld("FCf");
   Fld[idxI]           = CTabl.Find_Name_Fld("FCi");
   Fld[idxO]           = CTabl.Find_Name_Fld("FCo");
   Fld[idxPasport]     = CTabl.Find_Name_Fld("FCpasport");
   Fld[idxPasp_ser]    = CTabl.Find_Name_Fld("pasp_ser");
   Fld[idxPasp_ser2]   = CTabl.Find_Name_Fld("pasp_ser2");
   Fld[idxPasp_num]    = CTabl.Find_Name_Fld("pasp_num");
   Fld[idxPasp_kem]    = CTabl.Find_Name_Fld("pasp_kem");
   Fld[idxPasp_date]   = CTabl.Find_Name_Fld("pasp_date");
   Fld[idxPasp_kod]    = CTabl.Find_Name_Fld("pasp_kod");
   Fld[idxDateB]       = CTabl.Find_Name_Fld("FCdata_r");
   Fld[idxOblastR]     = CTabl.Find_Name_Fld("FCoblast_r");
   Fld[idxRaionR]      = CTabl.Find_Name_Fld("FCrajon_r");
   Fld[idxGorodR]      = CTabl.Find_Name_Fld("FCgorod_r");
   Fld[idxMesto_r]     = CTabl.Find_Name_Fld("mesto_r");
   Fld[idxEmboss_f]    = CTabl.Find_Name_Fld("FCf_trans");
   Fld[idxEmboss_i]    = CTabl.Find_Name_Fld("FCi_trans");
   Fld[idxEmboss]      = CTabl.Find_Name_Fld("emboss");
   Fld[idxAdressR]     = CTabl.Find_Name_Fld("FCadres");
   Fld[idxAdressRN]    = CTabl.Find_Name_Fld("FCadres1");
   Fld[idxAdressF]     = CTabl.Find_Name_Fld("FCadres_f");
   Fld[idxAdressFN]    = CTabl.Find_Name_Fld("FCadres_f2");
   Fld[idxPhone1]      = CTabl.Find_Name_Fld("FCphone");
   Fld[idxPhone2]      = CTabl.Find_Name_Fld("FCphone_W");
   Fld[idxPhone3]      = CTabl.Find_Name_Fld("FCphone_M");
   Fld[idxMail]        = CTabl.Find_Name_Fld("e_mail");
   Fld[idxINN]         = CTabl.Find_Name_Fld("FCinn_fl");
   Fld[idxSecret]      = CTabl.Find_Name_Fld("password");
   Fld[idxTarif]       = CTabl.Find_Name_Fld("tarif");
   Fld[idxCard]        = CTabl.Find_Name_Fld("vid_karty");
   Fld[idxOrg]         = CTabl.Find_Name_Fld("org");
   Fld[idxOrg_address] = CTabl.Find_Name_Fld("org_adress");
   Fld[idxDolgn]       = CTabl.Find_Name_Fld("FCdolgnost");
   Fld[idxDate_rb]     = CTabl.Find_Name_Fld("FCdata_rb");
   Fld[idxSrDoxod]     = CTabl.Find_Name_Fld("SrDoxod");
   Fld[idxSposob_pol]  = CTabl.Find_Name_Fld("Sposob_pol");
   Fld[idxGorod_vyd]   = CTabl.Find_Name_Fld("Gorod_vyd");
   Fld[idxDop_of]      = CTabl.Find_Name_Fld("Dop_of");
   Fld[idxOf_vyd]      = CTabl.Find_Name_Fld("Of_vyd");
      
  for ( int ii=0; ii<nFld; ii++ )
     if ( Fld[ii]==-1 )
     {
        AmbaMessageBox("Нет необходимых полей в таблице!","Ошибка!!!",MB_OK|MB_ICONERROR,0);
        return false;
     }
  return true;
}

DatWithNameMonth( &Dat )
//=============================================================================
// Дата с названием месяца (для подножия справок)
//=============================================================================
{
   char StrDat[21]; 
   R_DATA_PROPIS(Dat,StrDat,20,0);
   FreeSpaceString(StrDat,2," ");
   if ( !Str_Cmp(Dat," "," .\\/ ") ) Dat = "\"__\"_________________  20____ г.";
   else                              Dat=StrDat+" г.";
   return Dat;
}



// Прием номеров карт из Excel //
// НАСТРОЙКИ
// Номер столбца и строки в Excel с которых начинается прием:
int BegRow = 2; // Cтрока
int BegClm = 1; // Столбец

// Номер столбца таблицы с которого начинаем добавлять данные из Excel:
int BegFld = 1; 

// Заполнение ТН
int bTN = 0; // 0 - не заполнять ТН, иначе номер столбца таблицы для ТН
// Если ТН заполнять ( bTN!=0 ), необходимо проставить номера столбцов Excel:
int nF = 6; // Фамилия
int nI = 7; // Имя
int nO = 8; // Отчество
// Если ТН уже есть в столбце Excel:
int nTN = 0; //  номер столбца где содержиться ТН, 0-нет столбца с ТН
             //  если ТН нет - ищется по ФИО

// =========================================

ImportOpen( AdrCTabl,     // адрес передаваемой таблицы
             AdrCListTabl, // адрес списка таблиц
             RcrInList     // номер записи в списке таблиц
           )
{
   var CTabl=CreateObject("CurPrnTbl");
   CTabl.Initial(AdrCTabl);
   int cntRcr=CTabl.Count_Rcr(); // полное число записей   
   int cntFld=CTabl.Count_Fld(); // полное число записей   

   char str[255],dop[256];
   
   //OemToChar("Очистить таблицу?", str);
   //OemToChar("Контур-Зарплата", dop);
   if (IDYES==AmbaMessageBox("Очистить таблицу?","Контур-Зарплата. Прием карт ПАО Открытие.", MB_YESNO, 0))
      CTabl.Clear();

   char Dir[256];
   GetCurrentDirectory(255,Dir);
   var OptionsTR = CreateObject("TransferOptions");
   char NameFile[260];
   stccpy(NameFile,OptionsTR.GetNameFile(),256);
   FreeSpaceString(NameFile,2," ");
   fullpath(NameFile,NameFile,255);

   try
   {

   var xls=CreateObject("Excel.Application");  // создаем объект Excel.Application, т.е. запускаем Excel, если он установлен конечно
   var Workb=xls.Workbooks.Add(static_cast_to_string(NameFile));// открываем в Excel'е наш файл ls.xls

   var wsh = Workb.Worksheets.Item(1);       // создаем ссылку на на наш worksheet чтобы избежать впоследствии длинных записей
   wsh.Select();

   int LastRowNumber = wsh.Cells(1,1).SpecialCells(11).Row;
   int LastClmNumber = wsh.Cells(1,1).SpecialCells(11).Column;

    // Если указали не существующий № столбца для ТН, то не выводим ТН
   if ( bTN-1>cntFld ) bTN = 0;
    // Если заполнение ТН нет, то столбец с ТН не нужен
   if ( !bTN ) nTN = 0;
    // Если указали не существующий № столбца для ТН, то не выводим ТН
   if ( nTN>LastClmNumber ) nTN = 0;


   if( BegFld ) BegFld--; // Номера столбцов в таблице с нуля

   char s[256],F[256],I[256],O[256];
   int TN=0;
   bool fTN = false;

   for ( int row1=BegRow,row2=0; row1<=LastRowNumber;  row1++,row2++ )
   {
      for ( int clm1=BegClm,clm2=BegFld; clm1<=LastClmNumber && clm2<cntFld; clm1++,clm2++ )
      {
         if ( bTN && bTN-1==clm2 ) clm2++; // оставляем столбец для ТН если нужно
         if ( nTN && nTN==clm1 ) clm1++; // не считываем ТН (чтобы не выводить 2 раза)

         str = ReadToCell2(wsh,row1,clm1);

         // заполняем таблицу полученными из Excel данными
         if ( str!="void" && (-1!=CTabl.Add_Rcr(row2,clm2)) )
         {
            CharToOem(str,str);
            CTabl.SText(clm2,row2, static_cast_to_string(str));
         }
      }

      // Если есть столбец с ТН
      if ( bTN && nTN )
      {
         str = ReadToCell2(wsh,row1,nTN);
         if ( str!="void" && atoi(str)!=0 ) 
         {
            fTN = true;
            if ( -1!=CTabl.Add_Rcr(row2,bTN-1) )
               CTabl.SText(bTN-1,row2, static_cast_to_string(str));
         }
      }

      // Поиск ТН, в случае если ТН в Excel нет, либо в столбце для ТН пусто
      if ( bTN && !fTN )
      {
         F = ReadToCell2(wsh,row1,nF);
         I = ReadToCell2(wsh,row1,nI);
         O = ReadToCell2(wsh,row1,nO);

         sprintf(s,"%s %s %s",F,I,O);
         CharToOem(s, s);
         TN=TNfromFIO(s, 1);
         if (!TN) 
         {
            //OemToChar("Не удалось найти ТН для ", str);
            //OemToChar("Внимание!", dop);
            AmbaMessageBox("Не удалось найти ТН для "+s,"Внимание!", 0, 0);
         }
         else
         if ( -1!=CTabl.Add_Rcr(row2,bTN-1) )
            CTabl.SText(bTN-1,row2, static_cast_to_string(TN));    
      }
   }

   }
   catch(object err)
   {
      SayError(err);
      return 1;
   }
   catch(...)
   {
      ;
   }
   CTabl.Del_Empty_Rcr();
   CTabl.Rewrite();
   return 0;

}

ReadToCell(&WSheet,&Cell)
// WSheet - ссылка на worksheet
// Cell - имя ячейки
{
  string dop = static_cast_to_string(WSheet.Range(static_cast_to_string(Cell)).Value); 
  FreeSpaceString(dop,2," ");
  return dop;
 
}

ReadToCell2(&WSheet,&i,&j)
// WSheet - ссылка на worksheet
// Cell - имя ячейки
{
  string dop = static_cast_to_string(WSheet.Cells(i,j).Value); 
  FreeSpaceString(dop,2," ");
  return dop;
}
