0
Ищется ответ

Расчет надбавки за выслугу

Игорь Шалдин 3 года назад в Расчеты начислений и удержаний / Алгоритмы обновлен Алексей П 2 месяца назад 17

Здравствуйте.

Работнику установлен оклад = 10000 руб и надбавка за выслугу. Расчет выслуги по сетке. График работы - каждый день по 8 часов (аттестованные).

В ночь с 27.04 на 28.04 процент выслуги меняется с 5 на 10. 

Если отработан весь апрель, сумма надбавки:

с 01.04 по 27.04: 10000/30*27*5% = 450 руб.

с 28.04 по 30.04: 10000/30*3*10% = 100 руб.

Общая сумма надбавки = 450 + 100 = 550 руб.

Считаю в КЗ, получаю тот же результат. Тут всё ok.

Если апрель отработан не полностью (с 28.04 сотрудник в отпуске), то, по утверждению клиента, для расчета надбавки должен учитываться только тот процент, который действовал до момента возникновения права на увеличение процента от от стажа. В данном случае - это 5%. Т.е. сумма надбавки:

с 01.04 по 27.04: 10000/30*27*5% = 450 руб.

с 28.04 по 30.04: 10000/30*0*10% = 0 руб.

Штатный алгоритм 178 так делать не умеет. Как можно исправит ситуацию?

На рассмотрении

Ставлю статус "отвечен".

Нет других вариантов закрыть топик..

Я клиенту нарисовал свой скрипт для расчета выслуги. Но надо бы на уровне поставки вопрос решить. Получается, что в месяце смены процента 178 алгоритм всю жизнь считал не правильно...

у функции procent_ot_staga, которая используется в алгоритме выслуги, есть параметр tip_usredn

Не пробовали им поиграться? Возможно значение 2 подойдет..

Пробовал, конечно. Этот параметр корректно отрабатывает только если смена процента произошла в полностью отработанном месяце.

ИМХО, надо не "усреднять" а считать так:

1. Сумма до смены процента = дневная ставка * ФРВ до смены * старый %

2. Сумма после смены процента = дневная ставка * ФРВ после смены * новый %

3. Общая сумма = п.1 + п.2

Вот что придумалось (дилетантство, конечно, но вроде бы работает):

case 878:
{
struct Struct_Alg Work;
Get_AlgWithParam(Work,info.ikod);

// параметр 1 - номер сетки
int NumSet = 78; // номер сетки по умолчанию
if(Work.Count_Par > 0)
{
NumSet = atoi(reinterpret_cast_to_string(Work.List_Par[0]));
}
// параметр 2 - номер столбца ТВХ для расчета ставки
int stolbec = 1001; // номер столбца по умолчанию
if(Work.Count_Par > 1)
{
NumSet = atoi(reinterpret_cast_to_string(Work.List_Par[1]));
}
char data_sm_kch[20], data_sm_tek[20];
GetKchDate("datavys",data_sm_kch,6,KDateFromStr(datatek)); // дата из поля КЧ "datavys"
sprintf(data_sm_tek,"%s%d",data_sm_kch,gtek); // дата смены процента в текущем году в формате ДД.ММ.ГГГГ
double data_double = GetDateFromFuncRWScript(data_sm_tek); // дата смены процента в текущем году в формате ГГГГММ.ДД
int day_sm = SubStr(data_sm_tek,0,2); // день смены процента

int kol_day_mes = dney_v_tab("Р",calm,info.z1,info.z2); // количество рабочих дней в месяце
int kol_day_before = dney_v_tab("Р",calm,info.z1,day_sm-1); // количество рабочих дней до смены процента
int kol_day_after = dney_v_tab("Р",calm,day_sm,info.z2); // количество рабочих дней после смены процента

double st,st_dn;
s97col(stolbec,info.d1,info.d2,st_dn,st,1); // st_dn - дневная ставка

double pr, pr_old, pr_new, summ1, summ2;
if(kol_day_before==0)
{
procent_ot_staga(NumSet,"datavys",31,0,1,info.crow,info.d1,data_double,pr); // процент действует весь месяц
info.n1 = st_dn*kol_day_mes*pr/100;
pr_old = pr;
}
else
{
procent_ot_staga(NumSet,"datavys",1,0,1,info.crow,info.d1,data_double-0.01,pr_old); // старый процент
procent_ot_staga(NumSet,"datavys",1,0,1,info.crow,data_double,info.d2,pr_new); // новый процент
summ1 = st_dn*kol_day_before*pr_old/100;
summ2 = st_dn*kol_day_after*pr_new/100;
info.n1 = summ1 + summ2;
}

if(FL_V_ALG && uprc != NO_SCREEN)
{
infolist.add_record("дата смены %",data_sm_tek);
infolist.add_record("ФРВ до смены % ",kol_day_before);
infolist.add_record("ФРВ после смены %",kol_day_after);
infolist.add_record("старый процент",pr_old);
infolist.add_record("новый процент",pr_new);
infolist.add_record("ставка",st_dn);
infolist.add_record("Результат",info.n1);
}
return code_Break;
}

Добрый день!.

Также интересует этот вопрос. Так понимаем это нужно вносить изменения в скрипт? Подскажите куда именно?

Добрый день!

Попробовали добавить указанный выше алгоритм в скрипт, и указали его в ТВХ 

Image 8677

Image 8678

Image 8679

Но при  расчет выслуги выдает просто нулевую сумму.

Что мы делаем не так ? ZPL_zplinfo_full(20241010_113221).cab
USALG.S

в алгоритме предусмотрен показ "расчетных параметров"

Рассчитайте строку по F4 и нажмите F5 когда курсор дойдет до суммы.

Сетка для процентов точно 78? Если нет, надо указать в параметрах алгоритма нужную.


В алгоритме есть ошибка (не критично, если столбец для расчета ставки стандартный):

Image 8683

сетка 78 стандартная. Столбец для ставки тоже. Нужно внести изменения вместо NumSet указать stolbec ?

По F4 и потом F5 ничего не раскрывается. Если по алгоритму 178, то да, видим показ расчетных параметров. 

Но по алгоритму 878 не дает.

Развернул Вашу сохраненку. Считаю выслугу:

Image 8684

Нужно внести изменения вместо NumSet указать stolbec ?

Если в дальнейшем появится необходимость считать ставку для расчета выслуги по пользовательскому столбцу ТВХ, то без исправления этой ошибки указать нужный номер столбца через параметры не удастся.

Попробовали на поставочной версии. Тоже расчет не происходит

Заменили в скрипте на stolbec и все заработало. Столбец не меняли, в параметрах алгоритма ничего не указывали.

На NumSet не работало на настройках по умолчанию. После изменения на stolbec все корректно. 

Спасибо.

У кого была смена процента по стажу в течении текущего месяца (в октябре) - все хорошо посчиталось как и надо. 

Но теперь сбилось у остальных сотрудников. К примеру сотрудник был принят 23.05.2023. Процент до достижения стажа 5 лет - 10%

Image 8695

При расчете выслуги за Октябрь ставится дата 23.05.2024 почему-то и процент до смены - 0% откуда-то

Image 8694

Сервис поддержки клиентов работает на платформе UserEcho