View Issue Details

IDProjectCategoryView StatusLast Update
0000942ЗарплатаGeneralpublic2018-04-16 16:29
Reporterruslan Assigned Toruslan  
PriorityurgentSeveritycrashReproducibilityalways
Status resolvedResolutionfixed 
Summary0000942: -Зарплата- Расчет больничных при отработанном периоде менее 12 месяцев на предприятии
DescriptionРасчет среднендневной ЗП происходит некорректно. потому что неправильно рассчитывается период расчета.
1. При отработанном периоде менее 12 месяцев, но более 1 полного календарного месяца до момента наступления больничного. Расчетный период берется с 01 по последний день месяца ПОЛНЫХ отработанных месяцев до наступления страхового случая(т.е. больничного).
2. При отработанном периоде менее 1 полного календарного месяца(с 01 по последнее число месяца) до наступления страхового случая(больничного) считается фактически отработанное до наступления страхового случая кол-во дней...
Additional InformationВ принципе в форме расчета период по умолчанию 12 месяцев, однако при расчете нужно учитывать фактически отработанное время на предприятии до даты больничного в полных месяцах, и соответственно брать кол-во дней не просто по кол-ву месяцев указанных пользователем, а именно с учетом отработанных на предприятии. Например,
1. Сотрудник устроен с 12.12.2015 в марте рассчитывают больничный с 24.02.2016 по 28.02.2016, период расчета будет с 01.01.2016 по 31.01.2016 -31 календарный день, допустим у сотрудника 3 дня отпуска за свой счет с 04.01.2016 по 06.01.2016 тогда расчетный период будет 31-3=28 календарных дней.
2. Если для случая п.1 больничный будет в в январе, например с 24.01 по 28.01 то расчетный период будет с 12.12.2015 по 23.01(43 дня календарных как вроде аналогично примеру http://epodatok.com.ua/ru/article/1124), НО вот как рассчитать ЗП за такой период я нигде не нашел.
TagsNo tags attached.

Relationships

related to 0000854 closedruslan -Изменить порядок расчета больничных с 01.06.2015 
related to 0001306 new -Зарплата-Справочники Начисления- Форма начислений Больничные - Добавить на форму флаг "Расчет по мин. ЗП" 

Activities

ruslan

2016-04-06 23:43

manager  

ruslan

2016-04-07 00:04

manager   ~0002358

Last edited: 2018-01-29 09:47

View 4 revisions

Месяц, в котором работник был принят на работу с первого рабочего дня, но не с первого календарного числа, не принимает участие в расчете выплат.
http://bz.ligazakon.ua/magazine_article/BZ009076

ruslan

2018-03-25 22:52

manager   ~0003401

Приложил процедуры для расчета и возможности печати расшифровки

ruslan

2018-04-02 16:43

manager  

ZPLT_CALCSLVBL1.sp (4,471 bytes)   
create procedure ZPLT_CALCSLVBL1 (
    PRSNID integer,
    BDATE timestamp,
    EDATE timestamp,
    BLDATE date,
    SUBTYP integer = 0)
returns (
    MONTH__SUMMA double precision,
    MONTH_DAYS double precision,
    MONTH_HLDDAYS integer,
    MONTH_WKNDAYS integer,
    MONTH_FCTDAYS double precision,
    WTIME double precision,
    MONTH_BLDAYS integer,
    DAYWITHOUTPAY double precision)
as
declare variable XDATE date;
declare variable DAYOFWEEK integer;
declare variable XDAYS double precision;
declare variable CDATE timestamp;
declare variable DATE1 timestamp;
declare variable DATE2 timestamp;
declare variable K double precision;
declare variable MZPID integer;
begin
    MONTH__SUMMA =0.0;
    MONTH_HLDDAYS =0.0;
    MONTH_FCTDAYS =0.0;
    WTIME =0.0;
    MONTH_BLDAYS =0;
    DAYWITHOUTPAY =0.0;
 /* ��������� ��� �� ������� ������ */
  select Days from Zplt_HldDays(:bDate, :eDate) into :Month_HLDDays;
  --���-�� ��������� ����
  month_days=0.0;
  --���-�� ���� ����
  month_wkndays=0.0;
  xDate = :bDate;
  while (:xDate <= :eDate) do begin
    Month_Days = Month_Days + 1;
    Select Result from F_DayOfWeek(:xDate) into :DayOfWeek;
    if (:DayOfWeek in (5,6)) then Month_WknDays = Month_WknDays + 1;
    xDate = :xDate + 1;
  end
  Month_FctDays=:Month_Days;
    /*������� ��� �� ������ ���*/
    for select CI.blDate, CI.elDate
    from ZpltCalcSlv S
    join ZpltCalcIncr CI on CI.SlvID=S.ID and CI.blDate <= :eDate and CI.elDate >= :bDate
    and CI.blDate is not Null and CI.elDate is not Null
    join ZpltIncr I on I.ID=CI.IncrID and I.System_Flag in (3, 8, 9)
    where S.PrsnID=:PrsnID
    into :Date1, :Date2 do begin
      if (:Date1 < :bDate) then Date1 = :bDate;
      if (:Date2 > :eDate) then Date2 = :eDate;
      select Result + 1 from F_ElapsedDays(:Date1, :Date2) into :XDays;
      Month_FctDays = :Month_FctDays - :XDays;
      Month_Bldays = :Month_Bldays + :XDays;
    end
    for select V.bDate, V.eDate
    from ZpltSertVacat V
    where V.PrsnID=:PrsnID and V.Typ=1
      and V.bDate <= :eDate and V.eDate >= :bDate
      and V.bDate is not Null and V.eDate is not Null
    into :Date1, :Date2 do begin
      if (:Date1 < :bDate) then Date1 = :bDate;
      if (:Date2 > :eDate) then Date2 = :eDate;
      select Result + 1 from F_ElapsedDays(:Date1, :Date2) into :XDays;
      DayWithOutPay = :DayWithOutPay + :XDays;
      Month_FctDays = :Month_FctDays - :DayWithOutPay;
    end

  Select xDate from F_MONTHLASTDAY(:edate) into :CDate;
  if (:edate<>:cdate) then edate=:cdate;
  --������������ �� ��� ����
  Select coalesce((Sum(S.wTime)),0.0) from ZpltCalcMst M, ZpltCalcSlv S
  where M.DAT_ >= :BDATE and M.DAT_ <= :EDATE and M.Avans=0
  and S.MstID=M.ID and S.PrsnID = :PrsnID into :WTime;
  --����� ��������� �� ���
  MONTH__SUMMA=0.0;
  Select coalesce(Sum(C.cSumma),0.0) from ZpltCalcMst M, ZpltCalcSlv S,
  ZpltCalcIncr C, ZpltIncr I
  where M.DAT_ >= :BDATE and M.DAT_ <= :EDATE and M.Avans=0
  and S.MstID=M.ID and S.PrsnID = :PrsnID and C.SlvID=S.ID
  and I.ID=C.IncrID
  -- ����� ��������, �����, ��������
  and (I.System_Flag in (0, 1, 7, 15) or I.System_Flag is Null or
  (I.System_Flag = 5 and :blDate >= '04.07.2015') )
  into :month__summa;
  --����� ���� ��������� ��� ������������ �������� ����(������ ��� ����� �� �����������
  -- ��� ������� ������ �� ������ ��)
  if (SubTyp=2) then
  begin
  select Result + 1 from F_ElapsedDays(:bdate, :CDate) into :XDays;
  Select coalesce(Sum(C.cSumma),0.0) from ZpltCalcMst M, ZpltCalcSlv S,
  ZpltCalcIncr C, ZpltIncr I
  where M.DAT_ >= :BDATE and M.DAT_ <= :CDate and M.Avans=0
  and S.MstID=M.ID and S.PrsnID = :PrsnID and C.SlvID=S.ID
  and I.ID=C.IncrID
  -- ����� ��������, �����, ��������
  and (I.System_Flag in (0, 1, 7, 15) or I.System_Flag is Null or
  (I.System_Flag = 5 and :blDate >= '04.07.2015') )
  -- and not upper(i.name) like '%�����%'
  -- ������ ��������� �����, ������ �������� �� ������ ����
  into :month__summa;
  k=(:month_days)/(:xdays);
  Month__Summa = round(:Month__Summa*:k,2);
  end
-- ����� �� ���������� ��
  if (:SubTyp = 3) then
  begin
    select ID from CurrTyp where Sys_Flag = 3 into :mzpID;
    select Val from Currency_GetValue(:mzpID, :eDate) into :Month__Summa;
    Month_Days= 30.44;
    Month_FctDays=:Month_Days;
  end
  Suspend;
end

ZPLT_CALCSLVBL1.sp (4,471 bytes)   

ruslan

2018-04-16 16:29

manager  

ZPLT_CALCSLVBL.sp (6,640 bytes)   
create or alter procedure ZPLT_CALCSLVBL (
    SIID integer)
returns (
    SUMMA double precision,
    BDATE timestamp,
    EDATE timestamp,
    ISUMMA double precision,
    SUMMA1 double precision,
    ALLDAYS double precision,
    WRKDAYS integer,
    HLDDAYS integer,
    WKNDAYS integer,
    FCTDAYS double precision,
    CLCDAYS integer,
    ALLDAYWITHOUTPAY double precision,
    ALLBLDAYS integer)
as
declare variable ID integer;
declare variable BLDATE date;
declare variable ELDATE date;
declare variable MONTHCNT integer;
declare variable SLVID integer;
declare variable PRSNID integer;
declare variable INP_DATE date;
declare variable OUT_DATE date;
declare variable DAYWTIME double precision;
declare variable WTIMEALL double precision;
declare variable BLPROC double precision;
declare variable MCNT integer;
declare variable XDATE date;
declare variable DAYOFWEEK integer;
declare variable XDAYS integer;
declare variable MROUND integer;
declare variable CDATE timestamp;
declare variable DATE1 timestamp;
declare variable DATE2 timestamp;
declare variable CALCTYPE integer;
declare variable MONTH__SUMMA double precision;
declare variable MONTH_DAYS double precision;
declare variable MONTH_HLDDAYS integer;
declare variable MONTH_WKNDAYS integer;
declare variable MONTH_FCTDAYS integer;
declare variable WTIME double precision;
declare variable MONTH_BLDAYS integer;
declare variable DAYWITHOUTPAY double precision;
declare variable BCDATE timestamp;
declare variable ECDATE timestamp;
declare variable BLDAYS integer;
declare variable SUBTYP integer;
begin
  Summa = 0.0;
  SubTyp=0;--������� ������ ���� ����� ��� �������������� ������ ����������� ���� � �������� �� ������ ���� ����� �� ����������
  Select CI.ID, CI.blDate, CI.elDate, CI.MonthCnt, CI.SlvID, CI.Proc, CoalEsce(CI.MRound, 0), M.DAT_
  from ZpltCalcIncr CI
  join ZpltCalcSlv S on S.ID=CI.SlvID
  join ZpltCalcMst M on M.ID=S.MstID
  where CI.ID=:SIID
  into :ID, :BLDATE, :ELDATE, :MonthCnt, :SlvID, :BLProc, :MRound, :cDate;
  CalcType = 0;
  if (:cDate >= '01.06.2015') then CalcType = 1;
  if (:ID is Null) then begin Suspend; Exit; end
  Select PrsnID from ZpltCalcSlv where ID=:SlvID into :PrsnID;
  Select Inp_Date, DayWTime from Personal where ID = :PrsnID into :Inp_Date, :DayWTime;
  Select Result from F_ElapsedDays(:blDate,:elDate) into :BLDays;
  BLDays = :BLDays + 1;
  --������ ���� ��� ������ �������� ������� �������� ������
  out_date = :blDate;
  while (out_date is not null)
  do
    begin
    eDate = :out_date; /* ������ ���� ��������� */
    out_date = (select first 1 CI.blDate
    from ZpltCalcSlv S
    join ZpltCalcIncr CI on CI.SlvID=S.ID
    and CI.blDate is not Null and CI.elDate is not Null
    join ZpltIncr I on I.ID=CI.IncrID and I.System_Flag in (3, 8, 9)
    where S.PrsnID=:PrsnID and  CI.elDate=:out_date-1.0 order by 1);
  end
  Out_date= :edate;
  /* ����� ��� ���� */
  Select xDate from f_MonthFirstDay(:eDate) into :eDate;
  /* ��������� ��� ��������� ���� */
  eDate = :eDate - 1.0;
  /* ����� ������� */
  mCnt = -:MonthCnt+1;
  Select xDate from F_AddMonth(:eDate, :mCnt) into :bDate;
  Select xDate from F_MonthFirstDay(:bDate) into :bDate;
  --��������� ���� ����� ������� �� ������:
  if (CalcType=1) then
  begin
  --��������� �������� ����� 12 �����
  if (bDate<Inp_Date) then  begin
   Select xDate from F_MONTHLASTDAY(:Inp_Date) into :bDate;
   bDate= :bDate + 1;
   --�������� � ������� ������������ �� ����
   Select xDate from F_MonthFirstDay(:Inp_Date) into :Date1;
   Select xDate from F_MonthFirstDay(:eDate) into :Date2;
   if (Date1=Inp_Date) then bDate=:Inp_Date;
   --��� ���� ������� ������������ ���
   if (Inp_Date>Date2) then
    begin
    bDate=:Inp_Date;
    --�� ������ ���� ������������ ���� ����� ������ �� ���������� �� �������� ������
    eDate=:out_date-1;
    end
   end
  end
  AllDays = 0; /* ����� � ������ ��� */
  WrkDays = 0;
  HldDays = 0;
  WknDays = 0;
  iSumma = 0;
  AllDayWithOutPay=0.0;
  AllBlDays=0.0;
  WTimeAll=0.0;
 /*������������� ���� ����� �������� ������ ������ ������*/
  for select f.bdate, f.edate from F_MONTHS_DATASET(:bDate, :eDate) f
  into :bcdate, :ecdate
  do begin
  --�� ������, ����� ��������� ��������� ���� ����
  if (:bcdate<:bdate) then bcdate=:bdate;
  --����� �� ������ ����� �� ����� ����� �� ���������� ��  SubTyp<>3 � ��������� ������ ������� �� ������ ���� ������ ��������
  if ((extract(month from :ecdate)-extract(month from :edate)=0)and (:ecdate>:edate)) then
  begin
   ecdate=:edate;
   if ((extract(month from :edate)-extract(month from :bdate)=1) and (SubTyp<>3)) then   SubTyp=2;
  end
  select Mbl.month__summa, mbl.month_days, mbl.month_hlddays, mbl.month_wkndays,
  mbl.month_fctdays, mbl.daywithoutpay, mbl.wtime, mbl.month_bldays
  from ZPLT_CALCSLVBL1(:prsnid, :bcdate, :ecdate, :bldate, :subtyp) MBl
  into :month__summa, :month_days, :month_hlddays, :month_wkndays,
  :month_fctdays, :daywithoutpay, :wtime, :month_bldays;
  AllDays = :AllDays + :Month_Days;
  /* ����� � ������ ��� */
  WrkDays = :WrkDays +(:Month_Days-:Month_HldDays-:Month_WknDays);
  HldDays = :HldDays + :Month_HldDays;
  WknDays = :WknDays + :Month_WknDays;
  iSumma = :iSumma + :month__summa;
  WTimeAll = :WTimeAll + :WTime;
  AllBlDays = :AllBldays + :Month_BlDays;
  AllDayWithOutPay = :AllDayWithOutPay+:DayWithOutPay;
  end
 /* ������� ��� �� �������� */
  xDate = :blDate;
  ClcDays = 0;
  while (:xDate <= :elDate) do begin
    ClcDays = ClcDays + 1;
    Select Result from F_DayOfWeek(:xDate) into :DayOfWeek;
    if (:DayOfWeek in (5,6)) then ClcDays = ClcDays - 1;
    xDate = :xDate + 1;
  end
  select Days from Zplt_HldDays(:blDate, :elDate) into :xDays;
  ClcDays = :ClcDays - :xDays;
  if (:DayWTime=0 or :DayWTime is Null) then DayWTime = 8;
  FctDays = :WTimeAll / :DayWTime;
  -- ������������ ��������
  Summa1 = :iSumma / (:WTimeAll / :DayWTime);
  /*����� ��������� ����� 2015 ����*/
  if (:CalcType=1) then begin
  FctDays = :alldays-:alldaywithoutpay-:Allbldays;
  ClcDays = :BlDays;
  end
  Summa1 = :iSumma / :FctDays;

  -- �������� � ���� ��������
  if (:MRound = 1) then Summa1 = Cast((Summa1 * 100.00) as integer) / 100.00;
  -- ����� ������
  Summa =  :Summa1 * :ClcDays / 100.00 * :BLProc;
  -- �������� � ���� ��������
  Summa = Cast(Cast((Summa * 100.0) as Integer) as double precision) / 100.0;
  Suspend;
end

ZPLT_CALCSLVBL.sp (6,640 bytes)   

Issue History

Date Modified Username Field Change
2016-04-06 23:43 ruslan New Issue
2016-04-06 23:43 ruslan File Added: Правила определения расчетного периода.png
2016-04-07 00:00 ruslan Relationship added related to 0000841
2016-04-07 00:00 ruslan Relationship deleted related to 0000841
2016-04-07 00:00 ruslan Relationship added related to 0000854
2016-04-07 00:04 ruslan Note Added: 0002358
2016-04-07 00:05 ruslan Note Edited: 0002358 View Revisions
2018-01-29 09:47 ruslan Note Edited: 0002358 View Revisions
2018-01-29 09:47 ruslan Note Edited: 0002358 View Revisions
2018-03-25 22:52 ruslan Note Added: 0003401
2018-03-25 22:52 ruslan Status new => resolved
2018-03-25 22:52 ruslan Resolution open => fixed
2018-03-25 22:52 ruslan Assigned To => ruslan
2018-03-25 22:53 ruslan File Added: ZPLT_CALCSLVBL.sp
2018-03-25 22:53 ruslan File Added: ZPLT_CALCSLVBL1.sp
2018-03-26 14:10 ruslan File Deleted: ZPLT_CALCSLVBL1.sp
2018-03-26 14:10 ruslan File Added: ZPLT_CALCSLVBL1.sp
2018-04-02 16:39 ruslan File Deleted: ZPLT_CALCSLVBL.sp
2018-04-02 16:39 ruslan File Deleted: ZPLT_CALCSLVBL1.sp
2018-04-02 16:43 ruslan File Added: ZPLT_CALCSLVBL.sp
2018-04-02 16:43 ruslan File Added: ZPLT_CALCSLVBL1.sp
2018-04-02 16:48 ruslan Relationship added related to 0001306
2018-04-16 16:28 ruslan File Deleted: ZPLT_CALCSLVBL.sp
2018-04-16 16:29 ruslan File Added: ZPLT_CALCSLVBL.sp