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 30:   /* ВРЕДНОСТЬ ОТ УЕТ */
       //    worktime(crow,b3,0); /* заполнение рабоч.дней в табеле */
       //    if (nkalend==knorm)
              /* если строка считается по основному графику ЛС */
        //      r[2]=dney_v_tab(rsimv,calm,z1,z2);
          sumvid("*",2.,0,n3);
          rvvid("*",2.,0,n4);
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           n1=n3/n4*r[2]*bz/100.;
           /* bz - базовое значение по строке вида Н-У */
           break;

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


case 708: /* простые врача*/
         /* при изменениях измените и в s100ras() */
           //if ( r[2]==0. && mrasch<=mtek ) //r[2]=bz;
           //if ( (c=korrv(r,t,0,h,flagrow,&jf)) != 1 ) return(c); 
          // 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) goto mdfault;
       //    flagrow1[jf1]=crow;
           flagrow[jf][2]=1;
           ifraznicu(h);
           if ( uprc!=NO_SCREEN )
              { zaprosd(scr04,windrow+1,0,
                  "Сумма",7,r[2],n3,-1500000.,1500000.,0);
               // zaprosd(scr04,windrow+2,0,
               //   "ПРОЦЕНТ НАДБАВКИ ",7,0.,&n4,-500.,500.,0);
              }
           ubrraznicu(h);
           //n2=bz*n3/100; /* тариф */
           r[2]=n3;
           n1=bz*r[2]/100;
           break;
case 3: /* простые врача*/
         /* при изменениях измените и в s100ras() */
           //if ( r[2]==0. && mrasch<=mtek ) //r[2]=bz;
           //if ( (c=korrv(r,t,0,h,flagrow,&jf)) != 1 ) return(c); 
          // 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) goto mdfault;
       //    flagrow1[jf1]=crow;
           flagrow[jf][2]=1;
           ifraznicu(h);
           if ( uprc!=NO_SCREEN )
              { zaprosd(scr04,windrow+1,0,
                  "Сумма",7,r[2],n3,-1500000.,1500000.,0);
               // zaprosd(scr04,windrow+2,0,
               //   "ПРОЦЕНТ НАДБАВКИ ",7,0.,&n4,-500.,500.,0);
              }
           ubrraznicu(h);
           //n2=bz*n3/100; /* тариф */
           r[2]=n3;
           n1=bz*r[2]/100;
           break;


case 75: /* АХП*/
         /* при изменениях измените и в s100ras() */
           //if ( r[2]==0. && mrasch<=mtek ) //r[2]=bz;
           //if ( (c=korrv(r,t,0,h,flagrow,&jf)) != 1 ) return(c); 
          // 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) goto mdfault;
         //  flagrow1[jf1]=crow;
           flagrow[jf][2]=1;
           ifraznicu(h);
           if ( uprc!=NO_SCREEN )
              { zaprosd(scr04,windrow+1,0,
                  "Сумма",7,r[2],n3,-1500000.,1500000.,0);
               // zaprosd(scr04,windrow+2,0,
               //   "ПРОЦЕНТ НАДБАВКИ ",7,0.,&n4,-500.,500.,0);
              }
           ubrraznicu(h);
           //n2=bz*n3/100; /* тариф */
           r[2]=n3;
           n1=bz*r[2]*0.70/100;
           break;
case 76: /* Ахп резерв*/
         /* при изменениях измените и в s100ras() */
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           /* БЗ - тариф доплаты */            
                      indstr(scr04,mrasch,windrow,r,t,1);
//           if (mmimo==1) goto mdfault;
     //      flagrow1[jf1]=crow;
           flagrow[jf][2]=1;
           ifraznicu(h);
           if ( uprc!=NO_SCREEN )
              { zaprosd(scr04,windrow+1,0,
                  "Сумма",7,r[2],n3,-1500000.,1500000.,0);
               // zaprosd(scr04,windrow+2,0,
               //   "ПРОЦЕНТ НАДБАВКИ ",7,0.,n4,-500.,500.,0);
              }
           ubrraznicu(h);
           //n2=bz*n3/100; /* тариф */
           r[2]=n3;
           n1=bz*r[2]*0.30/100;
           break;
case 49:    /* за заведование */
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) break;
           n1=bz*1.5*0.7/100.;
           /* bz - базовое значение по строке вида Н-У */
           break;

