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 178:  // Выслуга лет  // 17.04.97 (33 столбец)
//       //  procent_ot_staga(78,"",1,0,1,crow,d1,d2,n3);
//           procent_ot_staga(78,"datavys",1,0,31,crow,d1,d2,n3);
//              // n3 - % от стажа
//           s98(0,n6);
//           r[2]=norm(1); // r[2] - отработанных дней
//           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) break;
//       //  s97(d1,d2,n2,n5,1);  // n2 - дневная ставка
//           s100("н",0,32,n2);
//       //  n1=r[2]*n2*n3/100.;
//           n1=n2*n3/100.;
//           break;

case 51:   /* оклад */
           worktime(crow,b3,0); /* заполнение рабоч.дней в табеле */
           if (nkalend==knorm)
              /* если строка считается по основному графику ЛС */
              r[2]=dney_v_tab(rsimv,calm,z1,z2);
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           n1=r[2]*bz/norm(1);
           /* bz - базовое значение по строке вида Н-У */
           break;

case 120:   /* оклад */
       //    worktime(crow,b3,0); /* заполнение рабоч.дней в табеле */
       //    if (nkalend==knorm)
              /* если строка считается по основному графику ЛС */
        //      r[2]=dney_v_tab(rsimv,calm,z1,z2);
          sumvid("*",6.,0,n3);
          rvvid("*",6.,0,n4);
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           n1=n3/n4*r[2]*bz/100.;
           /* bz - базовое значение по строке вида Н-У */
           break;


case 122:   /* оклад */
           worktime(crow,b3,0); /* заполнение рабоч.дней в табеле */
           if (nkalend==knorm)
              /* если строка считается по основному графику ЛС */
              r[2]=dney_v_tab(rsimv,calm,z1,z2);
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           n1=(r[2]*bz/norm(1))*30/100.;
           /* bz - базовое значение по строке вида Н-У */
           break;


case 123:   /* оклад */
           worktime(crow,b3,0); /* заполнение рабоч.дней в табеле */
           if (nkalend==knorm)
              /* если строка считается по основному графику ЛС */
              r[2]=dney_v_tab(rsimv,calm,z1,z2);
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           n1=(r[2]*bz/norm(1))*15/100.;
           /* bz - базовое значение по строке вида Н-У */
           break;

case 124:   /* оклад */
           worktime(crow,b3,0); /* заполнение рабоч.дней в табеле */
           if (nkalend==knorm)
              /* если строка считается по основному графику ЛС */
              r[2]=dney_v_tab(rsimv,calm,z1,z2);
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           n1=(r[2]*bz/norm(1))*25/100.;
           /* bz - базовое значение по строке вида Н-У */
           break;

case 134:   /* оклад */
           worktime(crow,b3,0); /* заполнение рабоч.дней в табеле */
           if (nkalend==knorm)
              /* если строка считается по основному графику ЛС */
              r[2]=dney_v_tab(rsimv,calm,z1,z2);
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           n1=(r[2]*bz/norm(1))*70/100.;
           /* bz - базовое значение по строке вида Н-У */
           break;

case 137:   /* оклад */
           worktime(crow,b3,0); /* заполнение рабоч.дней в табеле */
           if (nkalend==knorm)
              /* если строка считается по основному графику ЛС */
              r[2]=dney_v_tab(rsimv,calm,z1,z2);
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           n1=(r[2]*bz/norm(1))*75/100.;
           /* bz - базовое значение по строке вида Н-У */
           break;


case 157:   /* оклад */
           worktime(crow,b3,0); /* заполнение рабоч.дней в табеле */
           if (nkalend==knorm)
              /* если строка считается по основному графику ЛС */
              r[2]=dney_v_tab(rsimv,calm,z1,z2);
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           n1=(r[2]*bz/norm(1))*40/100.;
           /* bz - базовое значение по строке вида Н-У */
           break;


case 9:    /* оклад */
           worktime(crow,b3,0); /* заполнение рабоч.дней в табеле */
         
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           n1=r[2]*bz/norm(2);
           /* bz - базовое значение по строке вида Н-У */
           break;

