import "layer92.dll"


UserAlgorithmCalc(&info,&r)
{
   // инициализация локальных переменных
   int RetFlag       = code_Break,
       crow          = info.crow,
       b3            = info.b3,
       ikod          = info.ikod,
       kod_alg       = info.kod_alg,
       pos           = info.pos,
       mkat          = info.mkat,
       krabot        = info.krabot,
       tip_s9600     = info.tip_s9600,
       flag_propusk0 = info.flag_propusk0,
       z1            = info.z1,
       z2            = info.z2;

   double h[4];
   double kod        = info.kod,
          n1         = info.n1,
          d1         = info.d1,
          d2         = info.d2,
          bz         = info.bz;
          h[0]       = info.h[0],
          h[1]       = info.h[1],
          h[2]       = info.h[2],
          h[3]       = info.h[3];

   int rowkod[ROWMAX],i,m,m1,b1,b2,mvrem;
   char t[20],str[81],str1[81];
   double n2,n3,n4,n5,n6,n7,n8,n9,n10,r8,r9,k;

   /*-----------------------------------------------------*/
   /* tip_s9600=0 - функция обработки СУММЫ по строке     */
   /*               (s9600) - обнуляет РВ, если СУММА==0. */
   /* tip_s9600=1 - не обнуляет (в спец.случаях)          */
   /*-----------------------------------------------------*/

   /*-----------------------------------------------------*/
   /* Если flag_propusk0=1, то расчет данного вида по его */
   /* алгоритму производится только через режимы "Расчет  */
   /* произвольного вида", "Доп.расчеты" и при расчете от-*/
   /* дельной строки в "Просмотре, корректировке ЛС".     */
   /* flag_propusk0=3, то же, что =1, только в этом случае*/
   /* программа работает со строкой вида даже если у нее  */
   /* вышли даты действия (например, для квартал.дотаций).*/
   /* В остальных режимах - если есть СУММА, то подается  */
   /* на корректировку, иначе - вид пропускается в расчете*/
   /*-----------------------------------------------------*/

   int c=-4096;

   switch(kod_alg)
   {
      // Сюда можно вставлять вызов собственных алгоритмов расчета.
      // Примеры функций с алгоритмами  находятся
      // в файле SCRIPT\ALGSYS.S

      // начало описания алгоритмов пользователя


      case 708:
        return UserAlg708(info,r);


      case 246:
        return UserAlg246(info,r);

      case 332:
        return UserAlg332(info,r);
      case 331:
        return UserAlg331(info,r);


      case 952:
        return UserAlg952(info,r);


      case 614:
        return UserAlg614(info,r);
      case 313:
        return UserAlg313(info,r);


      case 980:
        return UserAlg980(info,r);

      case 178:
        return UserAlg178(info,r);



      case 278:
        return UserAlg278(info,r);

      case 608:
        return UserAlg608(info,r);

      case 995:
        return UserAlg995(info,r);

      case 994:
        return UserAlg994(info,r);

      case 938:
        return UserAlg938(info,r);


      case 918:
        return UserAlg918(info,r);

      case 725:
        return UserAlg725(info,r);

      case 961:
        return UserAlg961(info,r);

      case 901:
        return UserAlg901(info,r);
  
      case 984:
         return UserAlg984(info,r);

      case 965:
         return UserAlg965(info,r);

      case 985:
         return UserAlg985(info,r);

      case 953:
         return UserAlg953(info,r);

      case 978:
         return UserAlg978(info,r);

      case 930:
         return UserAlg930(info,r);

      case 944:
         return UserAlg944(info,r);

      case 914:
         return UserAlg914(info,r);

      case 904:
         return UserAlg904(info,r);

      case 922:  case 923:
         return UserAlg922_923(info,r);



      // конец описания алгоритмов пользователя

     //  case 918:
     //    return UserAlg918(info,r);


      // Пример вызова алгоритма пользователя.
      //case 4:
      //   return UserAlg4(info,r);

      // case 712:
      //   return UserAlg712(info,r);

      default:
         RetFlag=0;
         break;
   }

   if ( RetFlag )
   {
      info.crow            = crow,
      info.b3              = b3,
      info.kod             = kod,
      info.ikod            = ikod,
      info.kod_alg         = kod_alg,
      info.n1              = n1,
      info.d1              = d1,
      info.d2              = d2,
      info.pos             = pos,
      info.mkat            = mkat,
      info.krabot          = krabot,
      info.tip_s9600       = tip_s9600,
      info.flag_propusk0   = flag_propusk0,
      info.z1              = z1,
      info.z2              = z2,
      info.h[0]            = h[0],
      info.h[1]            = h[1],
      info.h[2]            = h[2],
      info.h[3]            = h[3],
      info.bz              = bz;

      if (c<=-4096) c=1;
      info.c               = c;
   }
   return RetFlag;
}




GetDiscount312(m1,m2)   //получаем сумму по 312 вычету за указанный период 
{  
   int absMes = mrasch;
   char Arg[256],Str[256];
   sprintf(Arg,"%d,1,%d,%d,Источник выплаты,*,Н",112,m1,m2);
   string s=R_Tax(Arg,Str,255,0);//получили  cписок вида "код вычета1,сумма вычета1;код вычета2,сумма вычета2;..."
   if ( mrasch!=absMes )
      s50(absMes);
   var Param = CreateObject("ParamFuncRW");
   Param.IInitial(static_cast_to_string(s),";",99);//разбили список  на элементы "код вычета,сумма вычета"
   int CountParam = Param.Count();
   for(int i=0;i<CountParam;i++)
   {
     string v=static_cast_to_string(Param.Get(i));      //получаем из списка i-е значение "код вычета(i),сумма вычета(i)"
     var Param2 = CreateObject("ParamFuncRW");
     Param2.IInitial(static_cast_to_string(v),",",2); //получаем код вычета и сумму вычета
     int codVich=atoi(Param2.Get(0));
     if (codVich!=312) continue; //перебираем элементы, пока не найдем 312 вычет
     return atof(Param2.Get(1)); //вернули сумму вычета
   }
   return 0;    //если 312 вычет не нашли - возвращаем 0
}


UserAlg708(&info,&r)        //для 708 вида НУ
{
   char ud_npo[256];
   StartRkv(GetCode(info.crow));
     ReadRkv("уд_нпо",ud_npo);   FreeSpaceString(ud_npo,3,"");
     double pro_t = 0.0;
     if( strlen(ud_npo) != 0 )   pro_t=atof(ud_npo);        //Сумма из доп рекв.     
   FinishRkv();

   double sum_npo=0.0;
   if(pro_t > 0)  info.n1 = pro_t;
   else 
   {
     s100("нтек",0,90,sum_npo);
     info.n1 = sum_npo / 100 * 2.5;
   } 
   return code_Break;  // return sum_npo;
}



UserAlg246 ( &info, &r )
{
   toMatrLS();
   char Sim[2];Sim[1]=0;
   Sim[0]=Sim_For_Intern_Cod(info.kod,1018-1);  //определяем символ в 18 столбце спец.ТВХ
   // Получим информацию о доходе с учетом вычетов
   double NDFLBase = 0.;
   if (Sim=="*") //расчет основного источника
   {
      var ts = CreateObject("TempCommonSrc");
      ts.TempCommonSrcInitial(CMN_SRC_COUNT_LS);
      var Src=CreateObject("APropBE");
      SetCommonProp(CMN_SRC_COUNT_LS,Src);
      NDFLBase = GetNDFLInfo(45); // доход за минусом всех вычетов
      // Важно!!! Мы учли информацию о доходе в том числе и с учетом вычета по недвижимости, что стоял
      // в рассчитываемом виде до этого, поэтому добавим эту сумму
      NDFLBase += CashSumm(0,info.kod,mrasch,0,32,CL_EXACT|CL_M,0);
   }
   else  //расчет не основного источника
   {
      //полная сумма для обложения  с копейками+Общая сумма вычетов (фактически предоставленная сумма)
      NDFLBase=GetNDFLInfo(4)+GetNDFLInfo(108);
   }

   double sumVychIspolz = 0.;
   if ( mcal>1 )
   {
      //вычет нам нужен по всем источникам
      var ts = CreateObject("TempCommonSrc");
      ts.TempCommonSrcInitial(CMN_SRC_COUNT_LS);
      var Src=CreateObject("APropBE");
      SetCommonProp(CMN_SRC_COUNT_LS,Src);
      sumVychIspolz = GetDiscount312(mrasch-mtek-mcal+1,mrasch-mtek-1);
   }
   if (Sim=="*") //нужно учесть предоставленные вычеты по остальным источникам
   {
       sumVychIspolz+= GetDiscount312(mrasch-mtek,mrasch-mtek); //добавляем сумму по 312 вычету за тек. месяц (все источники)
       sumVychIspolz-= CashSumm(0,info.kod,mrasch,0,32,CL_EXACT|CL_M,0);//убираем сумму по текущему виду
   }
   double sumVychMes = min(NDFLBase,info.bz-sumVychIspolz); // Cумма 
   // Если полученный вычет меньше нуля (были пересчеты на минус или нет дохода, но есть стандартные вычеты)
   // в этом случае мы можем отрицательную сумму взять не больше, чем предодставили вычетов в предыдущих месяцах
   if ( sumVychMes<0. )
      if ( sumVychIspolz>-0.0001 )
         sumVychMes = max(sumVychMes,-sumVychIspolz);
      else
         sumVychMes = 0.;
   info.n1 = sumVychMes;
   if(FL_V_ALG && uprc != NO_SCREEN) 
   {
      infolist.add_record("Облагаемая база НДФЛ за месяц", NDFLBase);
      infolist.add_record("Использовано вычета ранее", sumVychIspolz);
      infolist.add_record("Вычет за месяц", info.n1);
   }

   return code_Break;
}



