// Передача сумм в ПАО "Открытие"
var CTabl;  // объект класса для работы таблицей  

char NumDog[9];    // Номер договора
char DateD[11];    // Дата договора
char OtdBank[10];   // Отделение банка
char Val[4];        // Валюта операции
char VidZ[3];        // Вид зачисления
char NNN[6];       //порядковый номер реестра
char dr[11];       // дата реестра
char dt[11];       // Текущая дата
char Org[256],Inn[256];

string Bik;
string Schet;

int idxFam        = 1, 
    idxIm         = 2, 
    idxOtch       = 3,
    idxBankCard   = 4,
    idxSumm       = 5,
	idxOrder      = 6,
	idxVal        = 7,
    CountIdx      = 8;
int fld[CountIdx]; // массив номеров полей таблицы


GetOrgDetails(&Org,&Inn)
{
  char str[256];
  GetEnterpriseVar("ИМЯП", Org,100); // Наименование предприятия или отделения иностранной организации
  FreeSpaceString(Org,2,""); OemToChar(Org,Org);
  
  GetEnterpriseVar("ИНН", Inn,22); 
  FreeSpaceString(Inn,2,""); 
}


//***Формирование файла xml на зачисление сумм
Open_SumXML(AdrCTabl, AdrCListTabl, RcrInList)
{
  //создаем объект для работы с таблицей
  var CTabl = CreateObject("CurPrnTbl");
  CTabl.Initial(AdrCTabl); 
 
  //определяем номера полей в таблице
  if ( !FillFld(CTabl) ) return false; 
  int count_rec=CTabl.Count_Rcr();

  try
  {
    var XMLDoc= CreateXMLobj();
    var XMLDoc1 = CreateElemXML(XMLDoc,OemToAnsi("СчетаПК"));
    XMLDoc.documentElement= XMLDoc1;

    GetOrgDetails(Org,Inn);
	
	char schet[21],bik[10];
	GetEnterpriseVar("РСЧ",schet,20); FreeSpaceString(schet,2,""); Schet=schet; 
    GetEnterpriseVar("БИК",bik,9); FreeSpaceString(bik,2,""); Bik=bik;
	Val = CTabl.Text(fld[idxVal],0);
		
	
   char StrP[256], CurrentDir[256];
   char Dir[21], nam[81], ext[21];
   string NameExe = namexe();
   splitpath(NameExe,Dir,StrP,nam,ext);
   CurrentDir = Dir+StrP+"..\\SCRIPT\\BANK\\open_s.dat";
   fullpath(CurrentDir,CurrentDir,255);
   FreeSpaceString(CurrentDir,3,"");
   string WorkFile=CurrentDir;
	if ( LoadGlobalData(WorkFile)==-1 ) return 0;
	
	
	SetAttrElemXML(XMLDoc.documentElement,"xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance");
    SetAttrElemXML(XMLDoc.documentElement,"xsi:noNamespaceSchemaLocation","Wages.xsd");
	
    XMLDoc1.setAttribute(OemToAnsi("ДатаФормирования"),static_cast_to_string(ModifDate(datatek)));
    XMLDoc1.setAttribute(OemToAnsi("НомерДоговора"),static_cast_to_string(NumDog));
	XMLDoc1.setAttribute(OemToAnsi("ДатаДоговора"),static_cast_to_string(DateD));
    XMLDoc1.setAttribute(OemToAnsi("НаименованиеОрганизации"),static_cast_to_string(Org));
    XMLDoc1.setAttribute(OemToAnsi("ИНН"),static_cast_to_string(Inn));
	XMLDoc1.setAttribute(OemToAnsi("РасчетныйСчетОрганизации"),static_cast_to_string(Schet));
	XMLDoc1.setAttribute(OemToAnsi("КодВалюты"),static_cast_to_string(Val));
    XMLDoc1.setAttribute(OemToAnsi("БИК"),static_cast_to_string(Bik));
	XMLDoc1.setAttribute(OemToAnsi("Зачисление"),static_cast_to_string(VidZ));    
	
    var XMLZaZarp = CreateElemXML(XMLDoc,OemToAnsi("ЗачислениеЗарплаты"));

    int bTime  = false; // false-показывать процент,
                        // true-показывать оставшееся время
    //Инициализируем ProgressBar
    var CMsg  = CreateObject("ProgressBar");
    CMsg.Initial(0,100,1);
    CMsg.SetShowTime(static_cast_to_int(bTime));

    int nomPP=0;
	char str[256];
    double ItogSum = 0;

    for (int zap=0; zap<count_rec; zap++)
    {
      if ( CMsg.Msg_Proc(" Подождите немного. Идет формирование файла.",100.*(zap+1)/count_rec)==ESC )
          return false;

      nomPP++;

      var XMLSotr = CreateChildElemXML(XMLDoc,XMLZaZarp,OemToAnsi("Сотрудник"));
      XMLSotr.setAttribute(OemToAnsi("Нпп"),static_cast_to_string(nomPP));

      var XMLF = CreateChildElemXML(XMLDoc,XMLSotr,OemToAnsi("Фамилия"));
      str = CTabl.Text(fld[idxFam],zap); FreeSpaceString(str,2,"");
      XMLF.text = OemToAnsi(str);

      var XMLI = CreateChildElemXML(XMLDoc,XMLSotr,OemToAnsi("Имя"));
      str = CTabl.Text(fld[idxIm],zap); FreeSpaceString(str,2,"");
      XMLI.text = OemToAnsi(str);

      var XMLO = CreateChildElemXML(XMLDoc,XMLSotr,OemToAnsi("Отчество"));
      str = CTabl.Text(fld[idxOtch],zap); FreeSpaceString(str,2,"");
      XMLO.text = OemToAnsi(str);

      var XMLNomOsb = CreateChildElemXML(XMLDoc,XMLSotr,OemToAnsi("ОтделениеБанка"));
      XMLNomOsb.text = static_cast_to_string(OtdBank);
                
      var XMLBankCard = CreateChildElemXML(XMLDoc,XMLSotr,OemToAnsi("ЛицевойСчет"));
      str = CTabl.Text(fld[idxBankCard],zap); FreeSpaceString(str,2,"");
      XMLBankCard.text = static_cast_to_string(str);

      var XMLSumm = CreateChildElemXML(XMLDoc,XMLSotr,OemToAnsi("Сумма"));
      str = CTabl.Text(fld[idxSumm],zap); FreeSpaceString(str,2,"");
      XMLSumm.text = static_cast_to_string(str);
	  ItogSum += atof(str);
	  
	  var XMLVal = CreateChildElemXML(XMLDoc,XMLSotr,OemToAnsi("КодВалюты"));
      str = CTabl.Text(fld[idxVal],zap); FreeSpaceString(str,2,"");
      XMLVal.text = static_cast_to_string(str);
	  
    }
    XMLDoc.documentElement.appendChild(XMLZaZarp);

      
    var XMLKontrSumm = CreateElemXML(XMLDoc,OemToAnsi("КонтрольныеСуммы"));
    var XMLKol = CreateChildElemXML(XMLDoc,XMLKontrSumm,OemToAnsi("КоличествоЗаписей"));
    XMLKol.text = static_cast_to_string(nomPP);
    var XMLSumm = CreateChildElemXML(XMLDoc,XMLKontrSumm,OemToAnsi("СуммаИтого"));
    sprintf(str,"%.2f",ItogSum);
    XMLSumm.text = static_cast_to_string(str);
    XMLDoc.documentElement.appendChild(XMLKontrSumm);
		
   //формируем имя файла
    char NameFile[256];
    var OptionsTR = CreateObject("TransferOptions");
    stccpy(NameFile,OptionsTR.GetNameFile(),256);
    FreeSpaceString(NameFile,3," ");

    str=NameFile;
    mkdirAll(str);//создаем каталог если его нет

    char Path[256];
    Path=str;
    if ( Path[0]=='.' && Path[1]=='.' )
    {
      fullpath(Path,Path,255);
      FreeSpaceString(Path,3,"");
      str=Path;
    }

	
    if (!SaveFileXMLFine(XMLDoc,str," "))
    {   
      AmbaMessageBox("Невозможно сохранить файл "+NameFile,"ошибка",0, 0);
      return false;
    }
 }
  catch(object err)
  {
    SayError(err);
    return 0;
  }
  catch(...)
  {
    SayUndefinedScriptError();
    return 0;
  }
  return 1;
}

