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

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

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

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

Работнику установлен оклад = 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;
}

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