UserAlg331(&info,&r)     // ндфл  15% без 78 
{
   //  Flag="BE_EXACT ";
   //  /*
   //   "BE_EXACT"      // отбор по точному коду
   //   "BE_FREESUM"    // не заменять сумму, если она уже есть в ЛС
   //   "BE_MERGE_SUM"  // добавление суммы к существующей
   //   "BE_REPLACE"    // не добавлять новую строку при отсутствии в ЛС нужной строки                       
   //  */
   //  sprintf(arg,"%.2f,%d,%d,%s,%s",Intern_To_ExternE(cod),mtek,mtek,Flag,to_string(tim));
   //  PutSummTime (arg,sum,14,2);


 double sum_702=0.0;    sumvid("*",205,0,sum_702);
 double sum_703=0.0;    sumvid("*",206,0,sum_703);

 if(sum_703)
  {
   double sum_331=0.0;    sumvid("*",231,0,sum_331);
   double sum_332=0.0;    sumvid("*",232,0,sum_332);


   //   rw_rkv( double kod,  LPSTR rkv, int &cntpok,  int &rowf205, int k )  k=1 -запись
   double kod_rkv=info.kod;     // код вида Н-У
   char n2[50];
   sprintf(n2,"%s;%s",to_string(sum_331),to_string(sum_332));
   rw_rkv(kod_rkv, n2, 1, 0, 1);
   //char n3[50];                           во второй
   //sprintf(n3,"%s",to_string(sum_332));   реквизит 
   //rw_rkv(kod_rkv, n3, 2, 0, 1);          не пишет

   double sum_431=0.0;
   sum_431= sum_703/(sum_331+sum_332)*sum_331;
   round2(sum_431,0,1,sum_431);

      info.n1=sum_431;
      if(FL_V_ALG && uprc != NO_SCREEN)
      {
         infolist.add_record("НДФЛ 13% (702) ",sum_702);
         infolist.add_record("НДФЛ 15% (703) ",sum_703);
         infolist.add_record("НДФЛ 13% без78 (331) ",sum_331);
         infolist.add_record("НДФЛ 13% для78 (332) ",sum_332);
         infolist.add_record("НДФЛ 15% без78 (431) ",sum_431);
         //infolist.add_record("Результат",info.n1);
      }
  }

  return code_Break;
}
UserAlg332(&info,&r)     // ндфл  15% для 78 
{
 //  sumvid("*m",178,0,n_69);
 double sum_702=0.0;    sumvid("*",205,0,sum_702);
 double sum_703=0.0;    sumvid("*",206,0,sum_703);
   double sum_331=0.0;    sumvid("*",231,0,sum_331);
   double sum_332=0.0;    sumvid("*",232,0,sum_332);

 if(sum_702)
  {
   double new_sum_331=sum_702/(sum_331+sum_332)*sum_331;
   double new_sum_332=sum_702/(sum_331+sum_332)*sum_332;
   round2(new_sum_331,0,1,new_sum_331);
   round2(new_sum_332,0,1,new_sum_332);

   char Flag[256];    Flag="BE_EXACT ";
   char arg[256];
   double cod = 331.00;
   sprintf(arg,"%.2f,%d,%d,%s,%s",cod,mtek,mtek,Flag,0);
   PutSummTime (arg,new_sum_331,14,2);
   cod = 332.00;
   sprintf(arg,"%.2f,%d,%d,%s,%s",cod,mtek,mtek,Flag,0);
   PutSummTime (arg,new_sum_332,14,2);

  }

 if(sum_703)
  {

   double kod_rkv=info.kod;     // код вида Н-У
   char n2[50];
   sprintf(n2,"%s;%s",to_string(sum_331),to_string(sum_332));
   rw_rkv(kod_rkv, n2, 1, 0, 1);


   double sum_432=0.0;
   sum_432= sum_703/(sum_331+sum_332)*sum_332;
   round2(sum_432,0,1,sum_432);

      info.n1=sum_432;
      if(FL_V_ALG && uprc != NO_SCREEN)
      {
         infolist.add_record("НДФЛ 13% (702) ",sum_702);
         infolist.add_record("НДФЛ 15% (703) ",sum_703);
         infolist.add_record("НДФЛ 13% без78 (331) ",sum_331);
         infolist.add_record("НДФЛ 13% для78 (332) ",sum_332);
         infolist.add_record("НДФЛ 15% без78 (432) ",sum_432);
         //infolist.add_record("Результат",info.n1);
      }
  }

  return code_Break;
}



UserAlg952(&info,&r)     // оплата дней на самоизоляции 
{
  int    si  = dney_v_tab("С",calm,info.z1,info.z2);
  double si2 = 0.0;     skoljko(si2,data,info.z1,info.z2,"С",calm,cht);
  double bz4 = 0.;  poiskbz(0,4,0," ",bz4);

  // по 4 виду: оклад по дням если kch_from_int("grafik") == 1; по часам во всех остальных случаях  
  double sum_004=0.0;   poiskbz(0,4,0," ",sum_004);                                           
  sum_004 = sum_004 * si / norm(1);

  // по 5 виду: 
  double sum_005=0.0;   poiskbz(0,15,0," ",sum_005);
  if(sum_005) sum_005 = sum_004 * sum_005 / 100; 

  // по 31 виду: 
  double sum_031=0.0;   poiskbz(0,31,0," ",sum_031);
  if(sum_031) sum_031 = sum_004 * sum_031 / 100; 

  // по 43 виду: 
  double sum_043=0.0;   poiskbz(0,19,0," ",sum_043);
  if(sum_043)  sum_043 = si2 * sum_043 / norm(2);

  // по 45 виду: 
  double sum_045=0.0;   poiskbz(0,24,0," ",sum_045);
  sum_045 = sum_045 * si / norm(1);

  // по 46 виду: 
  double sum_046=0.0;   poiskbz(0,16,0," ",sum_046);
  if(sum_046)  sum_046 = si2 * sum_046 / norm(2);

  // по 53 виду: 
  double sum_053=0.0;   poiskbz(0,36,0," ",sum_053);
  if(sum_053)  sum_053 = si2 * sum_053 / 100;

  // по 64 виду: 
  //double sum_064=0.0;   poiskbz(0,18,0," ",sum_064);
  //if(sum_064)  sum_064 = si2 * sum_064 / norm(2);

  double sum_064=0.0;   double bz64=0.0;
  unsigned char Src64 = GetCommonSrc(CLL_TOTAL_SRC);
  int rowkod64[ROWMAX];
  int cntrow64=poiskosnkod(Extern_To_Intern(atoi(64)),rowkod64,0,Src64); //получ список строк с кодом 64       
  for (int i=0; i<cntrow64; i++)                    
  {
    double ikod=GetCode(rowkod64[i]);  //вн.код вида    //if(poisk_row(ikod,0,data,0))  cod_64=ikod;
    poiskbz(0,ikod,1," ",bz64);
    sum_064 += (si2*bz64/norm(2));
  }





  // по 68 виду: 
  double sum_068=0.0;   poiskbz(0,25,0," ",sum_068);
  if(sum_068) sum_068 = sum_004 * sum_068 / 100; 


  // по 69 виду: 
  double sum_069=0.0; 
  int Cod=69;     //178;
                                                   
  unsigned char Src = GetCommonSrc(CLL_TOTAL_SRC);
  int rowkod[ROWMAX];
  int cntrow=poiskosnkod(Extern_To_Intern(atoi(Cod)),rowkod,0,Src);   //получаем список строк с кодом      

 if(cntrow)  {
   int NumSet = 5;   // номер сетки  
   int vysl   = 1;   // признак начисления выслуги

       // далее проверка на наличие даты
   char  str3[90];  int datv=0;  int kodr=0;  int datr=0; 
   kch_from("datavys",str3);     FreeSpaceString(str3,3,"");
    if( strlen(str3) == 10 )    datv=1;
   kch_from("kod_rab",str3);     FreeSpaceString(str3,3,"");
    if( (atoi(str3) != 4) && (atoi(str3) != 7) && (atoi(str3) != 9) )    kodr=1;
   kch_from("data_rb",str3);     FreeSpaceString(str3,3,"");
    if( strlen(str3) == 10 )    datr=1;

   double n3=0;                      //_________ n3 - % от стажа
   if( (datv == 1) && (kodr == 1) )  {
      procent_ot_staga(NumSet,"datavys",1,0,31,info.crow,info.d1,info.d2,n3);  
   }
   if( (datv == 0) && (kodr == 1) && (datr == 1) )  {                              
      procent_ot_staga(NumSet,"data_rb",1,0,31,info.crow,info.d1,info.d2,n3);  // если не заполн ДатаНачалаВысл
   }

   char str2[9]; char prvt[90]; double vet_vys =1;
    kch_from("uvol",str2);    if ( atoi(str2) == 1 )  vysl =  0;
    kch_from("vet_vys",prvt); if(atoi(prvt) == 1)  vet_vys =1.2;

   if ( sum_068 > 0 ) n3 = 0;   // если есть sum_068  то 69-й не считать

   sum_069= bz4/norm(1) *si *n3/100. *vysl *vet_vys;
 }


  // по 71 виду: 
  double sum_071=0.0;   poiskbz(0,21,0," ",sum_071);
  if(sum_071) sum_071 = sum_004 * sum_071 / 100; 


  // по 78 виду: 
  double sum_078=0.0;   
  double    bz78=0.0;     poiskbz(0,478,0," ",bz78); 
  double pro_t = 0.0;
  double okl   = 0.0;
  double cod_78= 0.0;

  unsigned char Src78 = GetCommonSrc(CLL_TOTAL_SRC);
  int rowkod78[ROWMAX];
  int cntrow78=poiskosnkod(Extern_To_Intern(atoi(78)),rowkod78,0,Src78); //получ список строк с кодом 78       
  for (int i=0; i<cntrow78; i++)                    
  {
    double ikod=GetCode(rowkod78[i]);            //вн.код вида
    if(poisk_row(ikod,0,data,0))  cod_78=ikod;
  }

   char nad_t[256];   
   if(cod_78) {
     StartRkv(cod_78);          //StartRkv(GetCode(info.crow));
       ReadRkv("надб_т",nad_t);   FreeSpaceString(nad_t,3,"");
       if( strlen(nad_t) != 0 ) pro_t=atof(nad_t);    //Процент с окладом из доп рекв.     
     FinishRkv();
    }
   if(pro_t > 0)  {
     okl     = sum_004 / pro_t;
     sum_078 = okl * bz78 / 100;
   }
   else
     sum_078 = sum_004 * bz78 / 100;   


  // по 80 виду: 
  double sum_080=0.0;   poiskbz(0,12,0," ",sum_080);
  if(sum_080)  sum_080 = si2 * sum_080 / norm(2);

  // по 81 виду: 
  double sum_081=0.0;   poiskbz(0,17,0," ",sum_081);
  if(sum_081)  sum_081 = si2 * sum_081 / norm(2);

  // по 82 виду: 
  double sum_082=0.0;   poiskbz(0,148,0," ",sum_082);
  sum_082 = sum_082 * (sum_004+sum_069+sum_071) / 100;        //+sum_038  обсудить
  // по 83 виду: 
  double sum_083=0.0;   poiskbz(0,149,0," ",sum_083);
  sum_083 = sum_083 * (sum_004+sum_069+sum_071) / 100;        //+sum_038  обсудить


  info.n1 = sum_004 + sum_053 + sum_080 +sum_081 +sum_082 +sum_083;
           


      r[2]=si;
      char t[20];
      if((info.c=korrv(r,t,0,info.h,flagrow,jf)) != 1)   return code_ReturnCode;

      if(FL_V_ALG && uprc != NO_SCREEN)
      {
         //infolist.add_record("Дневная ставка ",info.bz);
         infolist.add_record("Рабочих дней по графику - НРВ",norm(1));
         infolist.add_record("Дней самоизоляции",si);
         infolist.add_record("Рабочих часов по графику -НРВ",norm(2));
         infolist.add_record("Часов самоизоляции",si2);
         if(bz4)  infolist.add_record("Оклад по виду   4",bz4);
         if(sum_004)  infolist.add_record("Сумма по виду   4",sum_004);
         if(sum_005)  infolist.add_record("Сумма по виду   5",sum_005);
         if(sum_031)  infolist.add_record("Сумма по виду  31",sum_031);
         if(sum_043)  infolist.add_record("Сумма по виду  43",sum_043);
         if(sum_045)  infolist.add_record("Сумма по виду  45",sum_045);
         if(sum_046)  infolist.add_record("Сумма по виду  46",sum_046);
         if(sum_053)  infolist.add_record("Сумма по виду  53",sum_053);
         if(sum_064)  infolist.add_record("Сумма по виду  64",sum_064);
         if(sum_068)  infolist.add_record("Сумма по виду  68",sum_068);
         if(sum_069)  infolist.add_record("Сумма по виду  69",sum_069);
         if(sum_071)  infolist.add_record("Сумма по виду  71",sum_071);
         if(pro_t)    infolist.add_record("Оклад+надб для 78",pro_t);   
         if(sum_078)  infolist.add_record("Сумма по виду  78",sum_078);
         if(sum_080)  infolist.add_record("Сумма по виду  80",sum_080);
         if(sum_081)  infolist.add_record("Сумма по виду  81",sum_081);
         if(sum_082)  infolist.add_record("Сумма по виду  82",sum_082);
         if(sum_083)  infolist.add_record("Сумма по виду  83",sum_083);

         infolist.add_record("Результат",info.n1);
      }

  return code_Break;
}