case 125:   /* праздничные */
        //  worktime(crow,b3,0); /* заполнение рабоч.дней в табеле */
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           n1=r[2]*bz/norm(1);
           /* bz - базовое значение по строке вида Н-У */
           break;


case 14:   /* -- д о п л а т а  за сверхур. */
           /* БЗ - тариф доплаты */
           r[2]=r[2]-h[2];  // учет для случая пересчета
           indstr(scr04,mrasch,windrow,r,t,1);
           r[2]=r[2]+h[2];  // учет для случая пересчета
//           if (mmimo==1) goto mdfault;
//           if (uprc!=NO_SCREEN) flagrow1[jf1]=crow;
           n3=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);
              }
 //          worktime(crow,b3,0); /* заполнение рабоч.дней в табеле */
          /* если строка считается по основному графику ЛС */
 //          if ( (c=korrv(r,t,0,h,flagrow,&jf)) != 1 ) return(c);
           s96(d1,d2,n2,1);    /* часовые */
           n6=1.5; /* процент доплаты тарифа за первые 2 часа */
           n7=2 ; /* процент доплаты тарифа за след. часы */
           n1 = n2 * ( n3*n6 + n4*n7 );
           r[2]=n3+n4;
           break;


case 299:    /* часовая */
           worktime(crow,b3,0); /* заполнение рабоч.дней в табеле */
         
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           n1=r[2]*bz/norm(1);
           /* bz - базовое значение по строке вида Н-У */
           break;

case 5:    /* почасовая тарифная оплата, БЗ - тариф в коп. */
case 192:  /* почасовая тарифная оплата, БЗ - тариф в руб. */
           worktime(crow,b3,0); /* заполнение рабоч.дней в табеле */
           if ( r[2]==0.)
              { if (nkalend==knorm)
                   /* если строка считается по основному графику ЛС */
                   skoljko(r[2],data,z1,z2,rsimv,calm,cht); }
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           if (kod_alg==192)  n1=r[2]*bz;
           else  n1=r[2]*bz/100.;
           break;

case 6:    /* часовая оплата по окладу */
           worktime(crow,b3,0);

           r[2]=r[2]+h[2];  /* учет для случая пересчета */        
             if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);   
  
           n1=r[2]*bz/norm(2);
           break;
case 2: case 109:   /* замена окладу; аттестация */
            s97(d1,d2,n2,k,1);
           worktime(crow,b3,0);

                   /* если строка считается по основному графику ЛС */
           r[2]=r[2]+h[2];  /* учет для случая пересчета */        
             if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);   
                /*   skoljko(&r[2],data,z1,z2,rsimv,calm,cht); }
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);  */
           n1=n2*norm(1)*r[2]/bz;
           break;
/*
case 12:   /* процентная премия за месяц; БЗ-базовый процент */
           {
       struct Struct_Alg Work;
              int mes1=0,mes2=0,stolbec=ST_MPREM+1;
              Get_AlgWithParam(Work,ikod);   // 31.01.1995
              // Work.Count_Par - число паpаметpов для кода алгоpитма
              //-- параметр 1 - столбец таблицы входимости (по умолчанию = 2)
              if (Work.Count_Par>0)
                 { i=atoi(Work.List_Par[0]);
                   if (i>0 && i<=99) stolbec=i; }
              //-- параметр 2 - месяц начала выборки (относительно расчетного)
              //   (по умолчанию берется за один текущий месяц)
              if (Work.Count_Par>1)
                 { i=atoi(Work.List_Par[1]);
                   if (i>=(-PMES) && i<=BMES) mes1=mes2=i; }
              //-- параметр 3 - месяц конца выборки (относительно расчетного)
              //   (по умолчанию берется за один месяц, указанный параметром 2)
              if (Work.Count_Par>2)
                 { i=atoi(Work.List_Par[2]);
                   if (i>=mes1 && i<=BMES) mes2=i; }
              n5=0.;
              for(m=mes1;m<=mes2;m++)
                 { s1001("*",d1,d2,m,stolbec-1,r9,4); n5+=r9; }  // 08.11.95

              if (r[2]==0.)  r[2]=bz; // 17.04.95
              if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) break;
              n1=n5*r[2]/100.;
           }
           break;*/