case 56:    /* за литье */
           n1=bz*0.7/2*1.5/100;
           /* bz - базовое значение по строке вида Н-У */
           break;
case 73:    /* санитарка*/
           n1=bz*1.0*0.7/100;
           /* bz - базовое значение по строке вида Н-У */
           break;
case 8:    /* экстренные */
           s96(d1,d2,n2,1);
           //worktime(crow,b3,0);
           if (nkalend==knorm)
              /* если строка считается по основному графику ЛС */
          //    skoljko(&r[2],data,z1,z2,rsimv,calm,cht);
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) break;
           n1=r[2]*n2;
           break;

case 16:    /* ургентные */
           s96(d1,d2,n2,1);
           //worktime(crow,b3,0);
           if (nkalend==knorm)
              /* если строка считается по основному графику ЛС */
          //    skoljko(&r[2],data,z1,z2,rsimv,calm,cht);
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) break;
           n1=r[2]*n2/2;
           break;
case 123:    /* медстаж */
           s96(d1,d2,n2,1);
           //worktime(crow,b3,0);
           if (nkalend==knorm)
              /* если строка считается по основному графику ЛС */
          //    skoljko(&r[2],data,z1,z2,rsimv,calm,cht);
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) break;
          n1=n2*r[2]*bz/100; 
           break;

case 24:    /* часовая оплата по окладу */
           worktime(crow,b3,0);
           if (nkalend==knorm)
              /* если строка считается по основному графику ЛС */
              skoljko(r[2],data,z1,z2,rsimv,calm,cht);
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) break;
       //    n1=r[2]*bz/norm(2); 
           break;
case 168:    /* платные */
           worktime(crow,b3,0);
           if (nkalend==knorm)
              /* если строка считается по основному графику ЛС */
              skoljko(r[2],data,z1,z2,rsimv,calm,cht);
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) break;
       //    n1=r[2]*bz/norm(2); 
           break;

case 11: /* вредность*/
//          m1=s98(0,n6);
          s97(d1,d2,n2,k,1);
          if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) break;
          n1=n2*r[2]*bz/100;
           /* bz - базовое значение по строке вида Н-У */
           break;
case 57: /* СВЕРХУРОЧНЫЕСТОРОЖАМ*/
         /* при изменениях измените и в s100ras() */
//           s100("н",-1,2,&n2);   
           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) goto mdfault;
        //   flagrow1[jf1]=crow;
           flagrow[jf][2]=1;
           ifraznicu(h);
           if ( uprc!=NO_SCREEN )
              { zaprosd(scr04,windrow+1,0,
                  "сверх. ЗА ПЕРВЫЕ 2 ЧАСА ",7,r[2],n3,-1500.,1500.,0);
                zaprosd(scr04,windrow+2,0,
                  "ОСТАЛЬНЫЕ ЧАСЫ",7,0.,n4,-500.,500.,0);
              }
           n5=n3*1.5;
           n6=n4*2;
          // ubrraznicu(h);
           n2=bz/norm(2); /* тариф */
           r[2]=n3+n4;
           n1=(n2*n5)+(n2*n6);
           break;
case 2: /*оклад врача*/
         /* при изменениях измените и в s100ras() */
           worktime(crow,b3,0); /* заполнение рабоч.дней в табеле */
           if (nkalend==knorm)
              /* если строка считается по основному графику ЛС */
     //         r[2]=dney_v_tab(rsimv,calm,z1,z2); 
             skoljko(r[2],data,z1,z2,rsimv,calm,cht);
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           /* БЗ - тариф доплаты */            
                      indstr(scr04,mrasch,windrow,r,t,1);
//           if (mmimo==1) goto mdfault;
         //  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,-1500.,1500.,0);
              }
           ubrraznicu(h);
           // n2=bz+r9; /* тариф */
   //        r[2]=n4;
  //       n1=bz/norm(1)*r[2]/n3*n4;
           n1=bz/n3*n4;
          break;
case 39: /*УВЕЛИЧЕНИЕ ОБЪЕМА медсестры*/
         /* при изменениях измените и в 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) goto mdfault;
         //  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,-1500.,1500.,0);
              }
           ubrraznicu(h);
           // n2=bz+r9; /* тариф */
   //        r[2]=n4;
  //       n1=bz/norm(1)*r[2]/n3*n4;
           sumvid("*",4.,0,r9);
           n1=bz/norm(1)*r[2]/n3*n4-r9;
          break;
