// Передача сумм в Банк "ОТКРЫТИЕ"
// ОСР_22.09.2014

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

int idxOrder     = 0,  // №№
    idxF         = 1,  // Ф
    idxI         = 2,  // И
    idxO         = 3,  // О
    idxNSh       = 4,  // номер счета
    idxSum       = 5,  // сумма
    idxRUR       = 6,  // Валюта
	idxDog       = 7,  // номер договора
    idxDate      = 8,  // дата списка  
    nFld=9;  // число элементов в массиве Fld
int    Fld[nFld];
//======================================================
// ПЕЧАТНЫЕ ФОРМЫ
PrintOtkrytie()
{
  var CFile=CreateObject("CurPrnFile"); // объект класса для работы с текущим файлом печати
  CFile.SetFlagBrowse(0);               // запрещаем просмотр
  CFile.SetFlag_Print(0);

  CTabl=CreateObject("CurPrnTbl");  // объект класса для работы с текущей таблицей
  int cr=CTabl.Count_Rcr();         // число рабочих записей в таблице   

  var xls=CreateObject("Excel.Application");  // создаем объект Excel.Application, т.е. запускаем Excel, если он установлен конечно
  char Dir[128];                              // строка для текущей директории
  GetCurrentDirectory(128,Dir);               // получаем текущую директорию (это корень каталога ZPL из которого запустили АМБу)
  string nm="otkrytie.xlt";                        // имя Excel'евского файла
  var WorkDir = Dir + "\\"+NameCommonDir()+"\\";         
  xls.Caption=OemToAnsi("Список на зачисление денежных средств");// заголовок (в windows кодировке)
  var Workb=xls.Workbooks.Add(WorkDir+nm);    // открываем в Excel'е наш файл ls.xls

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

  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; //определяем необходимые нам номера полей

  double sum, ItogSum=0; 

   char dog[256], date_z[256], Org[256], Ruk[256], RukDoldjn[256], GlBuh[256], GlBuhDoljn[256];
   dog=CTabl.TextS("Dog",0);
   date_z=CTabl.TextS("Date",0);
    date_z = datatek; // Пусть по-умолчанию юудет текущая дата
   
   if (ESC==Panel_Zapros(" Введите дополнительные данные ","",
                    "  Номер реестра",dog, 10,
					"  Дата реестра", date_z,10) 
      ) return ESC;
   CTabl.STextS("Dog",0, static_cast_to_string(dog));
   CTabl.STextS("Date",0, static_cast_to_string(date_z));
   CTabl.Rewrite();
   // Заполняем наименование организации
     GetEnterpriseVar("ИМЯП", Org,255);  // Наименование предприятия или отделения иностранной организации
     FreeSpaceString(Org,3,""); OemToChar(Org,Org);
     WriteToCell(wsh,"A2",Org);           // пишем в ячейку название организации
   // Заполняем подножие списка Должности и ФИО руководителей
     GetEnterpriseVar("ДОЛЖ", RukDoldjn,255);  // Должность руководителя
     FreeSpaceString(RukDoldjn,3,""); OemToChar(RukDoldjn,RukDoldjn);
	 GetEnterpriseVar("РУКП", Ruk,255);  // ФИО руководителя
     FreeSpaceString(Ruk,3,""); OemToChar(Ruk,Ruk);
	 GetEnterpriseVar("ДОЛЖБУХ", GlBuhDoljn,255);  // Должность главбуха
     FreeSpaceString(GlBuhDoljn,3,""); OemToChar(GlBuhDoljn,GlBuhDoljn);
	 GetEnterpriseVar("ГЛБУХ", GlBuh,255);  // ФИО главбуха
     FreeSpaceString(GlBuh,3,""); OemToChar(GlBuh,GlBuh);
	 
   // Работаем с датами
     // дата зачисления
	    var d1  = CreateObject("KDate");     //создаем объекта класса  KDate  
            d1.SetDate(static_cast_to_string(date_z));
    FreeSpaceString(dog,3,""); FreeSpaceString(date_z,3,"");
    // Заполняем месяц и дату зачисления
	  char reestr[256];
	  sprintf(reestr,"Реестр № %s от %s",dog,date_z); OemToChar(reestr,reestr);
	  FreeSpaceString(reestr,3,"");
      WriteToCell(wsh,"A3",reestr);
   
  int ShStr=5; int j=1;
  char nnn[256], str[256], str2[256], str3[256], dog_num[256];
  try
  {
  // цикл по записям таблицы
  for (int zap=0; zap<cr; zap++)
  {
    // progress bar - чтобы видеть процент выполненной работы до того как появится результат
    if ( CMsg.Msg_Proc(" Подождите немного. Идет подготовка к печати. ",100.*zap/cr)==ESC )
    {
      return 0;
    }
    // №
	str=CTabl.Text(Fld[idxOrder],zap);
    sprintf(nnn,"A%d",ShStr);
    WriteToCell(wsh,nnn,j);  

    // ФИО
    str=CTabl.Text(Fld[idxF],zap);
    FreeSpaceString(str,3,""); OemToChar(str,str);
	str2=CTabl.Text(Fld[idxI],zap);
    FreeSpaceString(str2,3,""); OemToChar(str2,str2);
    str3=CTabl.Text(Fld[idxO],zap);
    FreeSpaceString(str3,3,""); OemToChar(str3,str3);
    sprintf(nnn,"B%d",ShStr);
    WriteToCell(wsh,nnn,str);  
	sprintf(nnn,"C%d",ShStr);
    WriteToCell(wsh,nnn,str2);
    sprintf(nnn,"D%d",ShStr);
    WriteToCell(wsh,nnn,str3);  	

    // № счета
    str=CTabl.Text(Fld[idxNSh],zap);
	FreeSpaceString(UpperString(str),3,""); OemToChar(str,str);
	sprintf(nnn,"E%d",ShStr);
    WriteToCell(wsh,nnn,str);

    // Сумма
    sum = atof(CTabl.Text(Fld[idxSum],zap));
    sprintf(nnn,"F%d",ShStr);
    sprintf(str,"%14.2f",sum);
    WriteToCell(wsh,nnn,str); 
	
	// Валюта
	str=CTabl.Text(Fld[idxRUR],zap);
	FreeSpaceString(UpperString(str),3,""); OemToChar(str,str);
	sprintf(nnn,"G%d",ShStr);
    WriteToCell(wsh,nnn,str);

    ItogSum = ItogSum+sum; 

    if (zap>0)
    {   
         // добaвляем строку
         wsh.Rows(ShStr+1).Insert();
    }
    j++;
    ShStr++;
   }
  wsh.Rows(ShStr+1).Delete();
  wsh.Rows(ShStr).Delete();
  //ShStr++;

  //Itog summa
  sprintf(nnn,"F%d",ShStr);
  sprintf(str,"%.2f",ItogSum);
  OemToChar(str,str);
  WriteToCell(wsh,nnn,str);
  
   
  sprintf(nnn,"A%d",ShStr+3);
  WriteToCell(wsh,nnn,RukDoldjn + "   __________________ " + Ruk);
  sprintf(nnn,"A%d",ShStr+6);
  WriteToCell(wsh,nnn,GlBuhDoljn + "  __________________ " + GlBuh);
  

  xls.Visible=true;           // делаем Excel видимым
  }
 catch(object err)
   {
      SayError(err);
   }
   catch(...)
   {
      ;
   }

   return 0;
}