UserAlg614(&info,&r)     // компенс за молоко  (парный к UserAlg313)
{
   double kom_mol = 0.0;
   sumvid("*т",313,0,kom_mol);

   info.n1 = -kom_mol;

      if(FL_V_ALG && uprc != NO_SCREEN)
      {
         infolist.add_record("Сумма  по виду 413 ",kom_mol);
         infolist.add_record("Сумма для вида 714",info.n1);
      }

  return code_Break;
}


UserAlg313(&info,&r)     // компенс за молоко (на основе 994 алг)   20200228
{
      int dniR, dniG, dniK, DniOpl;
      dniR = dniG = dniK = DniOpl = 0;
      dniR=dney_v_tab("Р",calm,info.z1,info.z2);
      //dniG=dney_v_tab("Г",calm,info.z1,info.z2);
      //dniK=dney_v_tab("К",calm,info.z1,info.z2);

      DniOpl = dniR + dniG + dniK;

      r[2] = DniOpl;     //   skoljko(r[2],data,info.z1,info.z2,rsimv,calm,cht);

      char t[20];
      if((info.c=korrv(r,t,0,info.h,flagrow,jf)) != 1)
        return code_ReturnCode;

      if(info.bz == 0)  info.bz = 65;

      info.n1=DniOpl*info.bz;
      if(FL_V_ALG && uprc != NO_SCREEN)
      {
         infolist.add_record("Дневная ставка ",info.bz);
         infolist.add_record("Рабочих дней",dniR);
         //infolist.add_record("Гособязанности",dniG);
         //infolist.add_record("Командировки",dniK);
         infolist.add_record("Результат",info.n1);
      }

  return code_Break;
}



UserAlg980(&info,&r)     // совместит (по часам ) для 80-го вида  20191029
{
  worktime(info.crow,info.b3,0);
  int dni = 0;
  int has = 0;
  dni=dney_v_tab(rsimv,calm,info.z1,info.z2);

  skoljko(r[2],data,info.z1,info.z2,rsimv,calm,cht);        
  char t[20];
  if((info.c=korrv(r,t,0,info.h,flagrow,jf)) != 1)
     return code_ReturnCode;
  info.n1=r[2]*info.bz/norm(2);

      if(FL_V_ALG && uprc != NO_SCREEN)
      {
         infolist.add_record("Основной график",knorm);
         infolist.add_record("График вида НУ ",nkalend);
         infolist.add_record("Норма дней ",norm(1));
         infolist.add_record("Норма часов",norm(2));
         infolist.add_record("Рабочие дни ",dni);
         infolist.add_record("Рабочие часы",r[2]);
         infolist.add_record("Оклад",info.bz);
         infolist.add_record("Результат",info.n1);
      }
      return code_Break;
}  
  


UserAlg178(&info,&r)    // Надбавка за тайну для КБМ  20191029  (вместо 15-го алгоритма)
                        //  По 28 стлб ТВх.   78-й вид НУ
{
   char nad_t[256];
   StartRkv(GetCode(info.crow));
     ReadRkv("надб_т",nad_t);   FreeSpaceString(nad_t,3,"");
     double pro_t = 0.0;
     if( strlen(nad_t) != 0 )   pro_t=atof(nad_t);        //Процент с окладом из доп рекв.     
   FinishRkv();

   if(pro_t > 0)
    {
     double okl_nad=0.0;     sumvid("*т",4,0,okl_nad);          // определяем сумму (оклад + надб) по СумВид
     double okl = okl_nad / pro_t;
      
     info.n1 =   okl * (info.bz/100);

     if(FL_V_ALG && uprc != NO_SCREEN)
     {
      infolist.add_record("Сумма_Окл+Надб",okl_nad);
      infolist.add_record("Оклад_без_Надб",okl);
      infolist.add_record("%_Окл+Надб из ДопРекв",pro_t);
      infolist.add_record("%_надбавки из БЗ",info.bz);
      infolist.add_record("Результат",info.n1);
     }
     return code_Break;      //bz4
    }

   else
    {
        //double SmStlb = CashSumm(0, 27, mtek, mtek, 37, CL_COL|CL_MTEK|CL_M , 0);
     double SmStlb =0.0;     s100("нтек",0,27,SmStlb);
     double bz78 = 0.0;   poiskbz(0,478,0," ",bz78);
     info.n1 = SmStlb * bz78 / 100;
   
     if(FL_V_ALG && uprc != NO_SCREEN)
     {
      infolist.add_record("Выборка по 28 стлб",SmStlb);
      infolist.add_record("Процент из БЗ",bz78);
      infolist.add_record("Результат",info.n1);
     }
     return code_Break;
    }
}