FillFld(&CTabl)
//=============================================================================
// Находим поля в таблице
//=============================================================================
{
  fld[idxOrder]     = CTabl.Find_Name_Fld("Order");
  fld[idxFam]       = CTabl.Find_Name_Fld("FCf");
  fld[idxIm]        = CTabl.Find_Name_Fld("FCi");
  fld[idxOtch]      = CTabl.Find_Name_Fld("FCo");
  fld[idxBankCard]  = CTabl.Find_Name_Fld("FCBankCard");
  fld[idxVal]       = CTabl.Find_Name_Fld("Val");
  fld[idxSumm]      = CTabl.Find_Name_Fld("CASHSUM");
  
  for ( int ii=1; ii<CountIdx; ii++ )
    if ( fld[ii]==-1 )
    {
      AmbaMessageBox("Нет необходимых полей в таблице!","Ошибка!!!",MB_OK|MB_ICONERROR,0);
      return false;
    }
  return true;
}

CreateXMLobj()
// Создание XML файла
{   
   UnloadScriptModule("msxml");
   LoadScriptModule("msxml");
   var XMLDoc = CreateXML("");
   return XMLDoc;
}

//======================================
ModifDate(date)
//на входе дата в виде строки ДД.ММ.ГГГГ(разделитель не важен)
//на выходе дата в формате YYYY-MM-DD
{
  FreeSpaceString(date,2,"");
  if (strlen(date)==0) return "";
  
  var d=KDateFromStr(date);
  if (!d.IsValid()) return "";
  
  char rez[256];
  sprintf(rez,"%04d%s%02d%s%02d",d.GetYear(),"-",d.GetMonth(),"-",d.GetDay());
  return rez;
}