case 22:   /* пeрcональная надбавка */
           /* при изменениях измените и в s100ras() */
       
              s100("н",0,12,n1);
           if ( r[2]==0. && mrasch<=mtek ) r[2]=bz;
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           n1=n1*r[2]/100.;
           break;        
case 16:   /* подушная оплата */
           /* при изменениях измените и в s100ras() */
                    s100("н",0,0,n1);
           if ( r[2]==0. && mrasch<=mtek ) r[2]=bz;
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           n1=n1*r[2]/100.;
           break;        
case 140:   /* процентная премия за месяц ИЗ 25% фонда для МОП */
           /* при изменениях измените и в s100ras() */
              s100("н",0,0,n1);
           if ( r[2]==0. && mrasch<=mtek ) r[2]=bz;
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           n1=n1*r[2]/100.;
           break;

case 146: /* стимулиpующий фонд*/
          /*БЗ- пpоцент*/   
           s97(d1,d2,n5,n3,1);
           worktime(crow,b3,0); /* заполнение рабоч.дней в табеле */
           if (nkalend==knorm)
              /* если строка считается по основному графику ЛС */
              r[2]=dney_v_tab(rsimv,calm,z1,z2);
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           n1=r[2]*bz/100*n5;
           break;
                   
case 20:   /* провер */
           /* при изменениях измените и в s100ras() */
      

         /* при изменениях измените и в s100ras() */
            s97(d1,d2,n2,k,1); /* дневные */

           worktime(crow,b3,0); /* заполнение рабоч.дней в табеле */
           if (nkalend==knorm)
              /* если строка считается по основному графику ЛС */
              r[2]=dney_v_tab(rsimv,calm,z1,z2);                 
             /* учет для случая пересчета */        
             if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);    
           /* БЗ - тариф доплаты */            
                      indstr(scr04,mrasch,windrow,r,t,1);
//           if (mmimo==1) break;
           flagrow1[jf1]=crow;
           flagrow[jf][2]=1;
           ifraznicu(h);
           if ( uprc!=NO_SCREEN )
              { zaprosd(scr04,windrow+1,0,
                  "ОТРАБОТАННЫЕ ДНИ МЕСЯЦА",7,r[2],n3,-1500.,1500.,0);
                zaprosd(scr04,windrow+2,0,
                  "ОТРАБОТАННЫЕ ЧАСЫ НЕДЕЛИ",7,0.,n4,-500.,500.,0);
              }
           ubrraznicu(h);
     
           n1=n2/18; /* тариф */
           r[2]=n3;
           n1=n1*n4*r[2]*bz/100;
           break;

case 29:   /* обучение на дому*/
           /* при изменениях измените и в s100ras() */
    

         /* при изменениях измените и в s100ras() */

            s97(d1,d2,n2,k,1); /* дневные */
     
           worktime(crow,b3,0); /* заполнение рабоч.дней в табеле */
           if (nkalend==knorm)
              /* если строка считается по основному графику ЛС */
              r[2]=dney_v_tab(rsimv,calm,z1,z2);                 
             /* учет для случая пересчета */        
             if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);    
           /* БЗ - тариф доплаты */            
                      indstr(scr04,mrasch,windrow,r,t,1);
//           if (mmimo==1) break;
           flagrow1[jf1]=crow;
           flagrow[jf][2]=1;
           ifraznicu(h);
           if ( uprc!=NO_SCREEN )
              { zaprosd(scr04,windrow+1,0,
                  "ОТРАБОТАННЫЕ ДНИ МЕСЯЦА",7,r[2],n3,-1500.,1500.,0);
                zaprosd(scr04,windrow+2,0,
                  "ОТРАБОТАННЫЕ ЧАСЫ НЕДЕЛИ",7,0.,n4,-500.,500.,0);
              }
           ubrraznicu(h);
     
           n2=bz/(norm(1)*18); /* тариф */
           r[2]=n3;
           n1=n2*n4*r[2]*0.20;
           break;

     
