// 2023 - Справка в службу занятости // Расчет среднего по ПП от 24 июня 2023 г. N 1026 // Сама форма по Приказ Минтруда РФ от 27.07.2023 N 604Н AverageIncomeDismissalDate(idCombine) // Дата увольнения // idCombine - в том случае если таблицу переведем с разбивкой "по исп.должностям" - исп.должность для которой хотим. // Если 0 - считаем что не задан и определяем по основной должности { int combine = idCombine ? idCombine : GetGeneralCombineLS(); var tmpComb=CreateObject("TmpCurCombine"); tmpComb.Init(combine); //устанавливаем должность текущей char str[256];kch_from("data_uv",str); var dUv=KDateFromStr(to_string(str)); if (dUv.IsValid()) return dUv.GetStr(); return " . . "; } AverageIncomeMonthCalculation(dateStr) // Определения первого месяца расчетного периода // dateStr - дата увольнения. Может быть пустой. Тогда считаем как будто увольнение было/будет в текущем месяце системы. { var kDate=KDateFromStr(dateStr); int month=kDate.IsValid() ? kDate.GetAbs() : mtek; //если дата увольнения не указана считаем что как будто уволили в текущем месяце системы // Средний заработок исчисляется за 3 календарных месяца, предшествующих календарному месяцу перед месяцем увольнения гражданина (по ПП 1026) int offsetMonth = GetCommonCnfInt("HowMonthSr" ,"SprSlZan")==1?1:0; // 0 - средний от месяца увольения, 1 - сдвигаемся на 1 месяц от месяца увольнения. month -= 1+offsetMonth; return KMonthFromInt(month).GetStr(); } AverageIncomeCalcInfo(idCombine,dUv,monthStr) // Подсчет суммы среднего (и другой вспомогательной информации нужной для формы печати { var dateUv=KDateFromStr(dUv); if ( !dateUv.IsValid() ) dateUv = KDateFromInt_WithDay(1,mtek); var kDate=KDateFromStr(monthStr); var dateMonthSr=KDateFromInt_WithDay(1,kDate.GetAbs()); //класс для расчета среднего var sredn = CreateObject("KCalcSredn"); var Dat=CreateObject("KDate"); if ( sredn.InitSredn(-1,0,dateUv,0)==ESC ) return ""; var Nastr = sredn.GetNastr(); Nastr.SetMonthSr(dateMonthSr); int countMonth=3;//количество месяцев для расчета - 3 (потом можно вынести в настройку) Nastr.SetNastr(DEFAULT_MES,countMonth); // количество месяцев в расчетном периоде Nastr.SetNastr(TIP_RV,1); // среднее в днях Nastr.SetNastr(FLAG_SILENT,1); // чтобы никаких запросов от среднего не лезло int offsetMonth = GetCommonCnfInt("HowMonthSr" ,"SprSlZan")==1?1:0; // 0 - средний от месяца увольения, 1 - сдвигаемся на 1 месяц от месяца увольнения. Nastr.SetNastr(SR_COUNT_MAX_MONTH,12+1); // 12 прошлых от месяца увольнения + текущий Nastr.SetNastr(WHAT_DO_ZERO_SUM,6); // 0 - шагаем "назад" периодами по DEFAULT_MES месяцев, 6 - ищем первый ненулевой месяц и от него откладываем период DEFAULT_MES месяцев int showSredn = GetCommonCnfInt("showTSredn" ,"SprSlZan")!=0?1:0; // 1 - показывать таблицу среднего, 0 - нет if ( showSredn ) { var fio = GetFioFromKch(); Nastr.SetTitleForTableSredn(fio+Oem("- cредний для службы занятости")); } sredn.Calculate(showSredn); // расчет среднего double totalRv=AverageIncomeGetTotalRv(sredn); // подсчет отработанного времени за расчетный период double sumSredn=sredn.SumSredn(); // сумма среднего дневного (см.выше, считаем в днях) заработка int cntM = AverageIncomeGetCountMonth(sredn); // запрашиваем у класса среднего, так как из-за "сдвигов" периодов число месяцев могло измениться по сравнению с начальным! if ( !cntM ) cntM = countMonth; return to_string(cntM) + "_" + to_string(totalRv) + "_" + to_string(sumSredn); } AverageIncomeGetTotalRv(sredn) { double totalRv=sredn.GetItogInfo().GetDopInfo(M_NRV_SR); /* добавил доступ к методу GetItogInfo поэтому стало можно проще получать double totalRv=0.; for (int idxMonth=0; idxMonth0 ? workPeriods.GetLastDateBeg().ToString() : ""; // возьмем дату начала последнего периода return hireDate; } AverageIncomePeriodWork(idCombine, hireDate, fireDate) { int combine = idCombine ? idCombine : GetGeneralCombineLS(); // по идее нас должен интересовать период работы, относящийся только к этой должности var periodBeg=Str_Cmp("",hireDate," ./")==0 ? "" : hireDate; var periodEnd=Str_Cmp("",fireDate," ./")==0 ? "" : fireDate; return periodBeg+"-"+periodEnd; } AverageIncomePeriodBir(idCombine, hireDate, fireDate, how) { var date=KDateFromStr(fireDate); int month=date.IsValid() ? date.GetAbs() : mtek; //если дата увольнения не указана считаем что как будто уволили в текущем месяце системы var db=KDateFromInt_WithDay(1,month-12); var de=KDateFromInt_LastDay(month-1); var stageAdditionalInfoCodes=MapFromStr("ДЕКРЕТ",","); return GetPeriodByStag(stageAdditionalInfoCodes,db.GetStr(),de.GetStr(), how); } AverageIncomePeriodChildCare(idCombine, hireDate, fireDate, how) { var date=KDateFromStr(fireDate); int month=date.IsValid() ? date.GetAbs() : mtek; //если дата увольнения не указана считаем что как будто уволили в текущем месяце системы var db=KDateFromInt_WithDay(1,month-12); var de=KDateFromInt_LastDay(month-1); var stageAdditionalInfoCodes=MapFromStr("ДЕТИ,ДЛДЕТИ",","); return GetPeriodByStag(stageAdditionalInfoCodes,db.GetStr(),de.GetStr(), how); } AverageIncomePeriodWithOutPayBeg(idCombine, hireDate, fireDate, how) { var date=KDateFromStr(fireDate); int month=date.IsValid() ? date.GetAbs() : mtek; //если дата увольнения не указана считаем что как будто уволили в текущем месяце системы var db=KDateFromInt_WithDay(1,month-12); var de=KDateFromInt_LastDay(month-1); var stageAdditionalInfoCodes=MapFromStr("НЕОПЛ",","); string dbStr = db.GetStr(), deStr = de.GetStr(); string per = GetPeriodDatesByStag(stageAdditionalInfoCodes,dbStr,deStr, how); db = KDateFromStr(dbStr); de = KDateFromStr(deStr); // Проверим что найденный период не меньше 9 месяцев if ( db.IsValid() && de.IsValid() ) { int year = 0, month = 0, day = 0; de.Inc(); CalculateStag(db,de, year, month, day,0,""); if ( month>=9 ) return per; } return "-"; } GetPeriodDatesByStag(stageAdditionalInfoCodes,&db,&de,how) // Выборка периода по особым условиям труда в стаже // how - 0 - минимальная дата начала и максимальная дата конца // - 1 - даты от последнего периода // - 2 - список периодов через точку с запятой. // - 3 - максимальный { var periods = CreateObject("KDatePeriods"); char func[256], buf[256]; sprintf(func,AnsiToOem("СТАЖ_ЗА_ПЕРИОД(-100,3,%s,%s)"),db,de); CallFuncReceive(func,buf,255,0); CallFuncReceive(AnsiToOem("СТАЖ_ЗА_ПЕРИОД(100,СКОЛЬКО)"),buf,255,0); int CountStag = atoi(buf); for ( int i=1; i<=CountStag ; ++i ) { sprintf(func,AnsiToOem("СТАЖ_ЗА_ПЕРИОД(%d,ДОПТРСТ)"),i); CallFuncReceive(func,buf,255,0); string str = OemToAnsi(RTrimS(buf)); // доп.условия стажа if (stageAdditionalInfoCodes.IsExist(str)) { sprintf(func,AnsiToOem("СТАЖ_ЗА_ПЕРИОД(%d,ДАТАНАЧ)"),i); CallFuncReceive(func,buf,255,0); var db=to_string(buf); sprintf(func,AnsiToOem("СТАЖ_ЗА_ПЕРИОД(%d,ДАТАКОН)"),i); CallFuncReceive(func,buf,255,0); var de=to_string(buf); periods.Update(db,de,str); } } CallFuncReceive(AnsiToOem("СТАЖ_ЗА_ПЕРИОД(-1)"),buf,255,0); // очистить то, что на "автодобавляли" periods.Crop(db,de); db = de = ""; if ( periods.Count()>0 ) { if ( how==3 ) // интересует максимальный, если они одинаковые, то последний { int countMaxDays = 0; for ( periods.SetBegin(); !periods.End(); periods.Next() ) { int countDays = periods.GetCurEnd().Diff(periods.GetCurBeg()) + 1; if ( countDays>=countMaxDays ) { countMaxDays = countDays; de = periods.GetCurEnd().ToString(); db = periods.GetCurBeg().ToString(); } } } else { de = periods.GetDateEnd().ToString(); db = how==1 ? periods.GetLastDateBeg().ToString() : periods.GetDateBeg().ToString(); if ( how == 2 ) { string allPeriods = ""; int cnt=0; for ( periods.SetBegin(); !periods.End(); periods.Next(),++cnt ) allPeriods += (cnt?";":"") + periods.GetCurBeg().ToString()+"-"+periods.GetCurEnd().ToString(); return allPeriods; } } } return db+"-"+de; } GetPeriodByStag(stageAdditionalInfoCodes,db,de,how) { return GetPeriodDatesByStag(stageAdditionalInfoCodes,db,de,how); } PrintAverageIncomeForEmploymentService() { var curFile = CreateObject("CurPrnFile"); curFile.SetFlagBrowse(0); curFile.SetFlag_Print(0); var table = CreateObject("CurPrnTbl"); table.CodePage = WinCodePage; KZMainDomain().GetAverageIncomePrintHelper().PrintAverageIncome(table,GetCurEnterprise()); } /* AverageIncomeSumForMonth(str) // Вычисление средней суммы за месяц (сейчас не используется, расчет делается прямо в таблице) { int countMonth =atoi(GetElementFromString(0,str,"_")); if (countMonth<1) return 0.0; double totalRv =atof(GetElementFromString(1,str,"_")); double sumSredn=atof(GetElementFromString(2,str,"_")); //https://www.klerk.ru/buh/articles/580710/ //1)Определяется среднемесячное количество дней в этих 3 месяцах //2)Рассчитывается среднедневной заработок //3)Среднедневной заработок умножается на среднемесячное число дней double monthSum=(totalRv/countMonth)*sumSredn; round(monthSum); return monthSum; } */