UserAlg278(&info,&r)    // Выслуга лет для КБМ  20170302
                        // на основе БЗ 4 вида НУ        //ставки по 27 стлб ТВх
{
   double hours;
    
   int NumSet = 5;   // номер сетки  
   int vysl   = 1;   // признак начисления выслуги
   double bz4 = 0.;

   poiskbz(0,4,0," ",bz4);
   double dniR=dney_v_tab(rsimv,calm,info.z1,info.z2);  // отработано дней

   // далее проверка на наличие даты
   char  str3[90];  int datv=0;  int kodr=0;  int datr=0; 
   kch_from("datavys",str3);     FreeSpaceString(str3,3,"");
    if( strlen(str3) == 10 )    datv=1;
   kch_from("kod_rab",str3);     FreeSpaceString(str3,3,"");
    if( (atoi(str3) != 4) && (atoi(str3) != 7) && (atoi(str3) != 9) )    kodr=1;
   kch_from("data_rb",str3);     FreeSpaceString(str3,3,"");
    if( strlen(str3) == 10 )    datr=1;

   double n3=0;   
   if( (datv == 1) && (kodr == 1) )
   {
      procent_ot_staga(NumSet,"datavys",1,0,31,info.crow,info.d1,info.d2,n3);  // n3 - % от стажа
   }
   if( (datv == 0) && (kodr == 1) && (datr == 1) )                             //  если не заполн ДатаНачалаВысл
   {                              
      procent_ot_staga(NumSet,"data_rb",1,0,31,info.crow,info.d1,info.d2,n3);  // n3 - % от стажа
   }


  // double n3;   
  // procent_ot_staga(NumSet,"datavys",1,0,31,info.crow,info.d1,info.d2,n3);  // n3 - % от стажа

   char str2[9];
   kch_from("uvol",str2);
   int przuv = atoi(str2);
   if ( przuv == 1 )  vysl = 0;

   double bz68=0;              // добавить поиск % в БЗ 68-вида,
   poiskbz(0,25,0," ",bz68);   // и если он есть то 69-й не считать       
   if ( bz68 > 0  ) n3 = 0;

   char prvt[90];
   double vet_vys = 1;
   kch_from("vet_vys",prvt);
   if ( atoi(prvt) == 1 )  vet_vys = 1.2;

   r[2] = dniR;
   info.n1= bz4/norm(1)*dniR*n3/100. *vysl *vet_vys;
   if(FL_V_ALG && uprc != NO_SCREEN)
   {
      infolist.add_record("Признак УволПоСобствЖел",przuv);
      infolist.add_record("Признак расчёта выслуги",vysl);
      infolist.add_record("КоэффУвеличДляВетеранов",vet_vys);
      infolist.add_record("НРВ дни",norm(1));
      infolist.add_record("Дни для выслуги",dniR);
      infolist.add_record("Оклад",bz4);
      infolist.add_record("Процент выслуги",n3);
      infolist.add_record("Результат",info.n1);
   }
   return code_Break;
}





UserAlg995(&info,&r)     // дотация на питание за отработанные дни
                         // с приязкой к видам НУ (35-Г  66-К) 
{
  int dniR, dniG, dniK, DniOpl;
  dniR = dniG = dniK = DniOpl = 0;

  double KodVidaNU=0.;
  int kodNU = 0; int Per_K=0;

  var BegStr = CreateObject("KDate");  // дата начала действия строки   
  var EndStr = CreateObject("KDate");  // дата конца действия строки   

  var MonTek = CreateObject("KDate");   //создаем объекта класса  KDate  
  MonTek.SetDateII(1,mrasch);           //инициализируем объект MonTek первым днем расчетного месяца (mrasch)

  int day_1 = 0;
  int day_2 = 0;

  for ( int i=0; i<countkod; i++ )            // цикл по строкам видов в ЛС
    {
      KodVidaNU = GetCode(i);
      char  KodV[250];   sprintf(KodV,"%s",static_cast_to_string(KodVidaNU));
      kodNU = atoi(KodV);

      double Sum_Kod = 0;  sumvid("=",KodVidaNU,0,Sum_Kod);

      if(kodNU == 37)   // если вид НУ - 35
       {
        double BegD = GetBegDate(i);  BegStr.SetDateD(BegD);                          //int mB=BegStr.GetSysForm();               
        double EndD = GetEndDate(i);  EndStr.SetDateD(EndD);                          //int mE=EndStr.GetSysForm();

        if(( BegStr.LEM(MonTek) ) && ( EndStr.GEM(MonTek) ) && (Sum_Kod != 0) )     // если вид действ в тек месяце
         {
          if( BegStr.IsEqM(MonTek) )  day_1 = BegStr.GetDay();    // если дат_нач действ вида  в тек месяце
           else day_1 = 1;                                        // если дат_нач действ вида  раньше
          if( EndStr.IsEqM(MonTek) )  day_2 = EndStr.GetDay();    // если дат_кон действ вида  в тек месяце
           else day_2 = countday;                                 // если дат_кон действ вида  позже

          dniG += dney_v_tab("Г",calm,day_1,day_2);
         }
       }

      if(kodNU == 10)   // если вид НУ - 66
       {
        double BegD = GetBegDate(i);  BegStr.SetDateD(BegD);                          //int mB=BegStr.GetSysForm();               
        double EndD = GetEndDate(i);  EndStr.SetDateD(EndD);                          //int mE=EndStr.GetSysForm();

        if(( BegStr.LEM(MonTek) ) && ( EndStr.GEM(MonTek) ) && (Sum_Kod != 0) )     // если вид действ в тек месяце
         {
          Per_K = Per_K + 1;
          if( BegStr.IsEqM(MonTek) )  day_1 = BegStr.GetDay();    // если дат_нач действ вида  в тек месяце
           else day_1 = 1;                                        // если дат_нач действ вида  раньше
          if( EndStr.IsEqM(MonTek) )  day_2 = EndStr.GetDay();    // если дат_кон действ вида  в тек месяце
           else day_2 = countday;                                 // если дат_кон действ вида  позже

          dniK += dney_v_tab("К",calm,day_1,day_2);
         }
       }


    }
  
  dniR   = dney_v_tab(rsimv,calm,info.z1,info.z2);
  DniOpl = dniR + dniG + dniK;
  r[2] = DniOpl;
   //   skoljko(r[2],data,info.z1,info.z2,rsimv,calm,cht);
   char t[20];
   if((info.c=korrv(r,t,0,info.h,flagrow,jf)) != 1)
      return code_ReturnCode;

      info.n1=DniOpl*info.bz;
      if(FL_V_ALG && uprc != NO_SCREEN)
      {
         infolist.add_record("Дневная ставка ",info.bz);
         infolist.add_record("Рабочих дней",dniR);
         infolist.add_record("Гособязанности",dniG);
         infolist.add_record("Командировки",dniK);
         infolist.add_record("Per_K",Per_K);
         infolist.add_record("Всего дней опл",DniOpl);
         infolist.add_record("Результат",info.n1);
      }


  return code_Break;
}




UserAlg994(&info,&r)     // дотация на питание за отработанные дни
{
      //worktime(info.crow,info.b3,0);
      //if(nkalend == knorm)
      //   r[2]=dney_v_tab(rsimv,calm,info.z1,info.z2);
      //char t[20];
      //if((info.c=korrv(r,t,0,info.h,flagrow,jf)) != 1)
      //   return code_ReturnCode;

      int dniR, dniG, dniK, DniOpl;
      dniR = dniG = dniK = DniOpl = 0;
      dniR=dney_v_tab(rsimv,calm,info.z1,info.z2);
      dniG=dney_v_tab("Г",calm,info.z1,info.z2);
      dniK=dney_v_tab("К",calm,info.z1,info.z2);

      DniOpl = dniR + dniG + dniK;

      r[2] = DniOpl;
     //   skoljko(r[2],data,info.z1,info.z2,rsimv,calm,cht);
     char t[20];
     if((info.c=korrv(r,t,0,info.h,flagrow,jf)) != 1)
        return code_ReturnCode;

      if(info.bz == 0)  info.bz = 65;

      info.n1=DniOpl*info.bz;
      if(FL_V_ALG && uprc != NO_SCREEN)
      {
         infolist.add_record("Дневная ставка ",info.bz);
         infolist.add_record("Рабочих дней",dniR);
         infolist.add_record("Гособязанности",dniG);
         infolist.add_record("Командировки",dniK);
         infolist.add_record("Результат",info.n1);
      }

  return code_Break;
}



UserAlg938(&info,&r)   //  ежемесячные пособия на детей 
{                     
  double n3=info.bz;           // if (mrasch>mtek) goto mdfault

  if ( info.z1!=0. )
    { 
      r[2]=info.z2-info.z1+1;
      char t[20];
      if((info.c=korrv(r,t,0,info.h,flagrow,jf)) != 1)
                                                     return code_ReturnCode;
                 //if ( (c=korrv(r,t,0,h,flagrow,&jf)) != 1 ) goto return_c; }
    }
  else  r[2]=0.;
 // if (Value_For_Table_Cod(75, info.ikod, data, n3) == EOF) n3=bz;
              /* Таблица 75 в сетках - для месячных дотаций */
  info.n1=r[2]*n3/countday;
  if(FL_V_ALG&&uprc!=NO_SCREEN)
           {
             infolist.add_record("Месячное пособие",n3);
             infolist.add_record("Период для нач. пособия",r[2]);
             infolist.add_record("Календарные дни",countday);
             infolist.add_record("Результат",info.n1);
           }

  return code_MDefault;
}