SendSumm(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;

  var xls=CreateObject("Excel.Application");  // создаем объект Excel.Application, т.е. запускаем Excel, если он установлен конечно
  char Dir[128];                              // строка для текущей директории
  GetCurrentDirectory(128,Dir);               // получаем текущую директорию (это корень каталога ZPL из которого запустили АМБу)
  string nm="otkrytie_sum.xlt";                        // имя Excel'евского файла
  var WorkDir = Dir + "\\"+NameCommonDir()+"\\";         
  xls.Caption=OemToAnsi("Список на зачисление денежных средств");// заголовок (в windows кодировке)
  var Workb=xls.Workbooks.Add(WorkDir+nm);    // открываем в Excel'е наш файл ls.xls

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

  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; //определяем необходимые нам номера полей
  char dog[256], date_z[256], Org[256], Ruk[256], RukDoldjn[256], GlBuh[256], GlBuhDoljn[256];
  // Заполняем наименование организации
     GetEnterpriseVar("ИМЯП", Org,255);  // Наименование предприятия или отделения иностранной организации
     FreeSpaceString(Org,3,""); OemToChar(Org,Org);
     WriteToCell(wsh,"A2",Org);           // пишем в ячейку название организации
   // Заполняем подножие списка Должности и ФИО руководителей
     GetEnterpriseVar("ДОЛЖ", RukDoldjn,255);  // Должность руководителя
     FreeSpaceString(RukDoldjn,3,""); OemToChar(RukDoldjn,RukDoldjn);
	 GetEnterpriseVar("РУКП", Ruk,255);  // ФИО руководителя
     FreeSpaceString(Ruk,3,""); OemToChar(Ruk,Ruk);
	 GetEnterpriseVar("ДОЛЖБУХ", GlBuhDoljn,255);  // Должность главбуха
     FreeSpaceString(GlBuhDoljn,3,""); OemToChar(GlBuhDoljn,GlBuhDoljn);
	 GetEnterpriseVar("ГЛБУХ", GlBuh,255);  // ФИО главбуха
     FreeSpaceString(GlBuh,3,""); OemToChar(GlBuh,GlBuh);
  // Заполняем месяц и дату зачисления
      dog=CTabl.TextS("Dog",0);
      date_z=CTabl.TextS("Date",0);
        date_z = datatek; // Пусть по-умолчанию юудет текущая дата
	  char reestr[256];
	  sprintf(reestr,"Реестр № %s от %s",dog,date_z); OemToChar(reestr,reestr);
	  FreeSpaceString(reestr,3,"");
      WriteToCell(wsh,"A3",reestr);
  
  double sum, ItogSum=0; 

  int ShStr=5; int j=1;
  char nnn[256], str[256], str2[256], str3[256], dog_num[256];
  try
  {
  // цикл по записям таблицы
  for (int zap=0; zap<cr; zap++)
  {
    // progress bar - чтобы видеть процент выполненной работы до того как появится результат
    if ( CMsg.Msg_Proc(" Подождите немного. Идет подготовка к печати. ",100.*zap/cr)==ESC )
    {
      return 0;
    }
    // №
	str=CTabl.Text(Fld[idxOrder],zap);
    sprintf(nnn,"A%d",ShStr);
    WriteToCell(wsh,nnn,j);  

    // ФИО
    str=CTabl.Text(Fld[idxF],zap);
    FreeSpaceString(str,3,""); OemToChar(str,str);
    str2=CTabl.Text(Fld[idxI],zap);
    FreeSpaceString(str2,3,""); OemToChar(str2,str2);
    str3=CTabl.Text(Fld[idxO],zap);
    FreeSpaceString(str3,3,""); OemToChar(str3,str3);

    sprintf(nnn,"B%d",ShStr);
    WriteToCell(wsh,nnn,str);  
	sprintf(nnn,"C%d",ShStr);
    WriteToCell(wsh,nnn,str2);  
	sprintf(nnn,"D%d",ShStr);
    WriteToCell(wsh,nnn,str3);  

    // № счета
    str=CTabl.Text(Fld[idxNSh],zap);
	FreeSpaceString(UpperString(str),3,""); OemToChar(str,str);
	sprintf(nnn,"E%d",ShStr);
    WriteToCell(wsh,nnn,str);

    // summa
    sum = atof(CTabl.Text(Fld[idxSum],zap));
    sprintf(nnn,"F%d",ShStr);
    sprintf(str,"%14.2f",sum);
    WriteToCell(wsh,nnn,str); 
	
	// Валюта
	str=CTabl.Text(Fld[idxRUR],zap);
	FreeSpaceString(UpperString(str),3,""); OemToChar(str,str);
	sprintf(nnn,"G%d",ShStr);
    WriteToCell(wsh,nnn,str);

    ItogSum = ItogSum+sum; 

    if (zap>0)
    {   
         // добaвляем строку
         wsh.Rows(ShStr+1).Insert();
    }
    j++;
    ShStr++;
   }
  wsh.Rows(ShStr+1).Delete();
  wsh.Rows(ShStr).Delete();
  //ShStr++;
  
  
  //Itog summa
  sprintf(nnn,"F%d",ShStr);
  sprintf(str,"%.2f",ItogSum);
  OemToChar(str,str);
  WriteToCell(wsh,nnn,str);
  
   
  sprintf(nnn,"A%d",ShStr+3);
  WriteToCell(wsh,nnn,RukDoldjn + "   __________________ " + Ruk);
  sprintf(nnn,"A%d",ShStr+6);
  WriteToCell(wsh,nnn,GlBuhDoljn + "  __________________ " + GlBuh);

  xls.Visible=true;           // делаем Excel видимым
  }
 catch(object err)
   {
      SayError(err);
   }
   catch(...)
   {
      ;
   }

   return 0;
}