case 21:   /* вpедность*/
           /* при изменениях измените и в s100ras() */
       

         /* при изменениях измените и в s100ras() */

            s97(d1,d2,n2,k,1); /* дневные */
     
           worktime(crow,b3,0); /* заполнение рабоч.дней в табеле */
           if (nkalend==knorm)
              /* если строка считается по основному графику ЛС */
              r[2]=dney_v_tab(rsimv,calm,z1,z2);                 
             /* учет для случая пересчета */        
             if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);    
           /* БЗ - тариф доплаты */            
                      indstr(scr04,mrasch,windrow,r,t,1);
//           if (mmimo==1) break;
           flagrow1[jf1]=crow;
           flagrow[jf][2]=1;
           ifraznicu(h);
           if ( uprc!=NO_SCREEN )
              { zaprosd(scr04,windrow+1,0,
                  "ОТРАБОТАННЫЕ ДНИ МЕСЯЦА",7,r[2],n3,-1500.,1500.,0);
                zaprosd(scr04,windrow+2,0,
                  "ОТРАБОТАННЫЕ ЧАСЫ НЕДЕЛИ",7,0.,n4,-500.,500.,0);
              }
           ubrraznicu(h);
   
           n1=n2/18; /* тариф */
           r[2]=n3;
           n1=n1*n4*r[2]*bz/100;
           break;
 
case 4:   /* оклад неделя 18 часов */
         /* при изменениях измените и в s100ras() */

           worktime(crow,b3,0); /* заполнение рабоч.дней в табеле */
           if (nkalend==knorm)
              /* если строка считается по основному графику ЛС */
              r[2]=dney_v_tab(rsimv,calm,z1,z2);                 
             /* учет для случая пересчета */        
             if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);    
           /* БЗ - тариф доплаты */            
                      indstr(scr04,mrasch,windrow,r,t,1);
//         if (mmimo==1) break;
//           flagrow1[jf1]=crow;
           flagrow[jf][2]=1;
           ifraznicu(h);
           if ( uprc!=NO_SCREEN )
              { zaprosd(scr04,windrow+1,0,
                  "ОТРАБОТАННЫЕ ДНИ МЕСЯЦА",7,r[2],n3,-1500.,1500.,0);
                zaprosd(scr04,windrow+2,0,
                  "ОТРАБОТАННЫЕ ЧАСЫ НЕДЕЛИ",7,0.,n4,-500.,500.,0);
              }
           ubrraznicu(h);

           n2=bz/(norm(1)*18); /* тариф */
           r[2]=n4;
           n1=n2*n4*n3;
           break;
case 30:   /* внеклассная работа */
         /* при изменениях измените и в s100ras() */


           worktime(crow,b3,0); /* заполнение рабоч.дней в табеле */
           if (nkalend==knorm)
              /* если строка считается по основному графику ЛС */
              r[2]=dney_v_tab(rsimv,calm,z1,z2);   
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           /* БЗ - тариф доплаты */            
                      indstr(scr04,mrasch,windrow,r,t,1);
//           if (mmimo==1) break;
           flagrow1[jf1]=crow;
           flagrow[jf][2]=1;
           ifraznicu(h);
           if ( uprc!=NO_SCREEN )
              { zaprosd(scr04,windrow+1,0,
                  "ОТРАБОТАННЫЕ ДНИ МЕСЯЦА",7,r[2],n3,-1500.,1500.,0);
                zaprosd(scr04,windrow+2,0,
                  "ОТРАБОТАННЫЕ ЧАСЫ НЕДЕЛИ",7,0.,n4,-500.,500.,0);
              }
           ubrraznicu(h);
           n2=bz/(norm(1)*18); /* тариф */
           r[2]=n4;
           n1=n2*n4*n3;
           break;
       
case 194:  /* оклад,  неделя 24 часов*/
         /* при изменениях измените и в s100ras() */

           worktime(crow,b3,0); /* заполнение рабоч.дней в табеле */
           if (nkalend==knorm)
              /* если строка считается по основному графику ЛС */
              r[2]=dney_v_tab(rsimv,calm,z1,z2);   
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           /* БЗ - тариф доплаты */            
                      indstr(scr04,mrasch,windrow,r,t,1);
