//
// Передача сумм в Сбербанк (DBF)
// ~~~~~~~~~~~~~~~~~~~~~~~~~

//==================================================================
//====== Настройки =================================================
//==================================================================

int bNumFilB = 1; // 1 - Заполнять колонку "Примечание"(G) номерами филиалов банка
                  // в формате "№ отделения/№ филиала отделения", 0 - не заполнять
int bVidZ = 0;    // 0 - Вид зачисления код, 1 - значение
int bRazdDat =0;  // 0 - даты вида dd/mm/gggg
                  // 1 - даты вида dd.mm.gggg

// ===== Настройки шапки ===========================================

int bN = 1; // 1 - выводить "№", 0 - выводить "#"(Московский филиал)

string rNumOtd = " №"; // Разделитель между названием отделения и его номером
//string rNumOtd = "";

int bPeriod = 0;  // 1 - Выводить строку с периодом, 0 - нет

                  // Заголовок для предприятия
string rNameP = "Наименование,ОГРН,№ банк.счета";
//string rNameP = "Наименование, (ОГРН), номер банковского счета предприятия (организации)";
//string rNameP = "Наименование,ОГРН,# банк.счета";
//string rNameP = "Наименование (ОГРН) организации";
//string rNameP = "Наименование (шифр) организации";

int bRPredpr = 1; // 0 - заголовка нет, 1-ый столбец название, 2-ой ОГРН, 3-ий счет банка
                  // 1 - 1-ый столбец заголовок, 2-ой название и ОГРН, 3-ий счет банка
                  // 2 - 1-ый столбец заголовок, 2-ой название
                  // 3 - 1-ый столбец заголовок, 2-ой название и ОГРН

int bNumDog = 1;  // 1 - запрашивать и выводить, дату и номер договора
                  // 0 - нет

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


var Tabl,File;//объекты: талица и файл печати
var MapOsb = CreateObject("MapLong"); 

var oDBF; // объект DBF который созаем

int fl=0;
var CMsg=0;         // Процент выполненной работы
int bTime  = false; // false-показывать процент,
                    // true-показывать оставшееся время

int rec_ins=0,   //отмечено
    count_rec=0, //всего
    count_osb=0, //кол-во ОСБ в таблице
    PNomerOsb=0, //порядковый номер ОСБ 
    start_row=6,
    row=start_row,
    start_col=0;

long NomerOsb=0;
char XX[256],    //порядковый номер файла
     Path[256],
     Index[256];
string NameOsb[99];
string VZa4="";
double Itogo[99];
double Procent=0.005;
long out=0;
char s[256],d[256];
char s1[256],d1[256];

//***Формирование файла dbf на зачисление сумм
ToSB_SumDBF(AdrCTabl, AdrCListTabl, RcrInList)
{
   if ( PanelVZa4(VZa4)==ESC ) return 0;

   //создаем объект для работы с таблицей
   File=CreateObject("CurPrnFile");
   File.SetFlag_Print(0);
   Tabl = CreateObject("CurPrnTbl");
   Tabl.Initial(AdrCTabl); 

   s=Tabl.TextS("NumPlat",0);
   d=Tabl.TextS("DataPlat",0);

   if ( bNumDog )
   {
      s1=Tabl.TextS("NumDog",0);
      d1=Tabl.TextS("DataDog",0);

      if (ESC==Panel_Zapros(" Введите дополнительные данные ","",
                    "  Номер платежного поручения",s, 20, 
                    "  Дата платежного поручения",d,10,
                    "  Номер договора",s1, 20, 
                    "  Дата договора",d1,10
                        )
         ) return ESC;

      Tabl.STextS("NumDog",0, static_cast_to_string(s1));
      Tabl.STextS("DataDog",0, static_cast_to_string(d1));
   }
   else
   {
      if (ESC==Panel_Zapros(" Введите дополнительные данные ","",
                    "  Номер платежного поручения",s, 20, 
                    "  Дата платежного поручения",d,10
                        )
         ) return ESC;
   }

   Tabl.STextS("NumPlat",0, static_cast_to_string(s));
   Tabl.STextS("DataPlat",0, static_cast_to_string(d));
   Tabl.Rewrite();

   FreeSpaceString(d,3,""); FreeSpaceString(d1,3,"");
   if ( !bRazdDat )
   {
      d[2] ='/'; d[5] ='/';
      d1[2]='/'; d1[5]='/';
   }

   //определяем номера полей в таблице
   FillFld();
   count_rec=Tabl.Count_Rcr();

   try
   {
   OpenDBFobj();

   //Инициализируем ProgressBar
   CMsg  = CreateObject("ProgressBar");
   CMsg.Initial(0,100,1);
   CMsg.SetShowTime(static_cast_to_int(bTime));

   // загружаем файл с данными для имени файла
   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\\SB.dat";
   fullpath(CurrentDir,CurrentDir,255);
   FreeSpaceString(CurrentDir,2,"");
   string WorkFile=CurrentDir;

   LoadGlobalData(WorkFile);

   NomerOsb=atol(NOsb);
   PrintOsbDbf();

   }

   catch(object err)
   {
      SayError(err);
      return 1;
   }
   catch(...)
   {
      return 1;
   }

   return 0;

}