//======================================
ModifDate2(date)
//на входе дата в виде строки ДД.ММ.ГГГГ(разделитель не важен)
//на выходе дата в формате DDMMYYYY
{
  FreeSpaceString(date,2,"");
  if (strlen(date)==0) return "";
  
  var d=KDateFromStr(date);
  if (!d.IsValid()) return "";
  
  char rez[256];
  sprintf(rez,"%02d%02d%04d",d.GetDay(),d.GetMonth(),d.GetYear());
  return rez;
}

//====================================================================
// Функция вводит некоторые данные для передачи на карточки, которые
// задаются один раз для предприятия. Функция сохраняет настройки в
// файле. Если файл существует, то она считывает настройки из этого
// файла и выводит их. Иначе делает настройки по умолчанию.

InputGlobalData()
{
   SetGlobalDefault();
   // Ищем файл ..\\SCRIPT\\BANK\\MB.dat
   // Если файл есть, берем настройки оттуда.
   // Если файла нет, то запрашиваем.

   string TitleForm="Введите данные";
   char StrP[256], CurrentDir[256];
   char Dir[21], nam[81], ext[21];
   string NameExe = namexe();
   splitpath(NameExe,Dir,StrP,nam,ext);
   CurrentDir = Dir+StrP+"..\\SCRIPT\\BANK\\open_s.dat";
   fullpath(CurrentDir,CurrentDir,255);
   FreeSpaceString(CurrentDir,3,"");
   string WorkFile=CurrentDir;

   if ( LoadGlobalData(WorkFile)!=-1 )
       TitleForm="Подтвердите данные:";
      
   //проверка даты, запись порядкового номера документа за день     
   int nom;
   char dat[11];
   Text_Text(dat,datatek,10);
   nom =atoi(NNN);
   if (dt==dat) 
   { 
      nom++;
      if ( nom>999 ) nom=1;
      sprintf(NNN,"%d",nom);
   }
   else 
   { 
      Text_Text(dt,datatek,10);
      NNN="1";
   }
   
   if (InputPGlobalData(TitleForm)==ESC)
      return ESC;
 
   SaveGlobalData(WorkFile);  
   return 0;   
  
}

//====================================================================
// Задаем значения по умолчанию

SetGlobalDefault()
{
   strcpy(NumDog,"12345678") ;  // Номер договора
   strcpy(DateD,"01.01.2017") ;  // Дата договора
   strcpy(OtdBank,"123456789");         // Отделение банка
   strcpy(VidZ,"01");         // Вид зачисления
   strcpy(dr,datatek);         // Вид зачисления
      
  return 0;
}

//====================================================================
// Ввод и данных

InputPGlobalData(caption)
{
  if (ESC==Panel_Zapros(" Введите дополнительные данные ","",
                    "  Номер договора",NumDog, 9,
					"  Дата договора",DateD, 10,
					"  Отделение банка", OtdBank,10,
					"  Вид зачисления", VidZ,3,
					"  Номер реестра", NNN,6,
					"  Дата реестра", dr,10) 
					
      ) return ESC;
   return 1;
}