//         if (mmimo==1) break;
           flagrow1[jf1]=crow;
           flagrow[jf][2]=1;
           ifraznicu(h);
           if ( uprc!=NO_SCREEN )
              { zaprosd(scr04,windrow+1,0,
                  "ОТРАБОТАННЫЕ ДНИ МЕСЯЦА",7,r[2],n3,-1500.,1500.,0);
                zaprosd(scr04,windrow+2,0,
                  "ОТРАБОТАННЫЕ ЧАСЫ НЕДЕЛИ",7,0.,n4,-500.,500.,0);
              }
           ubrraznicu(h);
           n2=bz/(norm(1)*24); /* тариф */
           r[2]=n4;
           n1=n2*n4*n3;
           break;
         

 case 34: /* гпд оппт */
         /* при изменениях измените и в s100ras() */


           worktime(crow,b3,0); /* заполнение рабоч.дней в табеле */
           if (nkalend==knorm)
              /* если строка считается по основному графику ЛС */
              r[2]=dney_v_tab(rsimv,calm,z1,z2);   
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           /* БЗ - тариф доплаты */            
                      indstr(scr04,mrasch,windrow,r,t,1);
//         if (mmimo==1) break;
           flagrow1[jf1]=crow;
           flagrow[jf][2]=1;
           ifraznicu(h);
           if ( uprc!=NO_SCREEN )
              { zaprosd(scr04,windrow+1,0,
                  "ОТРАБОТАННЫЕ ДНИ МЕСЯЦА",7,r[2],n3,-1500.,1500.,0);
                zaprosd(scr04,windrow+2,0,
                  "% ОПЛАТЫ",7,0.,n4,-500.,500.,0);
              }
           ubrraznicu(h);
           n2=bz/norm(1); /* дневная ставка */
           r[2]=n3;
           n1=n2*n4*r[2]/100;
           break;
         
case 13:   /* премия суммой за месяц */
           if ( n1==0. && func[6] )  n1=bz;
           break;

case 17:   /* доплата за ночь */
         /* БЗ - оклад */

           r[2]=r[2]+h[2];  /* учет для случая пересчета */
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           n1=bz/norm(2)*r[2]*0.40;
           break;

case 19:   /* классное руководство */
           /* БЗ - часы работы */
            s97(d1,d2,n2,k,1); /* дневные */

           r[2]=r[2]+h[2];  /* учет для случая пересчета */
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           n1=n2*r[2]*0.20;
           break;
case 23:   /* классное руководство */
           /* БЗ - часы работы */
            s97(d1,d2,n2,k,1); /* дневные */

           r[2]=r[2]+h[2];  /* учет для случая пересчета */
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           n1=n2*r[2]*0.15;
           break;
case 72:   /* ПЕРЕВОД Ч/З ДОРОГУ */
           /* БЗ - ОКЛАД */
            s97(d1,d2,n2,k,1); /* дневные */

           r[2]=r[2]+h[2];  /* учет для случая пересчета */
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           n1=n2*r[2]*0.15;
           break;
case 59:   /* ПОДПИСКА МЕТОД ЛИТЕРАТУРЫ */
           /* БЗ - ОКЛАД */
            s97(d1,d2,n2,k,1); /* дневные */

           r[2]=r[2]+h[2];  /* учет для случая пересчета */
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           n1=n2*r[2]*0.10;
           break;
case 37:   /* пpовеpка тетpадей нач классов */
           /* БЗ - часы работы */
            s97(d1,d2,n2,k,1); /* дневные */

           r[2]=r[2]+h[2];  /* учет для случая пересчета */
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           n1=n2*r[2]*0.10;
           break;
case 24:case 25:case 26: case 38:  /* качественное обучение */
case 32:case 31: case 28: case 33:    /* БЗ - %доплаты */
           s97(d1,d2,n2,k,1); /* дневные */

           r[2]=r[2]+h[2];  /* учет для случая пересчета */
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           n1=n2*r[2]*bz/100;
           break;

case 27:   /* дни повышенной оплаты */
           m1=s98(0,n6);
           if (m1==1) s97(d1,d2,n2,k,1); /* дневные */
           else       s96(d1,d2,n2,1);    /* часовые */
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) break;
           n1=r[2]*n2*bz/100.;
           break;