//Формирование dbf файла
PrintOsbDbf()
{
   //добавляем таблицу
   OprNameOsb();
   CalcItogo();
   //печать шапки dbf
   row = PrintOsbDbfHead();
   //печать таблицы с данными
   int nomPP=0;
   //row=5;

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

      if (!Tabl.Flag_Action_1(zap) || atol(Tabl.Text(fld[idxNomOsb],zap))!=NomerOsb) continue;
      nomPP++;
      oDBF.Add_Rcr(row,1);
      row++;
      WriteLSDdf(zap,nomPP);
   }

   oDBF.Add_Rcr(row,1);
   PrintOsbDbfBottom();  
   //сохранение dbf    
   OsbToDbf();
}

//печать шапки dbf
PrintOsbDbfHead()
{
   char str[256],str1[256],str2[256]; 
   int row = 0;

   // Добавляем в DBF необходимое количество строк для шапки
   int dob_row = 5;
   if ( bPeriod ) dob_row++;
   oDBF.Add_Rcr(0,dob_row);

   if( !bN ) rNumOtd = "#";
   sprintf(str,"%s %s%d",NameOsb[PNomerOsb],rNumOtd,NomerOsb); 
   oDBF.SText(0,row,static_cast_to_string(str));

   row++; //=1

   if( bN ) oDBF.SText(0,row,"К платежному поручению №");
      else  oDBF.SText(0,row,"К платежному поручению #");
   oDBF.SText(1,row,static_cast_to_string(s));
   oDBF.SText(2,row,"от");
   oDBF.SText(3,row,static_cast_to_string(d));

   row++; //=2

   oDBF.SText(0,row,"Зачисление");
   oDBF.SText(1,row,static_cast_to_string(VZa4));

   row++; //=3;

   if ( bPeriod )
   {
      oDBF.SText(0,row,"За период");
      oDBF.SText(1,row,static_cast_to_string(MesInYear(Month_Cash)));
      row++; // если выводим месяц, то все строки смещаются на одну
   }

   GetEnterpriseVar("ИМЯП",str,30);   FreeSpaceString(str,3,""); 
   GetEnterpriseVar("ОГРН",str1,30);  FreeSpaceString(str1,3,"");
   GetEnterpriseVar("КОРРСЧБ",str2,30); FreeSpaceString(str2,3,""); 

   if ( !bRPredpr )
   {
      oDBF.SText(0,row,static_cast_to_string(str));
      oDBF.SText(1,row,static_cast_to_string(str1));
      oDBF.SText(2,row,static_cast_to_string(str2));
   }
   else if ( bRPredpr==1 )
   {
      oDBF.SText(0,row,rNameP);
      if (str1!="") oDBF.SText(1,3,static_cast_to_string(str+","+str1));
               else oDBF.SText(1,3,static_cast_to_string(str));  
      oDBF.SText(2,row,static_cast_to_string(str2));
   }
   else if ( bRPredpr==2 )
   {
      oDBF.SText(0,row,rNameP);
      oDBF.SText(1,3,static_cast_to_string(str));  
   }
   else if ( bRPredpr==3 )
   {
      oDBF.SText(0,row,rNameP);
      if (str1!="") oDBF.SText(1,3,static_cast_to_string(str+","+str1));
               else oDBF.SText(1,3,static_cast_to_string(str));  
   }

   row++;//=4

   if ( bNumDog )
   {
      oDBF.SText(0,row,"По договору");
      oDBF.SText(1,row,static_cast_to_string(s1));
      oDBF.SText(2,row,"от");
      oDBF.SText(3,row,static_cast_to_string(d1));
   }

   row++;//=5

   if( bN ) oDBF.SText(0,row,"№ п/п");
       else oDBF.SText(0,row,"# п/п");
   oDBF.SText(1,row,"Номер счета");
   oDBF.SText(2,row,"Фамилия");
   oDBF.SText(3,row,"Имя");
   oDBF.SText(4,row,"Отчество");
   oDBF.SText(5,row,"Сумма");
   oDBF.SText(6,row,"Примечание");

   return row;
}