UserAlg725(&info,&r)
{
   // профс.взносы

   int stolbec = 12;   

   struct Struct_Alg Work;
   Get_AlgWithParam(Work,info.ikod);   // 31.01.1995
   // Work.Count_Par - число паpаметpов для кода алгоpитма
   //-- параметр 1 - столбец таблицы входимости (по умолчанию = 12)
   if(Work.Count_Par > 0)
   {
   var i=atoi(reinterpret_cast_to_string(Work.List_Par[0]));
      if (i > 0 && i <= 99)  stolbec=i;
   }


   //--- выборка начислений за текущий месяц
   double n2;
   toMatrLS();
   
   n2=CollectSumm(stolbec-1,0,mrasch, CL_MV | CL_COL | CL_NACH );                                  

   double r9;
  // s1001("н",info.d1,info.d2,0,ST_PROFS,r9,2);  // 08.11.95
   r9 = n2;


   char str1[9];
   kch_from("pr_souz",str1);
   int pr = atoi(str1);

   if (pr == 1)  info.n1=static_cast_to_long(r9)*0.01;
   if(FL_V_ALG && uprc != NO_SCREEN)
   {
      infolist.add_record("Столбец т/в",ST_PROFS+1);
      infolist.add_record("Выборка",r9);
      infolist.add_record("Процент",1.);
      infolist.add_record("Результат",info.n1);
   }
   return code_MDefault;
}



UserAlg961(&info,&r)    // бригадирские
{
   double okl1=0;
   poiskbz(0,4,0," ",okl1);         // сумма своего оклада 

   info.n1= okl1*info.bz/100;

   if(FL_V_ALG && uprc != NO_SCREEN)
      {
         infolist.add_record("Оклад свой",okl1);
         infolist.add_record("Результат",info.n1);
      }
   
   return code_Break;
}

UserAlg901(&info,&r)  // подсчет РВ для ф-ции s98
{
      worktime(info.crow,info.b3,0);
      if(nkalend == knorm)
         r[2]=dney_v_tab(rsimv,calm,info.z1,info.z2);
      char t[20];
      if((info.c=korrv(r,t,0,info.h,flagrow,jf)) != 1)
         return code_ReturnCode;
      info.n1=r[2]*100/norm(1);

   return code_Break;
}


UserAlg984(&info,&r)        // оплата по-среднему
{
   double  rv_mes[12];
   double  sm_mes[12];
   
   char str1[25];  char str2[25];  char str3[25];  char str4[25];
   char str5[25];  char str6[25];  char str7[25];  char str8[25];
   char str9[25];  char str10[25];  char str11[25];  char str12[25];
   double n1, n2, n3, n4;
   double n5, n6, n7;
   for(int i=1; i<=12; i++)
     {
      n6=0;
      s50(mtek-i);        // активизация -i_го месяца
      s98(0,n6);          // соотношение ФРВ/НРВ
      n7 = n6*norm(1);    // отработанные часы т.е. НРВ
      s73();
      s100("н",0,16,n5);  // выборка по 17 стлб
      rv_mes[i-1] = n7;
      sm_mes[i-1] = n5;
      n1=n1+n5;           //всего СУММА
      n2=n2+n7;           //всего ФРВ
     }

   s50(mtek);
   sprintf(str1,"%s     %s ",static_cast_to_string(rv_mes[0]),static_cast_to_string(sm_mes[0]));
   sprintf(str2,"%s     %s ",static_cast_to_string(rv_mes[1]),static_cast_to_string(sm_mes[1]));
   sprintf(str3,"%s     %s ",static_cast_to_string(rv_mes[2]),static_cast_to_string(sm_mes[2]));
   sprintf(str4,"%s     %s ",static_cast_to_string(rv_mes[3]),static_cast_to_string(sm_mes[3]));
   sprintf(str5,"%s     %s ",static_cast_to_string(rv_mes[4]),static_cast_to_string(sm_mes[4]));
   sprintf(str6,"%s     %s ",static_cast_to_string(rv_mes[5]),static_cast_to_string(sm_mes[5]));
   sprintf(str7,"%s     %s ",static_cast_to_string(rv_mes[6]),static_cast_to_string(sm_mes[6]));
   sprintf(str8,"%s     %s ",static_cast_to_string(rv_mes[7]),static_cast_to_string(sm_mes[7]));
   sprintf(str9,"%s     %s ",static_cast_to_string(rv_mes[8]),static_cast_to_string(sm_mes[8]));
   sprintf(str10,"%s     %s ",static_cast_to_string(rv_mes[9]),static_cast_to_string(sm_mes[9]));
   sprintf(str11,"%s     %s ",static_cast_to_string(rv_mes[10]),static_cast_to_string(sm_mes[10]));
   sprintf(str12,"%s     %s ",static_cast_to_string(rv_mes[11]),static_cast_to_string(sm_mes[11]));

   n3=n1/n2;

   struct Struct_Alg Work;
   Get_AlgWithParam(Work,info.ikod);  
   // Work.Count_Par - число паpаметpов для кода алгоpитма
   //-- параметр 1 - признак вывода диалога для коррекции среднего
   if(Work.Count_Par > 0)
   {
    var i=atoi(reinterpret_cast_to_string(Work.List_Par[0]));
      if( i > 0 ) 
       {
        zaprosd (scr04,windrow+1,0,"Среднее: ",9,n3,n3,0,99999,10);
        zaprosd (scr04,windrow+2,0,"Число дней оплаты: ",7,r[2],r[2],0,999,10);
       }
   }

   char t[20];
   if((info.c=korrv(r,t,0,info.h,flagrow,jf)) != 1)  return code_ReturnCode;       
     
   info.n1= n3*r[2]*info.bz/100;    

   if(FL_V_ALG && uprc != NO_SCREEN)
      {
         infolist.add_record("ФРВ и сумма за 1_мес",str1);
         infolist.add_record("ФРВ и сумма за 2_мес",str2);
         infolist.add_record("ФРВ и сумма за 3_мес",str3);
         infolist.add_record("ФРВ и сумма за 4_мес",str4);
         infolist.add_record("ФРВ и сумма за 5_мес",str5);
         infolist.add_record("ФРВ и сумма за 6_мес",str6);
         infolist.add_record("ФРВ и сумма за 7_мес",str7);
         infolist.add_record("ФРВ и сумма за 8_мес",str8);
         infolist.add_record("ФРВ и сумма за 9_мес",str9);
         infolist.add_record("ФРВ и сумма за 10_мес",str10);
         infolist.add_record("ФРВ и сумма за 11_мес",str11);
         infolist.add_record("ФРВ и сумма за 12_мес",str12);
         infolist.add_record("Среднее",n3);
         infolist.add_record("% оплаты",info.bz);
         infolist.add_record("Дней оплаты по среднему",r[2]);
         infolist.add_record("Всего по среднему",info.n1);

      }

   return code_Break;
}




UserAlg965(&info,&r)    // оплата разности в окладах
                        // в ДопРекв:
                        //  - ТН замещаемого ЛС
                        //  - сумма оклада замещаемого ЛС
{
   double okl1=0, okl2=0, razn_ok;
   poiskbz(0,4,0," ",okl1);         // сумма своего оклада 

   // перед активизацией ТН замещаемого ЛС запоминаем свой ТН
   char str1[9]; 
   kch_from("tn",str1);
   int tn1 = atoi(str1);

   // читаем из ДопРекв ТН замещаемого ЛС и его оклад

   double kod_rkv=info.kod;     // код вида Н-У

   char str_tn2[81],str_okl2[81],str_comm[81];                              
   Rkv_from(kod_rkv,"таб_зам", str_comm,str_tn2);
   int tn2=atoi(str_tn2);
   Rkv_from(kod_rkv,"окл_зам", str_comm,str_okl2);
   okl2=atof(str_okl2);

   char ls1[255], ls2[255];     // буфер для имени ЛС      
//   if ((okl2 <= 0) && (tn2 != 0))
//    {            
      // активизация (чтение) замещаемого ЛС - если в ДопРекв оклада нет
//      lsname(Find_Full_TN(tn2),ls2);
//      lsread(ls2,0); 
//      poiskbz(0,4,0," ",okl2);      // сумма замещаемого оклада 
//    }

   razn_ok = okl2 - okl1;

   r[2]=dney_v_tab(rsimv,calm,info.z1,info.z2);


   char t[20];
   if((info.c=korrv(r,t,0,info.h,flagrow,jf)) != 1)  return code_ReturnCode;       
   info.n1= r[2]*razn_ok/norm(1);

   if(FL_V_ALG && uprc != NO_SCREEN)
      {
         infolist.add_record("ТН 2",tn2);
//         infolist.add_record("ЛС_2",ls2);
         infolist.add_record("Дни оплаты",r[2]);
         infolist.add_record("Оклад свой",okl1);
         infolist.add_record("Оклад замещ",okl2);
         infolist.add_record("Разница в окладах",razn_ok);
         infolist.add_record("Результат",info.n1);
      }
   
   return code_Break;
}



UserAlg985(&info,&r)        // в БЗ % оплаты
{
   // вывести диалог чтобы ввести дату начала оплаты
   // от которой брать БЗ оклада

   double oklad;
   poiskbz(0,4,0," ",oklad);  // сумма оклада из БЗ 4-го вида
  
   r[2] = countday;           // число календ дней в месяце
   char t[20];
   if((info.c=korrv(r,t,0,info.h,flagrow,jf)) != 1)  return code_ReturnCode;
        
   info.n1=oklad/countday*r[2]*info.bz/100;
   if(FL_V_ALG && uprc != NO_SCREEN)
      {
         infolist.add_record("Дни оплаты",r[2]);
         infolist.add_record("Календ дней в мес",countday);
         infolist.add_record("Оклад",oklad);
         infolist.add_record("% оплаты",info.bz);
         infolist.add_record("Результат",info.n1);
      }
   
   return code_Break;
}


