0
Отвечен

Как отбросить дробную часть из базового значения оклада

Анатолий Русин 5 лет назад в Расчеты начислений и удержаний обновлен Гашков Николай (Эксперт) 5 лет назад 11

Добрый день!

По мотивам темы https://kontur.userecho.com/communities/47/topics/7929-kak-v-skripte-vyibrat-znachenie-iz-setki возник ещё вопрос.

В организации БЗ оклада берётся из сетки ПКГ.

Если сотрудник работает не на полную ставку, то номер строки сетки приходит из КП в дробном виде. Нпример, "4,25", "2,5" и т.д.

Вопрос - как сделать так, чтобы при расчёте оклада базовое значение бралось всегда на полную ставку?

Если взять за основу стандартный 4-й алгоритм.

Script
ХОРОШО, МНЕ ПОНРАВИЛОСЬ
Оценка удовлетворенности от Анатолий Русин 5 лет назад
На рассмотрении

Добрый день!

Вопрос - как сделать так, чтобы при расчёте оклада базовое значение бралось всегда на полную ставку?

Всегда писать в БЗ целое значение без дробной части?

Можно использовать atoi(), для того чтобы получить "целую часть".

>>Всегда писать в БЗ целое значение без дробной части?

да, мы тоже думали о том, чтобы закомментировать кусок кода в скрипте обработки писем интеграции, который отвечает за дописывание дробной части.

Но с учётом всего, что было разнесено ранее за три года работы, решили так не делать.


>>Можно использовать atoi(), для того чтобы получить "целую часть"

Вопрос как раз в том, в какой части поставочного скрипта SysAlg4_6 это сделать?

Когда скопируем его в Usalg.s, конечно.

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

то что было разнесено - принимаете в таблицу, отбрасываете дробную часть - разносите обратно..

Кто-нибудь подскажет где именно (в каком скрипте) можно использовать atoi(), для того чтобы получить "целую часть"?

как то так, если БЗ не менялось...

      //финт ушами:
      int razryad=   GetBase(info.crow);
      double bz=0.; 
      Value_For_Table_Cod(4,razryad, data, bz);            
      info.n1=r[2]*bz/norm(idxNorm);
      if(FL_V_ALG && uprc != NO_SCREEN)
      {
         infolist.add_record("Рабочее время",r[2]);
         infolist.add_record(bHours?"Норма часов":"Норма дней",norm(idxNorm));
         infolist.add_record("Оклад",bz);
         infolist.add_record("Результат",info.n1);
      }

Этот "финт ушами" работает строго по 4-й сетке, а мне надо по "плавающей" сетке, т.к. сетку, из которой берётся оклад, определяет ПКГ, указанная в кадровой части.

Сделал так:

      char str[256];
var IDate = CreateObject("KDate"); IDate.SetDate(static_cast_to_string(data));
GetKchValue("p_k_g",str,2,IDate);
int p_k_g=atoi(str);

int razryad = GetBase(info.crow);
double bz=0.;
Value_For_Table_Cod(p_k_g,razryad, data, bz);
info.n1=r[2]*bz/norm(idxNorm);

Вроде работает...

Но есть сомнения - может где-то всё-таки накосячил?

я бы значение пкг брал на конец месяца...

А как это лучше сделать?

char str[256];

GetKchValue("p_k_g",str,2,KDateFromInt_LastDay(KDateFromStr(to_string(data)).GetAbs()));

int p_k_g=atoi(str);

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