//====================================================================
// Сохраняет глобальные данные. Принимает имя файла.

SaveGlobalData(WorkFile)
{
   int file;
   if ((file = CreateFile(WorkFile, 1073741824, 2, 0, 2, 128, 0)) == -1)
   {
       AmbaMessageBox("Не могу открыть файл "+WorkFile+" для записи.","Ошибка",1,0);
       return ESC;
   }
   int len;

   WriteFile(file,NumDog,9,len,0);
   WriteFile(file,DateD,11,len,0);
   WriteFile(file,OtdBank,10,len,0);
   WriteFile(file,VidZ,3,len,0);
   WriteFile(file,NNN,6,len,0);
   WriteFile(file,dr,10,len,0);
   
   CloseHandle(file);
   return 1;
}

//====================================================================
// Загрузка данных. Принимает дескриптор файла.

LoadGlobalData(WorkFile)
{
   int file = CreateFile(WorkFile,2147483648  , 0   , 0   , 3            , 0, 0);
   if (file==-1) return -1;
   
   int len;
   ReadFile(file,NumDog,9,len,0); NumDog[8]='\0';
   ReadFile(file,DateD,11,len,0); DateD[10]='\0';
   ReadFile(file,OtdBank,10,len,0);  OtdBank[9] ='\0';
   ReadFile(file,VidZ,3,len,0);  VidZ[2] ='\0';
   ReadFile(file,NNN,6,len,0); NNN[5] ='\0';
   ReadFile(file,dr,10,len,0); dr[10] ='\0';
 
   CloseHandle(file);
   return 0;
}

//================================================================
// функция для генерации имени файла
//================================================================
MNOpenSum ( AdrCTabl,     // адрес передаваемой таблицы    
                AdrCListTabl, // адрес списка таблиц           
                RcrInList     // номер записи в списке таблиц
              )                                                
{
   GetEnterpriseVar("ИНН", Inn,22); FreeSpaceString(Inn,2,"");  
   var OptionsT = CreateObject("TransferOptions");
   
   if (InputGlobalData()==ESC) return 0;
   char NameFile[512];
    sprintf (NameFile,"C:\\open\\ZPR_%d_%s_%s.xml",atoi(NNN),
	          static_cast_to_string(ModifDate2(dr)),Inn);
   
   OptionsT.SetNameFile(static_cast_to_string(NameFile));
}




//================================================================
// функция для генерации имени файла
//================================================================
MNOpenSum2 ( AdrCTabl,     // адрес передаваемой таблицы    
                AdrCListTabl, // адрес списка таблиц           
                RcrInList     // номер записи в списке таблиц
              )                                                
{
   var OptionsT = CreateObject("TransferOptions");

   if (InputGlobalData()==ESC) return 0;
   char NameFile[512];
    sprintf (NameFile,"C:\\open\\%s_%06d.xml",
            NumDog,atoi(NNN));
   
   OptionsT.SetNameFile(static_cast_to_string(NameFile));
}


//======================================================
// ПЕЧАТНЫЕ ФОРМЫ
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 ( !FillFld(CTabl) ) return false; //определяем необходимые нам номера полей

  double sum, ItogSum=0; 

   char 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);
	 
     // Заполняем месяц и дату зачисления
	  char reestr[256];
	  sprintf(reestr,"Реестр № _____ от __________ "); 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[idxFam],zap);
    FreeSpaceString(str,3,""); OemToChar(str,str);
	str2=CTabl.Text(fld[idxIm],zap);
    FreeSpaceString(str2,3,""); OemToChar(str2,str2);
    str3=CTabl.Text(fld[idxOtch],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[idxBankCard],zap);
	FreeSpaceString(UpperString(str),3,""); OemToChar(str,str);
	sprintf(nnn,"E%d",ShStr);
    WriteToCell(wsh,nnn,str);

    // Сумма
    sum = atof(CTabl.Text(fld[idxSumm],zap));
    sprintf(nnn,"F%d",ShStr);
    sprintf(str,"%14.2f",sum);
    WriteToCell(wsh,nnn,str); 
	
	// Код валюты
    str = atof(CTabl.Text(fld[idxVal],zap));
    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;
}


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;
}