case 35:  /* учебные дни, БЗ-процент от ставочной оплаты дня */
          s97(data+.01,data+countday/100.,n2,k,1);
          if (nkalend==knorm)
             /* если строка считается по основному графику ЛС */
             r[2]=dney_v_tab("У",calm,z1,z2);
          if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) break;
          n1=r[2]*n2*bz/100.;
          break;




case 41:  /* компенсация за неиспольз. отпуск ФЗП */
case 63:  /* компенсация за неиспольз. отпуск ФМП */
case 65:  /* компенсация за неиспольз. отпуск ЛЬГ.СЕВ (для сев.варианта) */
          if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) break;
          n1=r[2]*bz/100.;
          break;

case 55:   case 56:   case 58:
           /* БЗ - 1/12 прошлогодних премий, которые идут в расчет б/листа */
           if (func[0]==5) break;
                   /* func[0]=5 - режим "Расчет произвольного вида" */
           if ( b3==3 ) { n1=bz; break; }
                   /* b3==3 - режим "расчет больничного листа" */
           ;

/*
case 99: /* район.коэф-т ФЗП */
case 98: /* район.коэф-т ФМП */
         /* при изменениях измените и в s100ras() */
         if (kod_alg==99)
               s1001simv("1","н",d1,d2,0,ST_RK,r9,2,0); // ФЗП   // 08.11.95
         else  s1001simv("2","н",d1,d2,0,ST_RK,r9,2,0); // ФМП   // 08.11.95
         n1=r9*bz/100.;
         break;
*/

case 147:   /* ГОР М О  */
            s97(d1,d2,n2,k,1);
           worktime(crow,b3,0); /* заполнение рабоч.дней в табеле */
           r[2]=r[2]+h[2];  /* учет для случая пересчета */        
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           n1=n2*r[2]*bz/100;       
           break;

//case 178:  // Выслуга лет
//        {  int mec,I;
//           char Str_Work[11];
//           kch_from("datavys",Str_Work);
//           mec=Transl_Date_To_Abs(Str_Work);
//           for ( I=1000;I>=0; I-- )
//           {
//               if ( mrasch-mec>=I &&  Value_For_Table_Cod(78,I,data,n3)!=EOF )
//                  break;//
//           }
//           s98(0,n6);
//           r[2]=n6*norm(1);
//           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) break;
//           s97(d1,d2,n2,n5,1);  /* дневная ставка */
//           n1=r[2]*n3*n2/100.;
//           break;
//        }


case 185:  /* питание */
           n3=dney_v_tab("НПС",calm,z1,z2);
           r[2]=norm(1)-n3;
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) break;
           n1=r[2]*bz/norm(1);
           break;


case 204:  /* на чек - часть з/п, получаемая чеками */
           //if (b3!=5 || mrasch!=mtek) break;
           if (b3==2 || b3==4 || mrasch!=mtek) ;
           /* рассчитывается только при "Расчете за месяц" */
           /* для текущего месяца */
           r9=sum[1]-sum[5];  /* Остаток = Начислено - Удержано */
           if ( r9>0.)
             { r9=r9*bz/100.;
               round2(r9,1,100.,n1);  /* отбрасывание до сотен рублей */
             }
           else n1=0.;
           break;


case 215: /* СУММА=БЗ */
          if (n1==0.) n1=bz;
          break;



//case 228:  /* перечисление части, если есть (на сб/кассу, по почте); */
//           /*  БЗ - месячная сумма перечисления */
//           if (n1==0.)
//              { n7=sum[1]-sum[5];   /* sum[1]-всего начислено *//
//                                    /* sum[5]-всего удержано  */
//                if ( n7+0.001-bz < 0.)  n1=0.;
//                else n1=bz; }
//           break;
case 235:  /* Пенсионный фонд на остальное */
            s100simv("1","н",0,5,r9,0);

                 n1=r9*0.01;
          
                 break;

case 234:  /* Пенсионный фонд на остальное */
            s100simv("2","н",0,5,r9,0);

                 n1=r9*0.01;
         
                 break;