case 122: /*УВЕЛИЧЕНИЕ ОБЪЕМА врачи*/
         /* при изменениях измените и в s100ras() */
           worktime(crow,b3,0); /* заполнение рабоч.дней в табеле */
           if (nkalend==knorm)
              /* если строка считается по основному графику ЛС */
           //   r[2]=dney_v_tab(rsimv,calm,z1,z2); 
            skoljko(r[2],data,z1,z2,rsimv,calm,cht);  
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           /* БЗ - тариф доплаты */            
                      indstr(scr04,mrasch,windrow,r,t,1);
//           if (mmimo==1) goto mdfault;
         //  flagrow1[jf1]=crow;
           flagrow[jf][2]=1;
           ifraznicu(h);
           if ( uprc!=NO_SCREEN )
              { zaprosd(scr04,windrow+1,0,
                  "НОРМА УЕТ ",7,r[2],n3,-2000.,2000.,0);
                zaprosd(scr04,windrow+2,0,
                  "КОЛ-ВО УЕТ",7,0.,n4,-2000.,2000.,0);
              }
           ubrraznicu(h);
           // n2=bz+r9; /* тариф */
   //        r[2]=n4;
  //       n1=bz/n3*n4;
           sumvid("*",6.,0,r9);
           n1=bz/n3*n4-r9;
          break;

case 37: /*оклад медсестры*/
         /* при изменениях измените и в 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) goto mdfault;
//           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,-1500.,1500.,2);
              }
           ubrraznicu(h);
           // n2=bz+r9; /* тариф */
           //r[2]=n4;
         n1=bz/norm(1)*r[2]/n3*n4;
          // n1=bz/n3*n4;
           break;
case 48: /*совмещение*/
         /* при изменениях измените и в s100ras() */
           worktime(crow,b3,0); /* заполнение рабоч.дней в табеле */
           if (nkalend==knorm)
              /* если строка считается по основному графику ЛС */
             // r[2]=dney_v_tab(rsimv,calm,z1,z2);   
              skoljko(r[2],data,z1,z2,rsimv,calm,cht);
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           /* БЗ - тариф доплаты */            
                      indstr(scr04,mrasch,windrow,r,t,1);
//           if (mmimo==1) goto mdfault;
//           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,-1500.,1500.,2);
           //   }
           ubrraznicu(h);
           // n2=bz+r9; /* тариф */
           //r[2]=n4;
         n1=bz/norm(2)*r[2];
          // n1=bz/n3*n4;
           break;
case 130:   /* праздничные  */
         /* БЗ - оклад */
           r[2]=r[2]+h[2];  /* учет для случая пересчета */
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           n1=bz/norm(2)*r[2];
           break;

case 9:   /* праздничные  */
         /* БЗ - оклад */
           r[2]=r[2]+h[2];  /* учет для случая пересчета */
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           n1=bz/norm(2)*r[2];
           break;
case 54:   /* ночные 80% 2024 год */
         /* БЗ - оклад */
           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.75;
           break;
case 711:   /* ночные 50% 2024 год */
         /* БЗ - оклад */
           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.50;
           break;

case 51:   /* ночные сторожа */
         /* БЗ - оклад */
           r[2]=r[2]+h[2];  /* учет для случая пересчета */
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           n1=bz/norm(2)*r[2]*1;
           break;


case 118:   /* праздничные на оклад 104  */
         /* БЗ - оклад */
           sumvid("=",116.,0,r9);n1=r9;
           r[2]=r[2]+h[2];  /* учет для случая пересчета */
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           n1=(bz+r9)/norm(1)*r[2];
           break;

case 27:   /* надбавка за стаж по окладу БЗ % */
         /* БЗ - %  */
           sumvid("=",75.,0,r9);
           sumvid("=",4.,0,r8);
              if (r[2]==0.)   // 17.04.95
           r[2]=bz; 
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           n1=(r9+r8)*r[2]/100.;
           break;