PrintOsbDbfBottom()
{
   row++;
   oDBF.SText(start_col+1,row,"ИТОГО:");

   char summa[256];
   sprintf(summa,"%.2f",Itogo[PNomerOsb]);
   oDBF.SText(start_col+5,row,static_cast_to_string(summa));
}

//Печать данных по ЛС в dbf файл
WriteLSDdf(Arg1,Arg2)
{
   int zap=atoi(Arg1);
   oDBF.SText(start_col,  row,static_cast_to_string(Arg2));
   oDBF.SText(start_col+1,row,Tabl.Text(fld[idxBankCard],zap));
   oDBF.SText(start_col+2,row,Tabl.Text(fld[idxFam],zap));
   oDBF.SText(start_col+3,row,Tabl.Text(fld[idxIm],zap));
   oDBF.SText(start_col+4,row,Tabl.Text(fld[idxOtch],zap));

   char summa[256];
   summa = Tabl.Text(fld[idxSumm],zap);
   FreeSpaceString(summa,3,"");
   oDBF.SText(start_col+5,row,static_cast_to_string(summa));

   if ( bNumFilB )
   {
      char os[10],fs[10];
      os = Tabl.Text(fld[idxNomOsb],zap); FreeSpaceString(os,3,"");
      fs = Tabl.Text(fld[idxNFilB],zap);  FreeSpaceString(fs,3,"");
      oDBF.SText(start_col+6,row,static_cast_to_string(os+"/"+fs)); 
   }
}

//подсчет итогов по ОСБ
CalcItogo()
{
   for (int zap=0; zap<count_rec; zap++)
   {
      if (!Tabl.Flag_Action_1(zap) || atol(Tabl.Text(fld[idxNomOsb],zap))!=NomerOsb) continue;
      rec_ins++;
      Itogo[PNomerOsb]+=atof(Tabl.Text(fld[idxSumm],zap));
   }
}

OsbToDbf()
{
   //формируем имя файла
   char NameFile[256];
   var OptionsTR = CreateObject("TransferOptions");
   stccpy(NameFile,OptionsTR.GetNameFile(),256);
   FreeSpaceString(NameFile,2," ");

   char str[256];
   sprintf(str,"%s.dbf",NameFile);
   mkdirAll(str);//создаем каталог если его нет

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

   if ( SaveTmp2File(NameFile,str,true)==0 )
   {
      oDBF.Reform_To_Dbf(static_cast_to_string(str));
   }   
}

OpenDBFobj()
{
   oDBF = CreateObject("CurPrnTbl");
   oDBF.InitialEmptyTable();
   int Fld=0;
   oDBF.Add_Fld_0(Fld++,'C',30,0,30," ","Столбец1","A");
   oDBF.Add_Fld_0(Fld++,'C',30,0,30," ","Столбец2","B");
   oDBF.Add_Fld_0(Fld++,'C',30,0,30," ","Столбец3","C");
   oDBF.Add_Fld_0(Fld++,'C',30,0,30," ","Столбец4","D");
   oDBF.Add_Fld_0(Fld++,'C',30,0,30," ","Столбец5","E");
   oDBF.Add_Fld_0(Fld++,'C',30,0,30," ","Столбец6","F");
   oDBF.Add_Fld_0(Fld++,'C',30,0,30," ","Столбец7","G");
   oDBF.Del_Fld(0);

}

//название ОСБ из справочника
OprNameOsb()
{
  //нужно определиться со справочником, в кот. будем хранить названия (NomOsb.tab)
  char str[256];
  GetValueClassif("T_GUIDE\\numbank.tab",NomerOsb,str,120,"Value","Kod");
  FreeSpaceString(str,3,"");
  NameOsb[PNomerOsb]=str;
  return 1;
}

MesInYear(&mes)
{
  char str[256];
  int n_mes=atoi(mes);
  switch (n_mes)
  {
  case 1:  sprintf(str,"%s","Январь"); break;
  case 2:  sprintf(str,"%s","Февраль");   break;
  case 3:  sprintf(str,"%s","Март");    break;
  case 4:  sprintf(str,"%s","Апрель");  break;
  case 5:  sprintf(str,"%s","Май");     break;
  case 6:  sprintf(str,"%s","Июнь");    break;
  case 7:  sprintf(str,"%s","Июль");    break;
  case 8:  sprintf(str,"%s","Август");  break;
  case 9:  sprintf(str,"%s","Сентябрь");break;
  case 10: sprintf(str,"%s","Октябрь"); break;
  case 11: sprintf(str,"%s","Ноябрь");  break;
  case 12: sprintf(str,"%s","Декабрь"); break;
  }   
  return str;
}

