0
Отвечен

Алименты по месяцу начисления

Игорь Шалдин 6 лет назад в Расчеты начислений и удержаний / Алгоритмы обновлен Орлов Андрей (Ведущий разработчик) 1 год назад 17

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


На старом форуме взял скрипт, позволяющий рассчитать алименты с учётом сумм заработка по месяцу начисления (актуально для расчёта алиментов с сумм "переходящего отпуска"):


UserAlg608(&info,&r)   // алименты по по мес начисл
{
   int stolbec = 9;       //--- выборка начислений за текущий месяц
   double n2;
   toMatrLS();
   n2=CollectSumm(stolbec-1,0,mrasch, CL_MV | CL_COL | CL_NACH );                                      
   //--- выборка удержаний за текущий месяц
   double n3;
   n3 = CollectSumm(stolbec-1,0,mrasch, CL_MV | CL_COL | CL_UD);
   
   //--- выборка удержаний за прошлый месяц, если они назначены
   double n4=0;
   double k_nep;    int mes = 0;
   char M_T_1[90];                                                                          
   sprintf(M_T_1,"%i.01",atoi(data));                                                       
   double MesTek1 = static_cast_to_double(M_T_1);                                               char M_T_2[90];
   sprintf(M_T_2,"%i.%i",atoi(data),atoi(countday));
   double MesTek2 = static_cast_to_double(M_T_2);    double zz1=info.d1; if(atoi(info.d1) < atoi(MesTek1))  zz1=MesTek1;
   double zz2=info.d2; if(atoi(info.d2) > atoi(MesTek2))  zz2=MesTek2;    nepoln(zz1,zz2,MesTek1,MesTek2,k_nep,1);    double t_nu=n2-n3-n4;
   double res1 = t_nu*info.bz/100.;
   
   info.n1=res1*k_nep;    if(FL_V_ALG && uprc != NO_SCREEN)
   {
      infolist.add_record("Начисления",n2);
      infolist.add_record("Удержания",n3);
      infolist.add_record("Столбец Т/В",stolbec);
      infolist.add_record("Начисл. - Удержержано",t_nu);
      infolist.add_record("Проц. алиментов",info.bz);
      infolist.add_record("ПромежутРезультат",res1);       infolist.add_record("Дат_нач",info.d1);
      infolist.add_record("Дат_кон",info.d2);
      //infolist.add_record("Зед_1",z1);
      //infolist.add_record("Зед_2",z2);
      infolist.add_record("Неполн",k_nep);
      infolist.add_record("ДатТек1",MesTek1);
      infolist.add_record("ДатТек2",MesTek2);
      infolist.add_record("ИтоговыйРезультат",info.n1);
   }
   var simv=poiskprch(info.ikod);
   if(simv == 4)
   {
   char str[81];
   char str1[81];
      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_Break;
}

Работает всё хорошо, но только если в ЛС один источник/совместительство. Если их несколько, в выборку попадают суммы по всем источникам/совместительствам.

Можно ли функцию CollectSumm  научить выбирать суммы только по тому источнику/совместительству, по которому заведён вид алиментов? Ну или что можно использовать вместо неё?


З.Ы. Смотрел "стандартный" скрипт алиментов: 


// алименты
   // 06.10.1999
   //--- выборка начислений за текущий месяц
   s1001simv("1","н",info.d1,info.d2,0,ST_ALIMENT,info.n1,2,0);  // 08.11.95
   //--- выборка удержаний за текущий месяц
   double n3;
   s1001simv("1","у",info.d1,info.d2,0,ST_ALIMENT,n3,2,0);
   //--- выборка удержаний за прошлый месяц, если они назначены
   double n4;
   s1001simv("2","у",info.d1,info.d2,-1,ST_ALIMENT,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("Столбец Т/В",ST_ALIMENT+1);
      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;
}


Тут другая беда:  функция s1001simv  умеет выбирать суммы с учетом источника/совместительства, но не умеет выбирать суммы по месяцу начисления. Чем её можно заменить?



Script

Ответ

Ответ
Отвечен
var CurProp = GetCurPropCountLS();
...
n2=CollectSummProp(stolbec-1,0,mrasch, CL_MV | CL_COL | CL_NACH,CurProp);
...
n3 = CollectSummProp(stolbec-1,0,mrasch, CL_MV | CL_COL | CL_UD,CurProp);
Ответ
Отвечен
var CurProp = GetCurPropCountLS();
...
n2=CollectSummProp(stolbec-1,0,mrasch, CL_MV | CL_COL | CL_NACH,CurProp);
...
n3 = CollectSummProp(stolbec-1,0,mrasch, CL_MV | CL_COL | CL_UD,CurProp);

Вместо s1001simv можно использовать s1001simv_mv ( Flag==CL_MV | CL_COL | CL_NACH)

Это первое что попробовал.

Делал так:

s1001simv("1","н",info.d1,info.d2,0,ST_ALIMENT,info.n1,2,0); 

заменил на:

info.n1 = s1001simv_mv("1",info.d1,info.d2,0,ST_ALIMENT,2, CL_MV | CL_COL | CL_NACH, 0 );

Не взлетело 


Что сделал не так?

s1001simv_mv выборку по источникам делает (в данном случае по всем источникам). Если у вас источники - то взлетит если вместо 0 перед ST_ALIMENT укажете mrasch.

Если же исп.должности нужны то 

var CurProp = GetCurPropCountLS();
info.n1 = s1001simv_mv("1",info.d1,info.d2,mrasch,ST_ALIMENT,2, CL_MV | CL_COL | CL_NACH, CurProp);



CL_COL надо тоже убрать из параметров.

Правильный флаг:  CL_EXACT | CL_MV | CL_NACH для начислений и CL_EXACT | CL_MV | CL_UD - для удержаний. В противном случае если будет несколько строк с одинаковым кодом, суммы по этому коду удвоятся.

Оба алгоритма поправили :)
Может нам параметризовать поставочный? :)

Большинству клиентов реализованный в КЗ расчёт алиментов с преходящего отпуска категорически не нравится. Но есть и такие, которых всё устраивает (м.б. просто не обращают внимание?). Поэтому параметризовать поставочный было бы здорово.

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

в поставку добавили параметр 0 - по принадлежности, 1 - по начислению 

+1

Добрый день! 

Поменяли у вида алиментов параметр По начислению=1.

Начисляем отпуск в марте за апрель, допустим, с 10.04 по 15.04.

С этой суммы отпускных в марте алименты не удерживаются, закрываем месяц, переходим на апрель, и в апреле алименты не посчитались с этой суммы.


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

Надеялись, что поправили, когда алименты по начислению не видят строки за пределами действия дат текущего месяца (бл, отп и тд) :(

Поправьте, пожалуйста или скажите, как правильнее поправить.

можете пока что 2 поставить в параметры алгоритма (но тогда лучше исключить вид 318 при пересчетах за прошлые месяцы)
в поставке такой же расчет сделаем по-умолчанию с "Месяц начала расчета НДФЛ по кассе"

Не совсем понятно, как будет отрабатывать 2, если возможные значения первого параметра 0 и 1

в списке изменений к 11.05.2018 релиз 597.19

есть пункт 8) Еще один способ выборки доходов для алиментов. По месяцу начисления, без учета дат действия строк (в ТВХ в первом параметре для 218 алгоритма надо поставить 2)


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

Надеялись, что поправили, когда алименты по начислению не видят строки за пределами действия дат текущего месяца (бл, отп и тд) :(

Поправьте, пожалуйста или скажите, как правильнее поправить.

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