// 28.12.96
case 237:  // Удержания в пенсионный фонд, выплачиваемые работодателем
           // Процент хранится в базовом значении строки
            wdopst(ST_PENSF);
            if ( mrasch>mtek )
              for(i=0;i<MAXKOD;i++)
                if (Sim_For_Position(i,ST_MNIMVID_SVOD) == '2') dopst[i]='0';
            s1001("н",d1,d2,0,'d',r9,2);
            s1001simv("Б","н",d1,d2,0,'d',n4,2,0);
            n1=(r9-n4)*bz/100.;
            break;

//case 248:  /* з/пл по данному подразд. выплачивается в др.подразделении */
//
//           n1=sum[1]-sum[5];
//           break;

case 250:  /* перечисление остатка (по почте, в сберкассу); */
           /* БЗ - до скольки отбрасывать результат для перевода */
           /*      (0 - с копейками) */
           if ( b3==2 || b3==4 || mrasch!=mtek) break;
           /* рассчитывается только при "Расчете за месяц" */
           /* для текущего месяца */
           r9=sum[1]-sum[5];  /* Остаток = Начислено - Удержано */
           if ( r9>0.)
              { n1=r9;
                round2(n1,1,bz,n1); }
           else n1=0.;
           break;

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

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

      // case 712:
      //   return UserAlg712(info,r);
      case 178:
     return UserAlg178(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;
}

UserAlg4(&info,&r)
{
  return SysAlg4(info,r);
}
//   double r9;
//   s1001simv(StrSimv,"н",info.d1,info.d2,0,ST_RK,r9,2,0);
//   info.n1=r9*info.bz/100.;
//   if(FL_V_ALG && uprc != NO_SCREEN)
//   {
//      infolist.add_record("Столбец для выборки",ST_RK+1);
//      infolist.add_record("Символ выборки",StrSimv);
//      infolist.add_record("Выборка",r9);
//      infolist.add_record("Процент",info.bz);
//      infolist.add_record("Результат",info.n1);
//   }
//   return code_MDefault;
//}

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;
}
UserAlg178(&info,&r)
{
   int NumSet = 78; // номер сетки
   struct Struct_Alg Work;
   Get_AlgWithParam(Work,info.ikod);   // 31.01.1995
   // Work.Count_Par - число паpаметpов для кода алгоpитма
   //-- параметр 1 - список символов суммирования
   if(Work.Count_Par > 0)
   {
      int i = atoi(reinterpret_cast_to_string(Work.List_Par[0]));
      if ( i>0 ) NumSet = i;
   }
   // Выслуга лет  // 17.04.97
   //procent_ot_staga(78,"datavys",1,0,31,crow,d1,d2,&n3); //по-старому
   double n3;
   procent_ot_staga(NumSet,"datavys",1,0,1,info.crow,info.d1,info.d2,n3);
   // n3 - % от стажа
      // double n6;
      //s98(0,n6);
      //r[2]=n6*norm(1); // r[2] - отработанных дней
   r[2]=n3;
   char t[20];
   if((info.c=korrv(r,t,0,info.h,flagrow,jf)) != 1)
      return code_ReturnCode;
   double n2;
      //double n5;
//   double n7;
  // double n8;
   double n9;
  // double n10;
  // double n11;
  // double n12;

   sumvid("*",6.,0,n2);
  // sumvid("*",20.,0,n7);
// sumvid("*",25.,0,n8);
   sumvid("*",51.,0,n9);
// sumvid("*",122.,0,n10);
//   sumvid("*",123.,0,n11);
//   sumvid("*",194.,0,n12);


      //s97(info.d1,info.d2,n2,n5,1);  // n2 - дневная ставка
      //info.n1=r[2]*n2*n3/100.;
   info.n1=n2*n3/100.+n9*n3/100.;
   if(FL_V_ALG && uprc != NO_SCREEN)
   {
      infolist.add_record("Сумма по 106",n2);
//      infolist.add_record("Сумма по 120",n7);
   //   infolist.add_record("Сумма по 125",n8);
      infolist.add_record("Сумма по 151",n9);
   //   infolist.add_record("Сумма по 222",n10);
   //   infolist.add_record("Сумма по 223",n11);
   //   infolist.add_record("Сумма по 294",n12);


      infolist.add_record("Процент выслуги",n3);
      infolist.add_record("Результат",info.n1);
   }
   return code_MDefault;
 }