UserAlg953(&info,&r)   // ученические на основе 5-го алгоритма
                       // БЗ - тариф в руб, ДопРекв - %оплаты
{
   double kod_rkv=info.kod;

   char str_proc[81],str_comm[81];
                              
   Rkv_from(kod_rkv,"проц_уче", str_comm,str_proc);  // читаем доп.реквизиты
   double proc=atof(str_proc);

   worktime(info.crow,info.b3,0); // заполнение рабоч.дней в табеле
   if(nkalend == knorm)
      //* если строка считается по основному графику ЛС
      skoljko(r[2],data,info.z1,info.z2,rsimv,calm,cht);
   char t[20];
   if((info.c=korrv(r,t,0,info.h,flagrow,jf)) != 1)  return code_ReturnCode;
     
   info.n1 = r[2]*info.bz*proc/100;
   if(FL_V_ALG && uprc != NO_SCREEN)
   {
      infolist.add_record("Рабочее время",r[2]);
      infolist.add_record("Тариф",info.bz);
      infolist.add_record("Результат",info.n1);
      infolist.add_record("Процент выплаты",proc);
   }
   return code_Break;
}


UserAlg978(&info,&r)    // Выслуга лет для КБМ
                        // на основе ставки по 27 стлб ТВх
{
   double hours;
    
   int NumSet = 5; // номер сетки  
   int int_kod= 4; // вид Н-У оклада
   int vysl = 1;   // признак начисления выслуги

   char prvt[90];
   kch_from("vet_vys",prvt);
   int przvet = atoi(prvt);
   if ( przvet == 1 )  NumSet = 9;


  // double dniA=dney_v_tab("А",calm,info.z1,info.z2);
  // double dniN=dney_v_tab("Н",calm,info.z1,info.z2);
   int dni2=dney_v_tab("2",calm,1,countday);  // вместо info.z2 используем
                                                 // countday чтобы в случае увольнения
                                                 // читался символ "2"
   s145(s120(mrasch),1);//сохраняем табель
   int dniA = CountTabelNormCalendDay(mrasch,"А","2",0,hours);
   int dniN = CountTabelNormCalendDay(mrasch,"Н","2",0,hours);

   int cnt  = dney_v_tab("sw",calmras,info.z1,info.z2);   // выходные для справки

   int  nr  = dniA + dni2 + dniN;   // + dniN не рабочих дней в месяце

   char str1[81], str2[9]; 
   double r9;

   kch_from("uvol",str2);
   int przuv = atoi(str2);
   if ( przuv == 1 )  vysl = 0;

   kch_from("data_uv",str1); /* дата увольнения */
   s69(r9,str1,1);   // перевод из строки ДД.ММ.ГГГГ в число ГГГГММ.ДД

   if (r9!=0. && r9<data)
    {
     vysl = 0;    // vwritec(scr02,"Уволен");
    }

   char  str3[90], str31[9];
   int dv=0;
   kch_from("datavys",str3);  // далее проверка на наличие даты
   
   var DVParam = CreateObject("ParamFuncRW");       
   DVParam.IInitial(static_cast_to_string(str3),".",3);   
   sprintf(str31,"%.8s", static_cast_to_string(DVParam.Get(2)));

   dv = atoi(str31);

   double n3;   
   procent_ot_staga(NumSet,"datavys",1,0,31,info.crow,info.d1,info.d2,n3);  // n3 - % от стажа
   if ( dv == 0  ) n3 = 0;

   double bz68=0;              // добавить поиск % в БЗ 68-вида,
   poiskbz(0,25,0," ",bz68);   // и если он есть то 69-й не считать       
   if ( bz68 > 0  ) n3 = 0;
                                           
   r[2] = norm(1) - nr;  // число дней для расчета выслуги
   r[2] = r[2] * vysl;   // если vysl==0 то и РВ=0
   char t[20];
   if((info.c=korrv(r,t,0,info.h,flagrow,jf)) != 1)  return code_ReturnCode;                   

   double n2;
   double n5;
   double okl1=0;
   poiskbz(0,4,0," ",okl1);         // сумма своего оклада 
   n2 = okl1 / norm(1);          // днев став на основе последн БЗ 4-го вида 
  // s97col(26,info.d1,info.d2,n2,n5,1);  // n2 - дневная ставка по 27 стлб

   info.n1= r[2]*n2*n3/100.;
   if(FL_V_ALG && uprc != NO_SCREEN)
   {
      infolist.add_record("ГодДатНачВыс",dv);
      infolist.add_record(" дни2",dni2);
      infolist.add_record("Признак УволПоСобствЖел",przuv);
      infolist.add_record("ДатаУв",str1);
      infolist.add_record("Признак расчёта выслуги",vysl);
      infolist.add_record("НРВ дни",norm(1));
      infolist.add_record("Дни для выслуги",r[2]);
      infolist.add_record("Оклад",okl1);
      infolist.add_record("Ставка",n2);
      infolist.add_record("Процент выслуги",n3);
      infolist.add_record("Результат",info.n1);
      infolist.add_record("Выходные",cnt);
      infolist.add_record("Административные",dniA);
      infolist.add_record("Нерабочие",dniN);
   }
   return code_Break;
}



UserAlg930(&info,&r)    // праздничные
                        // на основе выборки по 26 стлб ТВх
{                       
   double n1, n2, n3, n4;
   poiskbz(0, 4, 0, 0, n1);  //оклад по 4-му виду
   poiskbz(0, 6, 0, 0, n2);  //оклад по 6-му виду
   n3=n1+n2;

   s73();
   s100("н",0,25,n4);   // выборка сумм по 26-му столбцу

   double n5, n6;
   s98(0,n6);           // соотношение ФРВ/НРВ
   n5 = n6*norm(2);     // отработанные часы

   char t[20];                                        //ввод
   if((info.c=korrv(r,t,0,info.h,flagrow,jf)) != 1)   //праздн 
                             return code_ReturnCode;  //часов

   info.n1=2*(n3*r[2]/norm(2))+(n4/n5*r[2]);

   if(FL_V_ALG && uprc != NO_SCREEN)
   {
      infolist.add_record("Празднчные часы",r[2]);
      infolist.add_record("Часы по графику",norm(2));
      infolist.add_record("ФРВ",n5);
      infolist.add_record("Оклад",n3);
      infolist.add_record("Сумма по 26 стлб",n4);
      infolist.add_record("Результат",info.n1);
   }
   return code_Break;
}



UserAlg944(&info,&r)    //льготные часы подросткам (вид 44)
                        // на основе выборки по 26 стлб ТВх
{
   int stolbec = 26;
   double n2;   // для ФРВ в часах
   skoljko(n2,data,info.z1,info.z2,rsimv,calm,cht);  

  // s73();
   double n10;                                       //сумма по видам
   s1001("н",info.d1,info.d2,mtek,stolbec-1,n10,1);  //из стлб 26

   double n5;                 // для суммы оклада из БЗ
   poiskbz(0, 4, 0, 0, n5);   // баз.знач. вида с внутр. кодом 4

   skoljko(r[2],data,info.z1,info.z2,rsimv,calm,cht);
   char t[20];
   if((info.c=korrv(r,t,0,info.h,flagrow,jf)) != 1)  return code_ReturnCode;

   info.n1=(n5*r[2]/norm(2))+(n10/n2*r[2]);

      if(FL_V_ALG && uprc != NO_SCREEN)
      {
         infolist.add_record("Норма часов",norm(2));
         infolist.add_record("Отработано часов",n2);
         infolist.add_record("Льготные часы",r[2]);
         infolist.add_record("Результат",info.n1);
      }
    
  return code_Break;
}