FillNumFld()
//=============================================================================
// Находим поля в таблице
//=============================================================================
{
   Fld[idxOrder]      = CTabl.Find_Name_Fld("Order");    
   Fld[idxF]          = CTabl.Find_Name_Fld("NAM3");
   Fld[idxI]          = CTabl.Find_Name_Fld("NAM1");
   Fld[idxO]          = CTabl.Find_Name_Fld("NAM2");
   Fld[idxNSh]        = CTabl.Find_Name_Fld("FCBankCard");
   Fld[idxSum]        = CTabl.Find_Name_Fld("Sum");
   Fld[idxDog]        = CTabl.Find_Name_Fld("Dog");
   Fld[idxDate]       = CTabl.Find_Name_Fld("Date");
   Fld[idxRUR]        = CTabl.Find_Name_Fld("RUR");
   
   for ( int ii=0; ii<nFld; ii++ )
     if ( Fld[ii]==-1 )
     {
        AmbaMessageBox("Нет необходимых полей в таблице!","Ошибка!!!",MB_OK|MB_ICONERROR,0);
        return false;
     }
   return true;
}

WriteToCell(&WSheet,&Cell,&strok)
// WSheet - ссылка на worksheet
// Cell - имя ячейки
// str - значение, которое требуется записать в ячейку Cell рабочего листа WSheet
{
  string t = static_cast_to_string(strok);

  if ( strlen(t) )
    WSheet.Range(static_cast_to_string(Cell)).Value = t;
   
  return 0;
}
