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 192: return UserAlg192(info,r); case 4: return UserAlg4(info,r); case 6: return UserAlg6(info,r);//поставочный алгоритм 6 вместо 661 после июля 2018 case 917: return UserAlg917(info,r); case 927: return UserAlg927(info,r); case 66: return UserAlg66(info,r); case 606: return UserAlg606(info,r); // для 2 мрот case 662: return UserAlg662(info,r);//ночные case 661: return UserAlg661(info,r);//дневные case 663: return UserAlg663(info,r);//праздничные case 664: return UserAlg664(info,r);//праздничные case 885: return UserAlg885(info,r); // case 712: // return UserAlg712(info,r); case 718: return UserAlg718(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 UserAlg4_6(info,r,false); } UserAlg6(&info,&r) { return UserAlg4_6(info,r,true); } UserAlg4_6(&info,&r,bHours) { var mrsimv="Р"; unsigned idxNorm = bHours?2:1; worktime(info.crow,info.b3,0); var ListBZ;// = CreateObject("MapString"); unsigned cnt=GetListBZ(info.kod,data+0.01,data+countday/100.,GetBase(info.crow),ListBZ); // if ( ListBZ.Size()<2 ) if ( cnt<2 ) { if(nkalend == knorm) //* если строка считается по основному графику ЛС { if ( bHours ) skoljko(r[2],data,info.z1,info.z2,mrsimv,calm,cht); else r[2]=dney_v_tab(mrsimv,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(idxNorm); if(FL_V_ALG && uprc != NO_SCREEN) { infolist.add_record("Рабочее время",r[2]); infolist.add_record(bHours?"Норма часов":"Норма дней",norm(idxNorm)); infolist.add_record("Оклад",info.bz); infolist.add_record("Результат",info.n1); } } else { if(FL_V_ALG&&uprc!=NO_SCREEN) { infolist.add_record(bHours?"Норма часов":"Норма дней",norm(idxNorm)); } // bool bCur = ListBZ.InitIterator(); unsigned idx=0; double DatB = ListBZ[idx][1];// atof(ListBZ.GetCurKey()); double _do = do_chisla(info.ikod); info.n1 = 0.; r[2]= 0.; var Tmp = CreateObject("KDate"); var Tmp1 = CreateObject("KDate"); // while ( bCur ) while ( idx0) { int i=atoi(reinterpret_cast_to_string(Work.List_Par[0])); if(i > 0) stolbec=i; } //-- параметр 2 - номер календаря для расчёта среднемесячного знач.часов // (если этот параметр равен 0, то номер календаря берём из строки // вида или из КЧ ЛС) if (Work.Count_Par > 1) { int i=atoi(reinterpret_cast_to_string(Work.List_Par[1])); if(i > 0) k=i; } // n2 - среднемесячное значение часов (вытаскиваем либо из календаря // строки, либо из графика в КЧ ЛС) if (k==0) //если календарь не указан в параметрах k=atoi(GetCalend(info.crow)); //то берём его из календаря вида if (k==0) //если календарь не указан, то берем из к.ч. { char str[256]; kch_from("grafik",str); k=atoi(str); } // k=3; // у ГУ МВД пятидневный календарь - это календарь 3, // поэтому для них k всегда равно 3 double n2=GetYearNRV_svv(k,2); //годовая норма времени if (info.bz>0.0001) { Proc=info.bz; } else { if(info.ikod==17) Proc=40; if(info.ikod==28) Proc=100; } /* n5 - сумма БЗ */ s100simv("1","н",0,stolbec-1,n5,0); // b100(stolbec-1,info.d1,info.d2,n5,1); if((info.c=korrv(r,t,0,info.h,flagrow,jf)) != 1) return code_ReturnCode; // n1 - сумма if ( n2 ) info.n1=n5*r[2]/(n2/12.)*Proc/100.; if(FL_V_ALG&&uprc!=NO_SCREEN) { infolist.add_record("РВ(ч)",r[2]); infolist.add_record("График",k); infolist.add_record("Годовое знач.часов",n2); infolist.add_record("Среднемесчное знач.часов",n2/12.); infolist.add_record("Столбец",stolbec); infolist.add_record("Выборка по столбцу",n5); infolist.add_record("Базовое значение",Proc); infolist.add_record("Результат",info.n1); } return code_Break; } ///////////////////////////////////////////////////------ UserAlg664(&info,&r) //С В Е Р Х У Р О Ч Н Ы Е ----- { toMatrLS (); var simv="2"; var psimvMy="120Р"; var rsimvMy="Р"; var nsimvMy="Ч"; var bsimvMy="БДОА"; var b=GetPropOfCod(info.kod); double ch; double dn; int st=39; var CH_v=0.0; double nt; double ss=0.0; char str[50]; int rowkod[999]; int cnt=0; double bzk=0.0; double rz=0.0; double koe=0.0; double DateBj,DateEj; int nsetki; double bbz=0.0; double bbz_prom=0.0; var DateB=CreateObject("KDate"); for (int i=info.z1; i<=info.z2; i++) { RVFromNUCol (0, dn,ch,st+i-1 ); CH_v=CH_v+dn; ///////////////////////////////////////////////////// DateB.SetDateII(i,mrasch); GetKchValue("pkg",str,100,DateB); nsetki=atoi(str); GetKchValue("grafik",str,100,DateB); rwnorma(atoi(str),0); nt=GetNorma(2,mrasch); cnt=poiskosnkodProp(696,rowkod,0,b); for (int j=0 ;j0 && dn<=2) { ss=ss+bbz*koe/nt*dn*0.5; } if(dn>2) { ss=ss+bbz*(dn-2)/nt*koe+bbz*2*0.5*koe/nt; } } cnt=poiskosnkodProp(695,rowkod,0,b); for (int j=0 ;j0 && dn<=2) { ss=ss+bbz*koe/nt*dn*0.5; } if(dn>2) { ss=ss+bbz*(dn-2)/nt*koe+bbz*2*0.5*koe/nt; } } cnt=poiskosnkodProp(612,rowkod,0,b); for (int j=0 ;j0 && dn<=2) { ss=ss+bbz*koe/nt*dn*0.5; } if(dn>2) { ss=ss+bbz*(dn-2)/nt*koe+bbz*2*0.5*koe/nt; } } cnt=poiskosnkodProp(196,rowkod,0,b); for (int j=0 ;j0 && dn<=2) { ss=ss+bbz*koe/nt*dn*0.5; } if(dn>2) { ss=ss+bbz*(dn-2)/nt*koe+bbz*2*0.5*koe/nt; } } } char t[20]; r[2]=CH_v; if((info.c=korrv(r,t,0,info.h,flagrow,jf)) != 1) return code_ReturnCode; info.n1=ss; if(FL_V_ALG && uprc != NO_SCREEN) { infolist.add_record("Сверхурочные часы",CH_v); // infolist.add_record("Норма времени",nt); // infolist.add_record("ставка",n5); infolist.add_record("результат",info.n1); } return code_Break; } ////////////////////////////////////////////////////////////-------------- UserAlg661(&info,&r) // Д Н Е В Н Ы Е ------------------------------- { if(mrasch<=366) //366 - июль месяц { ///if(info.b3==1){info.n1=info.bz; return code_Break;} //else //{ toMatrLS (); var simv="2"; var psimvMy="120Р"; var bsimvMy="БДОА"; var rsimvMy="РЫ"; var nsimvMy="Ч"; var b=GetPropOfCod(info.kod); double ch; double dn; int st=39; var CH_v=0.0; double nt; double ss=0.0; char str[50]; var DateB=CreateObject("KDate"); for (int i=info.z1; i<=info.z2; i++) { RVFromNUCol (0, dn,ch,st+i-1 ); set_chast(ch,i,mrasch); if(dney_v_tab(bsimvMy,calm,i,i)>0){ch=0;} if(ch>0){zamena_simv_v_tab (psimvMy,rsimvMy,calm,i,i,info.crow, 0 );} CH_v=CH_v+ch; DateB.SetDateII(i,mrasch); GetKchValue("grafik",str,100,DateB); rwnorma(atoi(str),0); nt=GetNorma(2,mrasch); ss=ss+info.bz/nt*ch; } char t[20]; r[2]=CH_v; if((info.c=korrv(r,t,0,info.h,flagrow,jf)) != 1) return code_ReturnCode; info.n1=ss; if(FL_V_ALG && uprc != NO_SCREEN) { infolist.add_record("Отраб.время время",CH_v); infolist.add_record("Норма времени",nt); infolist.add_record("Базовое значение",info.bz); infolist.add_record("результат",info.n1); } return code_Break; //} } else return UserAlg6(info,r); } ///////////////////////////////////////////////////////////////----------------- UserAlg662(&info,&r) // Н О Ч Н Ы Е ------------------------- { if(mrasch<=366) //366 - июль месяц { toMatrLS (); var simv="2";// var psimvMy="2Р";// var nsimvMy="Ч";// var bsimvMy="БДОА"; var ccomb=GetIDCombineOfCod(info.kod); double cc=0.00; int st=39; var CH_v=0.0; var b = CreateObject("APropBE"); b.SetCombine(ccomb); double nt; double ss=0.0; char str[50]; var DateB=CreateObject("KDate"); int rowkod[999]; int cnt=0; double bzk=0.0; double rz=0.0; double koe=0.0; double DateBj,DateEj; int nsetki; double bbz=0.0; double bbz_prom=0.0; for (int i=info.z1; i<=info.z2; i++) { cc=CollectSummPropSimv (simv,st+i-1,mrasch,mrasch,CL_M,b ); if(dney_v_tab(bsimvMy,calm,i,i)>0){cc=0;} CH_v=CH_v+cc; if(cc>0)zamena_simv_v_tab (psimvMy,nsimvMy,calm,i,i,info.crow, 0 ); DateB.SetDateII(i,mrasch); GetKchValue("pkg",str,100,DateB); nsetki=atoi(str); GetKchValue("grafik",str,100,DateB); rwnorma(atoi(str),0); nt=GetNorma(2,mrasch); cnt=poiskosnkodProp(696,rowkod,0,b); for (int j=0 ;j0) {for(int k=0;k0){ch=0;} ss=ss+bbz*koe/nt*ch; } cnt=poiskosnkodProp(695,rowkod,0,b); for (int j=0 ;j0){ch=0;} ss=ss+bbz*koe/nt*ch; } cnt=poiskosnkodProp(612,rowkod,0,b); for (int j=0 ;j0){ch=0;} ss=ss+bbz*koe/nt*ch; } cnt=poiskosnkodProp(196,rowkod,0,b); for (int j=0 ;j0){ch=0;} ss=ss+bbz*koe/nt*ch; } } } } } char t[20]; r[2]=CH_v; if((info.c=korrv(r,t,0,info.h,flagrow,jf)) != 1) return code_ReturnCode; // double n5; // s96(info.d1,info.d2,n5,1); info.n1=ss*info.bz*0.01; if(FL_V_ALG && uprc != NO_SCREEN) { infolist.add_record("Отраб.время время",CH_v); // infolist.add_record("ставка",n5); // infolist.add_record("% оплаты",info.bz); infolist.add_record("результат",info.n1); } return code_Break; } else return UserAlg927(info,r); } /////////////////////////////////////////////////////////////---------------------- ////// Р если часы не равны 0 UserAlg66(&info,&r) { double ch_n=0; double ch_ni; var psimvMy="2Р"; var rsimvMy="Р"; for (int i=1; i<=31; i++) { skoljko(ch_ni,data,i,i,psimvMy,calm,cht); if(ch_ni>0) {//ch_n=ch_n+ch_ni; zamena_simv_v_tab (psimvMy,rsimvMy,calm,i,i,info.crow, 0 ); } skoljko(r[2],data,info.z1,info.z2,rsimvMy,calm,cht); } char t[20]; var nt=norm(2); //r[2]=ch_n; if((info.c=korrv(r,t,0,info.h,flagrow,jf)) != 1) return code_ReturnCode; double n5; info.n1=info.bz*r[2]/norm(2); if(FL_V_ALG && uprc != NO_SCREEN) { infolist.add_record("Отраб.время время",r[2]); infolist.add_record("Норма времени",nt); infolist.add_record("Базовое значение",info.bz); infolist.add_record("результат",info.n1); } return code_Break; } UserAlg718(&info,&r) { // алименты c начислений // 06.10.1999 //--- выборка начислений за текущий месяц s1001simv("1","н",info.d1,info.d2,0,ST_ALIMENT,info.n1,2,0); // 08.11.95 //--- выборка удержаний за текущий месяц double n3; s1001simv("1","у",info.d1,info.d2,0,ST_ALIMENT,n3,2,0); //--- выборка удержаний за прошлый месяц, если они назначены double n4; s1001simv("2","у",info.d1,info.d2,-1,ST_ALIMENT,n4,2,0); var t_nu=info.n1; // var t_nu=info.n1-n3-n4; // info.n1=info.n1-n3-n4; info.n1=info.n1*info.bz/100.; if(FL_V_ALG && uprc != NO_SCREEN) { infolist.add_record("Столбец Т/В",ST_ALIMENT+1); infolist.add_record("Начисл.",t_nu); infolist.add_record("Проц. алиментов",info.bz); 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_MDefault; } UserAlg885(&info,&r) { // питание компенсация за молоко var n3=dney_v_tab("НПСОБКУИ",calm,info.z1,info.z2); r[2]=norm(1)-n3; char t[20]; if((info.c=korrv(r,t,0,info.h,flagrow,jf)) != 1) return code_ReturnCode; info.n1=r[2]*info.bz; if(FL_V_ALG && uprc != NO_SCREEN) { infolist.add_record("Норма",norm(1)); infolist.add_record("Прогулы, Справки, Нераб.",n3); infolist.add_record("Рабочие дни",r[2]); infolist.add_record("На питание",info.bz); infolist.add_record("Результат",info.n1); } return code_Break; } UserAlg192(&info,&r) { //РВ берется из вида 296 double rv296=0; rvvid("*",196,0,rv296); double rv677=0; rvvid("*",577,0,rv677); info.n1= rv677*(info.bz/rv296); if(FL_V_ALG && uprc != NO_SCREEN) { infolist.add_record("Рабочее время 296",rv296); infolist.add_record("Рабочее время 677",rv677); infolist.add_record("Тариф",info.bz); infolist.add_record("Результат",info.n1); } 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()0) { int i=atoi(reinterpret_cast_to_string(Work.List_Par[0])); if((i > 0) && (i <= 99)) pr1=i; } //-- параметр 2 - коэффициент выплаты if (Work.Count_Par>1) { double i=atof(reinterpret_cast_to_string(Work.List_Par[1])); if ( i!=0 ) pr2 = i; } // Корректируем РВ char t[20]; if((info.c=korrv(r,t,0,info.h,flagrow,jf)) != 1) return code_ReturnCode; // Считаем ставку по столбцу из параметра double n2; s96col(pr1-1,info.d1,info.d2,n2,1); // Считаем годовое значение часов int k=0; char str2[256]; kch_from("grafik",str2); k = atoi(str2); double n3 = GetYearNRV_med(k,2)/12; roundd(n3,2,n3); if (info.bz>0.0001) { Proc=info.bz; } else { if(info.ikod==17) Proc=40; if(info.ikod==28) Proc=100; } // ставка без нормирования double n5 = norm(2)*n2; // Считаем ставку за час при среднегодовом double stavka; stavka = n5 / n3; // Умножаем на коэффициент из параметра info.n1=stavka*pr2*r[2]*info.bz/100.; if(FL_V_ALG && uprc != NO_SCREEN) { infolist.add_record("Столбец ТВХ",pr1); infolist.add_record("=============","================"); infolist.add_record("Сумма по выборке",n5); infolist.add_record("Среднемесячная норма РВ",n3); infolist.add_record("=============","================"); infolist.add_record("Ставка",stavka); infolist.add_record("РВ ",r[2]); infolist.add_record("процент",info.bz); infolist.add_record("Итого",info.n1); } return code_MDefault; }