UserAlg914(&info,&r)    // -- д о п л а т а  за сверхур.
{
   // SVV 06.12.05 проценты доплаты за первые 2 часа и 
   // за последующее время параметризованы, за счет этого
   // алгоритм можно использовать как для доплаты
   // за сверх.урочные (0.5 и 1) так и для ОПЛАТЫ
   // сверхурочных (1.5 и 2 соответственно)
   struct Struct_Alg Work;
   Get_AlgWithParam(Work,info.ikod);  // Work.Count_Par - число паpам для кода алг 
   double pr1 = 1.5, pr2 = 2;

   //-- параметр 1 - процент оплаты первых 2 часов
   if (Work.Count_Par>0)
   {
      double i=atof(reinterpret_cast_to_string(Work.List_Par[0]));
      if ( i!=0 )   pr1 = i;
   }
   //-- параметр 2 - процент оплаты остальных часов
   if (Work.Count_Par>1)
   {
      double i=atof(reinterpret_cast_to_string(Work.List_Par[1]));
      if ( i!=0 )   pr2 = i;
   }
 
   r[2]=r[2]-info.h[2];  // учет для случая пересчета
   char t[20];
   indstr(scr04,mrasch,windrow,r,t,1);
   r[2]=r[2]+info.h[2];  // учет для случая пересчета

   double n3=0.,n4=0.; // 4.02.94
   if(uprc != NO_SCREEN)
   {
      flagrow[jf][2]=1;
      zaprosd(
         scr04,windrow+1,0,
         "Сверхурочное РВ за первые 2 часа",
         7,r[2],n3,-500.,500.,0
      );
      zaprosd(
         scr04,windrow+2,0,
         "Сверхурочное РВ за следующие часы",
         7,0.,n4,-500.,500.,0
      );
   }
   //var n5=info.bz; // тариф
   double n5;                 // для суммы оклада из БЗ
   poiskbz(0, 4, 0, 0, n5);   // баз.знач. вида с внутр. кодом 4
   //var n6=pr1; // процент доплаты тарифа за первые 2 часа
   //var n7=pr2; // процент доплаты тарифа за след. часы

   int stolbec = 26;
   double n10;
  // s73();
   s1001("н",info.d1,info.d2,mtek,stolbec-1,n10,1);
   double n11 = n10/norm(2)*(n3+n4);

   info.n1=((n5*n3/norm(2))*pr1)+((n5*n4/norm(2))*pr2)+n11;
   //info.n1=n5*(n3*n6+n4*n7)/100.;
   r[2]=n3+n4;
   if(FL_V_ALG && uprc != NO_SCREEN)
   {
      infolist.add_record("Тариф",n5);
      infolist.add_record("Коэффиц. за перв. 2 часа",pr1);
      infolist.add_record("Время за первые 2 часа",n3);
      infolist.add_record("Коэффиц. за след. часы",pr2);
      infolist.add_record("Время за след. часа",n4);
      infolist.add_record("Результат",info.n1);
   }
   return code_MDefault;
}


UserAlg904(&info,&r)     // оклад по дням если код_кат = 1
                         // по часам во всех остальных случаях
{
  int kk=kch_from_int("grafik");
  //int kk=kch_from_int("kat");
  if ( kk == 1 )                         // if ( kk == 1 )
    {
      worktime(info.crow,info.b3,0);
      if(nkalend == knorm)
         r[2]=dney_v_tab(rsimv,calm,info.z1,info.z2);
      char t[20];
      if((info.c=korrv(r,t,0,info.h,flagrow,jf)) != 1)
         return code_ReturnCode;
      info.n1=r[2]*info.bz/norm(1);
      if(FL_V_ALG && uprc != NO_SCREEN)
      {
         infolist.add_record("Код категегории ",kk);
         infolist.add_record("Рабочее время",r[2]);
         infolist.add_record("Норма дней",norm(1));
         infolist.add_record("Оклад",info.bz);
         infolist.add_record("Результат",info.n1);
      }
    }

  if ( kk > 1 )                        // if ( kk > 1 )
    {
      worktime(info.crow,info.b3,0);
      if(nkalend == knorm)
         //* если строка считается по основному графику ЛС
         skoljko(r[2],data,info.z1,info.z2,rsimv,calm,cht);
      char t[20];
      if((info.c=korrv(r,t,0,info.h,flagrow,jf)) != 1)
         return code_ReturnCode;
      info.n1=r[2]*info.bz/norm(2);
      if(FL_V_ALG && uprc != NO_SCREEN)
      {
         infolist.add_record("Код категегории ",kk);
         infolist.add_record("Рабочее время",r[2]);
         infolist.add_record("Норма часов",norm(2));
         infolist.add_record("Оклад",info.bz);
         infolist.add_record("Результат",info.n1);
      }   
    }

  return code_Break;
}



UserAlg922_923(&info,&r)    // выходные
                            // на основе выборки по 26 стлб ТВх
{
   double n1, n2, n3, n4;
   poiskbz(0, 4, 0, 0, n1);  //оклад по 4-му виду
   poiskbz(0, 6, 0, 0, n2);  //оклад по 6-му виду
   n3=n1+n2;

   s73();
   s100("н",0,25,n4);   // выборка сумм по 26-му столбцу

   char t[20];                                        //ввод
   if((info.c=korrv(r,t,0,info.h,flagrow,jf)) != 1)   //выходных 
                             return code_ReturnCode;  //часов

   info.n1=2*(n3*r[2]/norm(2))+n4/norm(2)*r[2];

   if ( info.kod_alg == 923 )
          info.n1=(n3*r[2]/norm(2))+n4/norm(2)*r[2];

   if(FL_V_ALG && uprc != NO_SCREEN)
   {
      infolist.add_record("Выходные часы",r[2]);
      infolist.add_record("Часы по графику",norm(2));
      infolist.add_record("Оклад",n3);
      infolist.add_record("Сумма по 26 стлб",n4);
      infolist.add_record("Результат",info.n1);
   }
   return code_Break;
}



UserAlg4(&info,&r)
{
  return SysAlg4(info,r);
}

UserAlg915(&info,&r)
{
   // СУММА=БЗ
   if(info.n1 == 0.)
      info.n1=info.bz;

   return code_MDefault;
}


UserAlg918(&info,&r)   // алименты по по мес начисл
{
   int stolbec = 9;   

   //--- выборка начислений за текущий месяц
   double n2;
   toMatrLS();
   
   n2=CollectSumm(stolbec-1,0,mrasch, CL_MV | CL_COL | CL_NACH );  // s1001simv("1","н",info.d1,info.d2,0,ST_ALIMENT,info.n1,2,0);  // 08.11.95                                
   
   //--- выборка удержаний за текущий месяц
   double n3;
   n3 = CollectSumm(stolbec-1,0,mrasch, CL_MV | CL_COL | CL_UD);   // s1001simv("1","у",info.d1,info.d2,0,ST_ALIMENT,n3,2,0);

   //--- выборка удержаний за прошлый месяц, если они назначены
   double n4=0;    //  s1001simv("2","у",info.d1,info.d2,-1,ST_ALIMENT,n4,2,0);

                   //int z1, z2;   s6400(info.d1,info.d2,z1,z2,data);
   double k_nep;

   int mes = 0;    //double MesTek1 =  GetDateFromFuncRWScript(mes);   - не учит прошлый месяц, если перешли   20150330

   char M_T_1[90];                                                                          // 20150330
   sprintf(M_T_1,"%i.01",atoi(data));                                                       // 20150330
   double MesTek1 = static_cast_to_double(M_T_1);                                           // 20150330

   char M_T_2[90];
   sprintf(M_T_2,"%i.%i",atoi(data),atoi(countday));
   double MesTek2 = static_cast_to_double(M_T_2);

   double zz1=info.d1; if(atoi(info.d1) < atoi(MesTek1))  zz1=MesTek1;
   double zz2=info.d2; if(atoi(info.d2) > atoi(MesTek2))  zz2=MesTek2;

   nepoln(zz1,zz2,MesTek1,MesTek2,k_nep,1);


   // читаем из ДопРекв 707_вида  ЛС_получателя_алим
   double kod_rkv=info.kod;     // код вида Н-У
   char str_ls_707[90], str_comm[90];                              
   Rkv_from(kod_rkv,"лиц_счет", str_comm, str_ls_707);
   int ls_707=atoi(str_ls_707);


   char str_ls_708[90];
   double s708 = 0.0;                       
   //sumvid("*m",608,0,s708);  

   // ищем 708_вид для вычитания суммы
   int Kod, KodVidaNU;  KodVidaNU = 999;
   for ( int i=0; i<countkod; i++ )            // цикл по строкам видов в ЛС
    {
     Kod = GetIntegerCode(i);    //  KodVidaNU=GetCode(i);
     if( Kod == 608 )            // KodVidaNU = Kod;
      {
       Rkv_from(GetCode(i),"лиц_счет", str_comm, str_ls_708);
       int ls_708=atoi(str_ls_708);
       if( ls_708 == ls_707 )   sumvid("=т",GetCode(i),0,s708);
      }
    }


   double t_nu=n2-n3-n4;
   double res1 = t_nu*info.bz/100.;
   
   info.n1=res1*k_nep - s708;         //info.n1=res1*k_nep;

   if(FL_V_ALG && uprc != NO_SCREEN)
   {
      infolist.add_record("Начисления",n2);
      infolist.add_record("Удержания",n3);
      infolist.add_record("Столбец Т/В",stolbec);
      infolist.add_record("Начисл. - Удержержано",t_nu);
      infolist.add_record("Проц. алиментов",info.bz);
      infolist.add_record("ПромежутРезультат",res1);

      infolist.add_record("Дат_нач",info.d1);
      infolist.add_record("Дат_кон",info.d2);
      //infolist.add_record("Зед_1",z1);
      //infolist.add_record("Зед_2",z2);
      infolist.add_record("Неполн",k_nep);
      infolist.add_record("ДатТек1",MesTek1);
      infolist.add_record("ДатТек2",MesTek2);
      infolist.add_record("Сумма по 708 виду",s708);
      infolist.add_record("ls_707",ls_707);
      infolist.add_record("ИтоговыйРезультат",info.n1);
   }
   var simv=poiskprch(info.ikod);
   if(simv == 4)
   {
   char str[81];
   char str1[81];
      Rkv_from(GetCode(info.crow),"долг",str1,str);
      // Долг по алиментам уменьшается при переходе
      // в новый месяц на сумму, вычисленную ниже
   var r9=atof(str);
      if(r9 && r9 < info.n1)
      {
      // Долг по алиментам ведется и
      // долг по алиментам  < суммы алиментов
      char str1[80];
            sprintf(str1,"Долг по алиментам %-8.2f",r9);
            if(uprc != NO_SCREEN)
            vwriteat(scr04,windrow+1,0,str1);
            info.n1=r9;
      }
   }
   return code_Break;
}