PanelVZa4(&rez)
{
  rez = "Расчет";
  var MapVZa4 = CreateObject("MapString");
  MapVZa4.Add("01","Заработная плата");
  MapVZa4.Add("02","Стипендия учащимся");
  MapVZa4.Add("03","Пенсия социальная");
  MapVZa4.Add("04","Пенсия негосударственных пенсионных фондов");
  MapVZa4.Add("05","Пособия и другие выплаты по безработице");
  MapVZa4.Add("06","Пособия на детей");
  MapVZa4.Add("07","Прочие выплаты");

  string Title = "Выберите вид зачисления";
  var MapRez = CreateObject("MapString");
  if ( PanelValueFromMap(MapVZa4,MapRez,1,Title) == ESC )
     return ESC;
  if ( !MapRez.InitIterator() )
     return 0;
  if ( !bVidZ )
   rez = MapRez.GetCurKey();
  else
   rez = MapRez.GetCurValue();

  return 0;
}

Ansi(str)
{                                     
   string ans=str;
   OemToChar(str,ans);
   return ans;
}


//поля для работы с таблицей  
int idxFam        = 1, 
    idxIm         = 2, 
    idxOtch       = 3,
    idxBankCard   = 4,
    idxSumm       = 5,
    idxNomOsb     = 6,
    idxNFilB      = 7,

    CountIdx      = 8;
int fld[CountIdx]; // массив номеров полей таблицы


FillFld()
//=============================================================================
// Находим поля в таблице
//=============================================================================
{
  fld[idxFam]       = Tabl.Find_Name_Fld("FCf");
  fld[idxIm]        = Tabl.Find_Name_Fld("FCi");
  fld[idxOtch]      = Tabl.Find_Name_Fld("FCo");
  fld[idxBankCard]  = Tabl.Find_Name_Fld("FCBankCard");
  fld[idxSumm]      = Tabl.Find_Name_Fld("CASHSUM");
  fld[idxNomOsb]    = Tabl.Find_Name_Fld("FCnumbank");
  fld[idxNFilB]     = Tabl.Find_Name_Fld("NFilB");

  return 1;
}

//================================================================
// функция для генерации имени файла
//char UnNum[4];
char UnNum[2];
//char SpS[2];
char NOsb[5];
char NDog[3];

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

   char NameFile[512];

   char month[256]; 
   MakeNameDirMonth(month);

   if (InputGlobalData()==ESC) return 0;

   Tabl = CreateObject("CurPrnTbl");
   Tabl.Initial(AdrCTabl); 

   sprintf(NameFile,"c:\\SberBank%s\\%s%s%s%s",month,"f",NOsb,NDog,UnNum);

   OptionsT.SetNameFile(static_cast_to_string(NameFile));
}                  

InputGlobalData()
{
   // Ищем файл ..\\SCRIPT\\BANK\\ZP.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\\SB.dat";
   fullpath(CurrentDir,CurrentDir,255);
   FreeSpaceString(CurrentDir,2,"");
   string WorkFile=CurrentDir;

   if ( LoadGlobalData(WorkFile)!=-1 )
       TitleForm="Введите дополнительные данные ";
   
   if (InputPGlobalData(TitleForm)==ESC)
      return ESC;
 
   SaveGlobalData(WorkFile);  
   return 0;   
  
}

//====================================================================
// Ввод и данных
InputPGlobalData(caption)
{
   string dop;
   if (Panel_Zapros("", caption,
                    " Номер ОСБ",NOsb,4,
                    " Порядковый номер реестра",UnNum,1,
                    //" Отличительнй символ",SpS,1,
                    " Последние 2 цифры номера договора",NDog,2
                    //"( f - непосредственно в Филиал банка",dop,0,
                    //"  t - в филиал-получатель )",dop,0
                    )==ESC)
      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,NOsb,4,len,0);
   WriteFile(file,UnNum,1,len,0);
   WriteFile(file,NDog,2,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,NOsb,4,len,0); NOsb[4]='\0';
   ReadFile(file,UnNum,1,len,0); UnNum[1]='\0';
   ReadFile(file,NDog,2,len,0); NDog[2]='\0';

   //считаем порядковый номер
   int num= atoi(UnNum);
   num++; 
   if (num==10) num=1;
   sprintf(UnNum,"%d",num);

   //ReadFile(file,SpS,1,len,0); SpS[1]='\0';

   CloseHandle(file);
   return 0;
}
//======================================