case 115:   /* надбавка за стаж по окладу БЗ % */
         /* БЗ - %  */
           sumvid("=",2.,0,r9);
           sumvid("=",6.,0,r8);
              if (r[2]==0.)   // 17.04.95
      //     r[2]=bz; 
           if ( (c=korrv(r,t,0,h,flagrow,jf)) != 1 ) return(c);
           n1=(r9+r8)*r[2]/100.*bz/norm(2);
           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,-0.5111,0.5111,0);
              }
           n5=bz; /* тариф */
           n6=0.5; /* процент доплаты тарифа за первые 2 часа */
           n7=1. ; /* процент доплаты тарифа за след. часы */
           n1 = n5 * ( n3*n6 + n4*n7 )/100.;
           r[2]=n3+n4;
           break;
case 18:   /* совмещение по основному окладу*/
           /* БЗ - оклад */
           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;
           if ( uprc!=NO_SCREEN )
              {// flagrow[jf][2]=1;
                zaprosd(scr04,windrow+1,0,
                  "Дни совмещения",7,r[2],n3,-500.,500.,0);
                zaprosd(scr04,windrow+2,0,
                  "Процент надбавки",7,0.,n4,-500.,500.,0);
              }
           n5=bz; /* оклад */
           n1=n5/norm(1)*n3;
           r[2]=n3;
           break;
case 110:   /* медстаж на совмещение*/
           /* БЗ - оклад */
           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;
           if ( uprc!=NO_SCREEN )
              {// flagrow[jf][2]=1;
                zaprosd(scr04,windrow+1,0,
                  "Дни совмещения",7,r[2],n3,-500.,500.,0);
                zaprosd(scr04,windrow+2,0,
                  "Процент надбавки",7,0.,n4,-500.,500.,0);
              }
           n5=bz; /* оклад */
           n1=n5/norm(1)*n3*n4/100;
           r[2]=n3;
           break;
case 156:   /* медстаж на совмещение*/
           /* БЗ - оклад */
           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;
           if ( uprc!=NO_SCREEN )
              {// flagrow[jf][2]=1;
                zaprosd(scr04,windrow+1,0,
                  "ЧАСЫ",7,r[2],n3,-500.,500.,0);
                zaprosd(scr04,windrow+2,0,
                  "Процент надбавки",7,0.,n4,-500.,500.,0);
              }
           n5=bz; /* оклад */
           n1=n5/norm(2)*n3*n4/100;
           r[2]=n4;
           break;
case 190:   /* Надбавка 290 291*/
           /* БЗ - оклад */
           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;
           if ( uprc!=NO_SCREEN )
              {// flagrow[jf][2]=1;
                zaprosd(scr04,windrow+1,0,
                  "ЧАСЫ",7,r[2],n3,-500.,500.,0);
                zaprosd(scr04,windrow+2,0,
                  "Процент надбавки",7,0.,n4,-500.,500.,0);
              }
           n5=bz; /* оклад */
           n1=n5/norm(2)*n3*n4/100;
           r[2]=n3;
           break;



 case 132:   /* медстаж на совместительство*/
           /* БЗ - оклад */
           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;
           if ( uprc!=NO_SCREEN )
              {// flagrow[jf][2]=1;
                zaprosd(scr04,windrow+1,0,
                  "часы совмещения",7,r[2],n3,-500.,500.,0);
                zaprosd(scr04,windrow+2,0,
                  "Процент надбавки",7,0.,n4,-500.,500.,0);
              }
           n5=bz; /* оклад */
           n1=n5/norm(2)*n3*n4/100;
           r[2]=n3;
           break;
case 256:   /* медстаж на совместительство*/
           /* БЗ - оклад */
           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;
           if ( uprc!=NO_SCREEN )
              {// flagrow[jf][2]=1;
                zaprosd(scr04,windrow+1,0,
                  "часы ",7,r[2],n3,-500.,500.,0);
                zaprosd(scr04,windrow+2,0,
                  "Процент надбавки",7,0.,n4,-500.,500.,0);
              }
           n5=bz; /* оклад */
           n1=n5/norm(2)*n3*n4/100;
           r[2]=n3;
           break;

case 222:  /* пенсионный фонд */
           s1001("н",d1,d2,0,ST_PROFS,r9,2);  // 08.11.95
           n1=r9*bz/100;
           break;

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

      // Пример вызова алгоритма пользователя.
      //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;
}

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


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