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 218: { // алименты // 06.10.1999 struct Struct_Alg Work; var dateNewTax = KDateFromStr(GetCommonCnfStr("TaxByPays","r0alg")); // Способ расчета по умолчанию сменен с 01.2023 из-за изменений в НК по НДФЛ. // Чтобы корректно захватывать НДФЛ разнесенной ведомостью за месяц с месяцем начисления текущим, а месяцем принадлежности следующим. bool isNewCalcTax = dateNewTax.IsValid() && mrasch >= dateNewTax.GetAbs(); int TypeCalc = isNewCalcTax ? 1 : 0; // временно пока не умеем считать алименты от выплаты Get_AlgWithParam(Work,info.ikod); // Work.Count_Par - число паpаметpов для кода алгоpитма //-- параметр 1 - тип расчета ( по умолчанию = 0, по месяцу принадлежности, 1 - по месяцу начисления) if(Work.Count_Par > 0) TypeCalc = atoi(reinterpret_cast_to_string(Work.List_Par[0])); int column=ST_ALIMENT; if(Work.Count_Par > 1) column = atoi(reinterpret_cast_to_string(Work.List_Par[1]))-1; double n3=0.; double n4=0.; if ( TypeCalc==1 || TypeCalc==2 ) { toMatrLS(); var CurProp = GetCurPropCountLS(); if ( TypeCalc==1 ) { //--- выборка начислений за текущий месяц info.n1 = s1001simv_mvProp("1",info.d1,info.d2,mrasch,column,2, CL_EXACT | CL_MV | CL_NACH, CurProp); //--- выборка удержаний за текущий месяц n3 = s1001simv_mvProp("1",info.d1,info.d2,mrasch,column,2, CL_EXACT | CL_MV | CL_UD, CurProp); } else { //--- выборка начислений за текущий месяц info.n1 = CollectSummPropSimv("1", column, 0, mrasch, CL_MV | CL_COL | CL_NACH, CurProp); //--- выборка удержаний за текущий месяц n3 = CollectSummPropSimv("1", column, 0, mrasch, CL_MV | CL_COL | CL_UD, CurProp); } } else { //--- выборка начислений за текущий месяц s1001simv("1","н",info.d1,info.d2,0,column,info.n1,2,0); // 08.11.95 //--- выборка удержаний за текущий месяц s1001simv("1","у",info.d1,info.d2,0,column,n3,2,0); //--- выборка удержаний за прошлый месяц, если они назначены s1001simv("2","у",info.d1,info.d2,-1,column,n4,2,0); } 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("Столбец Т/В",column+1); infolist.add_record("Начислено",t_nu+n3+n4); infolist.add_record("Удержано",n3+n4); 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[256]; char str1[256]; 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; } */ /* case 813: // Доплата до МРОТа!!! { var stolbec=1, sum=0., stv=0.; struct Struct_Alg Work; Get_AlgWithParam(Work,info.ikod); //-- параметр 1 - столбец if(Work.Count_Par > 0) { var i=atoi(reinterpret_cast_to_string(Work.List_Par[0])); if( i>0 ) stolbec=i; } StartRkv(GetCode(crow)); // ставка ReadRkv("ставка",str); FinishRkv(); if(atof(str)>0.) stv=atof(str); else stv=1.; info.kod_alg=s98(0,n6); if(info.kod_alg == 1) // "дневник" n6=dney_v_tab(rsimv,calm,info.z1,info.z2)/norm(1); else { double n2; // "часовик" //skoljko(n2,data,info.z1,info.z2,rsimv,calm,cht); rvvid("*",6.,0,n2); n6=n2/norm(2); } char t[20]; if((info.c=korrv(r,t,0,info.h,flagrow,jf)) != 1) return code_ReturnCode; s100("н",0,stolbec-1,sum); //выборка по ст. ТВХ //s1001simv("1","н",info.d1,info.d2,0,stolbec-1,sum,0,0); n8=info.bz*((n6<=1.)?n6:1.)*stv-sum; if(n8>0.) info.n1=n8; else info.n1=0.; if(FL_V_ALG && uprc != NO_SCREEN) { infolist.add_record("ФРВ:НРВ",n6); infolist.add_record("МРОТ",stv*bz); infolist.add_record("ФОТ",sum); infolist.add_record("Результат",info.n1); } return code_Break; } */ //Измененный от 04.09.2020 case 813: // Доплата до МРОТа!!! { var stolbec=1, sum=0., stv=0.; struct Struct_Alg Work; Get_AlgWithParam(Work,info.ikod); //-- параметр 1 - столбец if(Work.Count_Par > 0) { var i=atoi(reinterpret_cast_to_string(Work.List_Par[0])); if( i>0 ) stolbec=i; } StartRkv(GetCode(crow)); // ставка ReadRkv("ставка",str); FinishRkv(); if(atof(str)>0.) stv=atof(str); else stv=1.; info.kod_alg=s98(0,n6); /* if(info.kod_alg == 1) // "дневник" r[2]=dney_v_tab(rsimv,calm,info.z1,info.z2); else { // "часовик" skoljko(r[2],data,info.z1,info.z2,rsimv,calm,cht); //rvvid("*",6.,0,r[2]); } */ 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; //n6=r[2]/norm(info.kod_alg); n6=r[2]/norm(2); s100("н",0,stolbec-1,sum); //выборка по ст. ТВХ //s1001simv("1","н",info.d1,info.d2,0,stolbec-1,sum,0,0); double SumMROT = info.bz*n6*stv; n8=SumMROT-sum; if(n8>0.) info.n1=n8; else info.n1=0.; if(FL_V_ALG && uprc != NO_SCREEN) { infolist.add_record("ФРВ:НРВ",n6); infolist.add_record("ФРВ",r[2]); infolist.add_record("НРВ",norm(2)); infolist.add_record("МРОТ",stv*bz); infolist.add_record("МРОТ факт",SumMROT); infolist.add_record("ФОТ",sum); infolist.add_record("Результат",info.n1); } return code_Break; } case 978: { // Выслуга лет // 17.04.97 //procent_ot_staga(78,"datavys",1,0,31,crow,d1,d2,&n3); //по-старому double n3; procent_ot_staga(78,"datavys",1,0,1,info.crow,info.d1,info.d2,n3); // n3 - % от стажа double n6; r[2]=n3; s1001simv("1","*",info.d1,info.d2,m,25,r9,0,0); info.n1=r9*n3/100; 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("ФРВ дни",r[2]); infolist.add_record("Выборка",r9); infolist.add_record("Процент выслуги",n3); infolist.add_record("Результат",info.n1); } return code_Break; } case 917: { // r[2] - факт // n7 - норма из сетки 83 // n5 - оклад // if (Value_For_Table_Cod(82,ikod,data,n7)==EOF) break; if (n7==0.) break; worktime(info.crow,info.b3,0); char t[20]; if (nkalend==knorm) /* если строка считается по основному графику ЛС */ //skoljko(r[2],data,z1,z2,rsimv,calm,cht); if((info.c=korrv(r,t,0,info.h,flagrow,jf)) != 1) return code_ReturnCode; s1001simv("1","*",info.d1,info.d2,m,29,n5,0,0); info.n1=r[2]/n7*n5*info.bz/100.; if(FL_V_ALG && uprc != NO_SCREEN) { infolist.add_record("Сумма",n5); infolist.add_record("Рабочее время",r[2]); infolist.add_record("Норма часов",n7); infolist.add_record("Процент",info.bz); infolist.add_record("Результат",info.n1); } return code_Break; } case 717: { // Параметры алгоритма. struct Struct_Alg Work; Get_AlgWithParam(Work,info.ikod); // параметр 1 - Номер столбца ТВХ для расчета ставки int st = 25; // Номер столбца ТВХ по умолчанию if (Work.Count_Par>0) { st = atoi(reinterpret_cast_to_string(Work.List_Par[0])); } double n5; s96Col(st-1,info.d1,info.d2,n5,1); char t[20]; if((info.c=korrv(r,t,0,info.h,flagrow,jf)) != 1) return code_ReturnCode; info.n1=n5*r[2]*info.bz/100.; if(FL_V_ALG && uprc != NO_SCREEN) { infolist.add_record("Столбец для расчета ставки",st); infolist.add_record("Ставка",n5); infolist.add_record("Рабочее время",r[2]); infolist.add_record("Процент выплаты",info.bz); infolist.add_record("Результат",info.n1); } return code_Break; } // конец описания алгоритмов пользователя // Пример вызова алгоритма пользователя. //case 4: // return UserAlg4(info,r); case 17: return UserAlg17(info,r); case 28: return UserAlg28(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; } UserAlg28(&info,&r) /* ЧС * ФРВ(128) + ночные_праздничные(717) где ЧС(ставка за час)= (оклад(106) + 30% (278) + 30% (121))/ НРВ */ { struct Struct_Alg Work; Get_AlgWithParam(Work,info.ikod); // 31.01.1995 int stolbec=ST_STAVKA+1; // Work.Count_Par - число паpаметpов для кода алгоpитма //-- параметр 1 - столбец для расчета ставки через ras_normzar if (Work.Count_Par>0) { int i=atoi(reinterpret_cast_to_string(Work.List_Par[0])); if (i > 0 && i <= 99) stolbec=i; } bool useNormZar=false; //-- параметр 2 - рассчитывать ставку через ras_normzar if (Work.Count_Par>1) { int i=atoi(reinterpret_cast_to_string(Work.List_Par[1])); if ( i!=0 ) useNormZar=true; } double stavka; if(useNormZar) { BeforeRasNormzarFillRvMap(); //дата начала вида, либо первое число месяца. var db=KDateFromD(info.d1); if(!db.IsValid() || db.GetAbs()0) { int i=atoi(reinterpret_cast_to_string(Work.List_Par[0])); if (i > 0 && i <= 99) stolbec=i; } bool useNormZar=false; //-- параметр 2 - рассчитывать ставку через ras_normzar if (Work.Count_Par>1) { int i=atoi(reinterpret_cast_to_string(Work.List_Par[1])); if ( i!=0 ) useNormZar=true; } if(Work.Count_Par>2) { char s[256];sprintf(s,"Неверное количество параметров\r\nУказано параметров:%d\r\nМаксимальное количество для 17 алгоритма:2",Work.Count_Par); AmbaMessageBox(to_string(s),"Ошибка!",MB_OK|MB_ICONERROR,0); return code_Break; } // допл. за ночн. время; РВ - в часах // БЗ - процент доплаты double stavka; if(useNormZar) { BeforeRasNormzarFillRvMap(); //дата начала вида, либо первое число месяца. var db=KDateFromD(info.d1); if(!db.IsValid() || db.GetAbs() 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()