UserAlg608(&info,&r)   // алименты по по мес начисл
{
   int stolbec = 9;   

   //--- выборка начислений за текущий месяц
   double n2;
   toMatrLS();
   
   n2=CollectSumm(stolbec-1,0,mrasch, CL_MV | CL_COL | CL_NACH );                                  

   // s1001simv("1","н",info.d1,info.d2,0,ST_ALIMENT,info.n1,2,0);  // 08.11.95
   //--- выборка удержаний за текущий месяц
   double n3;
   n3 = CollectSumm(stolbec-1,0,mrasch, CL_MV | CL_COL | CL_UD);
   // s1001simv("1","у",info.d1,info.d2,0,ST_ALIMENT,n3,2,0);
   //--- выборка удержаний за прошлый месяц, если они назначены
   double n4=0;
 //  s1001simv("2","у",info.d1,info.d2,-1,ST_ALIMENT,n4,2,0);

   //int z1, z2;   s6400(info.d1,info.d2,z1,z2,data);
   double k_nep;

   int mes = 0;
   //double MesTek1 =  GetDateFromFuncRWScript(mes);   - не учит прошлый месяц, если перешли   20150330

   char M_T_1[90];                                                                          // 20150330
   sprintf(M_T_1,"%i.01",atoi(data));                                                       // 20150330
   double MesTek1 = static_cast_to_double(M_T_1);                                           // 20150330

   char M_T_2[90];
   sprintf(M_T_2,"%i.%i",atoi(data),atoi(countday));
   double MesTek2 = static_cast_to_double(M_T_2);

   double zz1=info.d1; if(atoi(info.d1) < atoi(MesTek1))  zz1=MesTek1;
   double zz2=info.d2; if(atoi(info.d2) > atoi(MesTek2))  zz2=MesTek2;

   nepoln(zz1,zz2,MesTek1,MesTek2,k_nep,1);

  // double s708 = 0.0;                       
  // sumvid("*m",608,0,s708);  


   double t_nu=n2-n3-n4;
   double res1 = t_nu*info.bz/100.;
   
   info.n1=res1*k_nep;

   if(FL_V_ALG && uprc != NO_SCREEN)
   {
      infolist.add_record("Начисления",n2);
      infolist.add_record("Удержания",n3);
      infolist.add_record("Столбец Т/В",stolbec);
      infolist.add_record("Начисл. - Удержержано",t_nu);
      infolist.add_record("Проц. алиментов",info.bz);
      infolist.add_record("ПромежутРезультат",res1);

      infolist.add_record("Дат_нач",info.d1);
      infolist.add_record("Дат_кон",info.d2);
      //infolist.add_record("Зед_1",z1);
      //infolist.add_record("Зед_2",z2);
      infolist.add_record("Неполн",k_nep);
      infolist.add_record("ДатТек1",MesTek1);
      infolist.add_record("ДатТек2",MesTek2);
      infolist.add_record("ИтоговыйРезультат",info.n1);
   }
   var simv=poiskprch(info.ikod);
   if(simv == 4)
   {
   char str[81];
   char str1[81];
      Rkv_from(GetCode(info.crow),"долг",str1,str);
      // Долг по алиментам уменьшается при переходе
      // в новый месяц на сумму, вычисленную ниже
   var r9=atof(str);
      if(r9 && r9 < info.n1)
      {
      // Долг по алиментам ведется и
      // долг по алиментам  < суммы алиментов
      char str1[80];
            sprintf(str1,"Долг по алиментам %-8.2f",r9);
            if(uprc != NO_SCREEN)
            vwriteat(scr04,windrow+1,0,str1);
            info.n1=r9;
      }
   }
   return code_Break;
}



UserAlg712(&info,&r)
{
   struct Struct_Alg Work;
   var mes1=0;
   var mes2=0;
   var stolbec=ST_MPREM+1;

   // символы для выборки
   // по умолчанию - по всем ненулевым
   char StrSimv[51];
   sprintf(StrSimv,"*");
   Get_AlgWithParam(Work,info.ikod);   // 31.01.1995
   // Work.Count_Par - число паpаметpов для кода алгоpитма
   //-- параметр 1 - столбец таблицы входимости
   if(Work.Count_Par > 0)
   {
      var i=atoi(reinterpret_cast_to_string(Work.List_Par[0]));
      if( i > 0 && i <= 99 ) stolbec=i;
   }

   //-- параметр 2 - месяц начала выборки (относительно расчетного)
   //   (по умолчанию берется за один текущий месяц)
   if(Work.Count_Par > 1)
   {
      var i=atoi(reinterpret_cast_to_string(Work.List_Par[1]));
      if( i >= (- PMES) && i <= BMES )  mes1=mes2=i;
   }

   //-- параметр 3 - месяц конца выборки (относительно расчетного)
   //   (по умолчанию берется за один месяц, указанный параметром 2)
   if(Work.Count_Par > 2)
   {
      var i=atoi(reinterpret_cast_to_string(Work.List_Par[2]));
      if( i >= mes1 && i <= BMES ) mes2=i;
   }

   //-- параметр 4 - символы выборки
   if(Work.Count_Par > 3)
      sprintf(StrSimv,"%.50s",reinterpret_cast_to_string(Work.List_Par[3]));

   var   n5=0.;
   for(var m=mes1; m<=mes2; m++)
   {
      double r9;
      s1001simv(StrSimv,"*",info.d1,info.d2,m,stolbec-1,r9,4,0);
      n5+=r9;
   }


   // Заполним таблицу уже найденными значениями
   if(FL_V_ALG && uprc != NO_SCREEN)
   {
      infolist.add_record("Месяц начала выборки",mes1);
      infolist.add_record("Месяц окончания выборки",mes2);
      infolist.add_record("Столбец выборки",stolbec);
      infolist.add_record("Символы выборки",StrSimv);
      infolist.add_record("Сумма выборки",n5);
   }

   // А теперь пройдемся по полю кадровой части "procPREM"
   // И возьмем оттуда все значения процентов, действовавшие
   // в рассчитываемом месяце
   info.n1=0.;  // обнулили итоговую сумму

   // Дата конца действия очередного значения процента
   // В самом начале она равна последнему дню месяца.
   var DateEnd = CreateObject("KDate");
   DateEnd.SetDateII(countday,mrasch);

   // Найдем дату начала действия очередного значения процента
   char StrD[21];
   GetKchDate("procPREM",StrD,10,DateEnd);
   var Date=CreateObject("KDate");
   Date.SetDate(static_cast_to_string(StrD));
   // Если вдруг дата начала пустая или выходит за рамки расчетного
   // месяца, то установим ее равной первому числу расчетного месяца
   if ( Date.IsEqI(INVALID_DATE_VALUE) || Date.GetAbs()<mrasch )
   {
      Date.SetDateII(1,mrasch);
      sprintf(StrD,"%02d.%02d.%4d",Date.GetDay(),Date.GetMonth(),Date.GetYear());
   }

   // Ну и просматриваем все значения процентов, действовавшие в
   // рассматриваемом месяце
   char StrProc[21];
   while ( 1 )
   {
      // находим очередное значение процента
      double Proc=atof(GetKchValue("procPREM",StrProc,20,DateEnd));

      // определяем коэффициент неполноты для очередного значения процента
      // (неполнота по нормативным дням)
      double KoefNepoln = 1.;
      nepoln(Date.GetDouble(),DateEnd.GetDouble(),info.d1,info.d2,KoefNepoln,2);

      // записываем, если надо, в таблицу найденные значения
      if(FL_V_ALG && uprc != NO_SCREEN)
      {
         infolist.add_record("------------------------","---------------------");
         infolist.add_record("Начало действия процента",StrD);
         sprintf(StrD,"%02d.%02d.%4d",DateEnd.GetDay(),DateEnd.GetMonth(),DateEnd.GetYear());
         infolist.add_record("Конец  действия процента",StrD);
         infolist.add_record("Коэффициент",KoefNepoln);
         infolist.add_record("Процент",Proc);
      }

      // Увеличиваем итоговую сумму на очередную порцию премии
      info.n1 += n5*Proc*KoefNepoln/100.;

      // Устанавливаем дату конца очередного значения процента
      // равной дате начала уже рассмотренного значения минус один день.
      DateEnd.SetDateD(Date.GetDouble());
      DateEnd.Dec();

      // Если дата конца вышла за пределы расчетного месяца - выходим
      if ( DateEnd.IsEqI(INVALID_DATE_VALUE) || DateEnd.GetAbs()<mrasch )
         break;

      // Находим дату начала для очередного значения премии
      GetKchDateP("procPREM",StrD,10,Date);
      Date.SetDate(static_cast_to_string(StrD));
      // Если вдруг дата начала пустая или выходит за рамки расчетного
      // месяца, то установим ее равной первому числу расчетного месяца
      if ( Date.IsEqI(INVALID_DATE_VALUE) || Date.GetAbs()<mrasch )
      {
         Date.SetDateII(1,mrasch);
         sprintf(StrD,"%02d.%02d.%4d",Date.GetDay(),Date.GetMonth(),Date.GetYear());
      }
   }

   // выводим в таблицу окончаительный результат
   if(FL_V_ALG && uprc != NO_SCREEN)
   {
      infolist.add_record("------------------------","---------------------");
      infolist.add_record("Результат",info.n1);
   }
   return code_MDefault;
}
