View Issue Details

IDProjectCategoryView StatusLast Update
0000853ЗарплатаGeneralpublic2021-03-10 14:15
Reporterruslan Assigned Toruslan  
PriorityurgentSeveritycrashReproducibilityalways
Status resolvedResolutionreopened 
Summary0000853: -Проверить расчет начисления отпускных- Расчет кол-ва дней в расчетном периоде-ПРием сотрудника не с 1-ого числа
DescriptionДля расчета среднедневной ЗП для расчета отпускных берется период 12 месяцев, если сотрудник отработал МЕНЬШЕ 12 месяцев, то берется период фактически отработанный с 01 числа месяца следующим за месяцем приема по последнее число месяца перед месяцем начисления отпускных, для всех случаев, кроме когда сотрудник оформлен с ПЕРВОГО РАБОЧЕГО ДНЯ месяца, тогда этот месяц считается в расчет среднедневной ЗП. Момент оформления сотрудника в первый РАБОЧИЙ ДЕНЬ МЕСЯЦА у нас не считается, считается только если оформлен в первый КАЛЕНДАРНЫЙ день месяца. Исправь пожалуйста.
TagsNo tags attached.

Relationships

related to 0000857 closedruslan -/+Новое начисление * Разница между мин.зп 

Activities

ruslan

2015-08-31 15:46

manager   ~0002111

Вот процедура я проверил правильно считает, там была одна неточность - я исправил:
create or alter procedure ZPLT_CALCSLVO (
    SIID integer)
returns (
    SUMMA double precision,
    BDATE timestamp,
    EDATE timestamp,
    BCDATE timestamp,
    ECDATE timestamp,
    MCNT integer,
    ISUMMA double precision,
    SUMMA1 double precision,
    DAYS integer,
    HLDDAYS integer)
as
/* расчет отпускных */
declare variable CALCINCRID integer;
declare variable PRSNID integer;
declare variable DAYWTIME double precision;
declare variable WTIME double precision;
declare variable SLVID integer;
declare variable BPDATE date; /* дата приема на работу */
declare variable XDATE date;
declare variable HDAYS integer;
declare variable MROUND integer;
begin
  Summa = 0.0;
  Select ID, BLDATE, ELDATE, (ELDATE-BLDATE)+1.0, MonthCnt,
  CoalEsce(MRound, 0), SlvID
  from ZpltCalcIncr where ID=:SIID
  into :CalcIncrID, :BDATE, :EDATE, :Days, :MCnt, :MRound, :SlvID;
  if (:CalcIncrID is Null) then begin Suspend; Exit; end
  Select xDate-1 from F_MonthFirstDay(:BDATE) into :ECDATE;
  Select xDate from F_AddMonth(:ECDATE,-:MCnt+1) into :BCDATE;
  Select xDate from F_MonthFirstDay(:BCDATE) into :BCDATE;
  Select PrsnID from ZpltCalcSlv where ID=:SlvID into :PrsnID;
  Select Inp_Date, DayWTime from Personal where ID=:PrsnID into :BPDATE, :DayWTime;
  if (:DayWTime is Null or :DayWTime = 0) then DayWTime = 8.0;
  if ((:BPDATE is Not Null) and (:BPDATE > :BCDATE)) then begin
    -- если сотрудник работает менее 12 мес. - берем от приема на работу
    Select xDate from F_MonthFirstWorkDay(:SlvID, :BPDATE) into :xDate;
    if (:BPDATE <> (:xDate)) then begin
      Select xDate+1.0 from F_MonthLastDay(:BPDATE) into :BCDATE;
    end
       else BCDATE = :xDate; -- мое исправление
  end
  mCnt = 0; /* фактическое количество расчетных месяцев */
  xDate = :BCDATE;
  while (:xDate < :ecDate) do begin
    mCnt = :MCnt+1;
    Select xDate+1 from F_MonthLastDay(:xDate) into :xDate;
  end
  -- начислено за расчетный период
  Select Sum(CI.cSumma) from ZpltCalcMst M, ZpltCalcSlv S, ZpltCalcIncr CI, ZpltIncr I
  where M.DAT_ >= :BCDATE and M.DAT_ <= :ECDATE and S.MstID=M.ID and S.PrsnID = :PrsnID
  and CI.SlvID=S.ID and I.ID=CI.IncrID
  -- исключая аванс, материальную помощь
  and I.System_Flag not in (2, 4) into :iSumma;
  if (:iSumma is Null) then iSumma = 0.0;
  Select Sum(S.wTime) from ZpltCalcMst M, ZpltCalcSlv S
  where M.DAT_ >= :BCDATE and M.DAT_ <= :ECDATE and S.MstID=M.ID and S.PrsnID = :PrsnID
  into :wTime;
  /* праздничные дни за расчетный период */
  select Days from Zplt_HldDays(:bcDate, :ecDate) into :HldDays;
  /* праздничные дни за период отпуска */
  select Days from Zplt_HldDays(:bDate, :eDate) into :HDays;
  Summa1 = 0.0; /* среднедневная зарплата */
  if (:wTime <> 0.0 and :wTime is not Null and :DayWTime <> 0.0) then begin
    Summa1 = :iSumma / (:ECDATE-:BCDATE+1.0 - :HldDays);
  end
  if (:MRound = 1) then Summa1 = Cast((Summa1 * 100.00) as integer) / 100.00;
  Summa = Cast(Cast((:Summa1 * (:Days-:HDays))*100.0 as Integer) as double precision) / 100.0;
  Suspend;
end

ruslan

2016-08-12 18:06

manager   ~0002408

Похоже, что я зря закрыл эту задачу - не понимаю как это произошло я вроде проверял, когда закрывал, НО ты не внес изменения в расчет и расчет периода у нас снова слетел... И там выяснилась бага - у нас почему-то из расчета не исключались дни отпуска за свой счет :-(, я тоже исправил - проверь и однови процедуру в эталонной базе, только с моими каментами в коде:
create or alter procedure ZPLT_CALCSLVO (
    SIID integer)
returns (
    SUMMA double precision,
    BDATE timestamp,
    EDATE timestamp,
    BCDATE timestamp,
    ECDATE timestamp,
    MCNT integer,
    ISUMMA double precision,
    SUMMA1 double precision,
    DAYS integer,
    HLDDAYS integer,
    HLDDAYSWOSALE integer)
as
/* расчет отпускных */
declare variable CALCINCRID integer;
declare variable PRSNID integer;
declare variable DAYWTIME double precision;
declare variable WTIME double precision;
declare variable SLVID integer;
declare variable BPDATE date; /* дата приема на работу */
declare variable XDATE date;
declare variable HDAYS integer;
declare variable MROUND integer;
declare variable DATE1 date;
declare variable DATE2 date;
declare variable XDAYS integer;
begin
  Summa = 0.0;
  hlddayswosale = 0;
  Select ID, BLDATE, ELDATE, (ELDATE-BLDATE)+1.0, MonthCnt,
  CoalEsce(MRound, 0), SlvID
  from ZpltCalcIncr where ID=:SIID
  into :CalcIncrID, :BDATE, :EDATE, :Days, :MCnt, :MRound, :SlvID;
  if (:CalcIncrID is Null) then begin Suspend; Exit; end
  Select xDate-1 from F_MonthFirstDay(:BDATE) into :ECDATE;
  Select xDate from F_AddMonth(:ECDATE,-:MCnt+1) into :BCDATE;
  Select xDate from F_MonthFirstDay(:BCDATE) into :BCDATE;
  Select PrsnID from ZpltCalcSlv where ID=:SlvID into :PrsnID;
  Select Inp_Date, DayWTime from Personal where ID=:PrsnID into :BPDATE, :DayWTime;
  if (:DayWTime is Null or :DayWTime = 0) then DayWTime = 8.0;
  if ((:BPDATE is Not Null) and (:BPDATE > :BCDATE)) then begin
    -- если сотрудник работает менее 12 мес. - берем от приема на работу
    Select xDate from F_MonthFirstWorkDay(:SlvID, :BPDATE) into :xDate;
    if (:BPDATE <> (:xDate)) then begin
      Select xDate+1.0 from F_MonthLastDay(:BPDATE) into :BCDATE;
    end
    else BCDATE = :xDate; --исправление 31.08.2015
  end
  mCnt = 0; /* фактическое количество расчетных месяцев */
  xDate = :BCDATE;
  while (:xDate < :ecDate) do begin
    mCnt = :MCnt+1;
    Select xDate+1 from F_MonthLastDay(:xDate) into :xDate;
  end
  -- начислено за расчетный период
  Select Sum(CI.cSumma) from ZpltCalcMst M, ZpltCalcSlv S, ZpltCalcIncr CI, ZpltIncr I
  where M.DAT_ >= :BCDATE and M.DAT_ <= :ECDATE and S.MstID=M.ID and S.PrsnID = :PrsnID
  and CI.SlvID=S.ID and I.ID=CI.IncrID
  -- исключая аванс, материальную помощь, разница между мин. з/п.
  and I.System_Flag not in (2, 4, 16) into :iSumma;
  if (:iSumma is Null) then iSumma = 0.0;
  Select Sum(S.wTime) from ZpltCalcMst M, ZpltCalcSlv S
  where M.DAT_ >= :BCDATE and M.DAT_ <= :ECDATE and S.MstID=M.ID and S.PrsnID = :PrsnID
  into :wTime;
  /* праздничные дни за расчетный период */
  select Days from Zplt_HldDays(:bcDate, :ecDate) into :HldDays;
  /* праздничные дни за период отпуска */
  select Days from Zplt_HldDays(:bDate, :eDate) into :HDays;
  /* дни отпуска без сохранениея з/п за расчетный период. Исправления 12.08.2016*/
  for select V.bDate, V.eDate
    from ZpltSertVacat V
    where V.PrsnID=:PrsnID and V.Typ=1
      and V.bDate <= :ECDATE and V.eDate >= :BCDATE
      and V.bDate is not Null and V.eDate is not Null
    into :Date1, :Date2 do begin
      if (:Date1 < :BCDATE) then Date1 = :BCDATE;
      if (:Date2 > :ECDATE) then Date2 = :ECDATE;
      select Result + 1 from F_ElapsedDays(:Date1, :Date2) into :xDays;
      hlddayswosale = hlddayswosale + :xDays;
    end
  Summa1 = 0.0; /* среднедневная зарплата */
  if (:wTime <> 0.0 and :wTime is not Null and :DayWTime <> 0.0) then begin
    Summa1 = :iSumma / (:ECDATE-:BCDATE+1.0 - :HldDays - :hlddayswosale);
  end
  if (:MRound = 1) then Summa1 = Cast((Summa1 * 100.00) as integer) / 100.00;
  Summa = Cast(Cast((:Summa1 * (:Days-:HDays))*100.0 as Integer) as double precision) / 100.0;
  Suspend;
end

ruslan

2016-08-30 11:16

manager   ~0002410

Last edited: 2016-08-30 11:23

View 2 revisions

И в Модуле ЗП в форме расчета отпускных и больничных - добавь поле Отпуск без сохр.ЗП(аналогично праздничным и др. расчетным дням), чтоб можно было визуально проверить расчет...(для больничных тебе надо будет в процедуру добавить переменную, аналогично как я добавил в расчет отпускных)

ruslan

2018-03-03 15:48

manager   ~0003272

Учтите при этом, что если 03 числo, было первым рабочим днем, указанный месяц будeт учитываться при исчислении среднeй зарплаты для работников, отработавших меньше года. A eсли работник принят на работу с 04 числа, этот месяц не учитывается.
http://www.buhoblik.org.ua/kadry-zarplata/otpuska/1851-raschet-srednej-zarplaty.html

ruslan

2020-07-13 21:43

manager   ~0004404

Доделай эту задачу пожалуйста.... если в интерфейс щас не когда вносить изменения - добавь в БД измененную процедуру из камента 0002408. Сейчас опять звонили клиенты... не учитывает дни в отпуске за свой счет из общего расчета среднедневной ЗП

barry

2021-03-10 14:15

administrator   ~0004465

mebl_ib5.zip

Issue History

Date Modified Username Field Change
2015-08-10 15:26 ruslan New Issue
2015-08-17 16:44 ruslan Relationship added related to 0000857
2015-08-31 11:58 ruslan Status new => resolved
2015-08-31 11:58 ruslan Resolution open => fixed
2015-08-31 11:58 ruslan Assigned To => ruslan
2015-08-31 15:46 ruslan Note Added: 0002111
2015-08-31 15:46 ruslan Status resolved => feedback
2015-08-31 15:46 ruslan Resolution fixed => reopened
2015-09-12 16:45 ruslan Status feedback => resolved
2015-09-12 16:45 ruslan Resolution reopened => fixed
2015-09-25 17:08 ruslan Status resolved => closed
2016-08-12 18:06 ruslan Note Added: 0002408
2016-08-12 18:06 ruslan Status closed => feedback
2016-08-12 18:06 ruslan Resolution fixed => reopened
2016-08-30 11:16 ruslan Note Added: 0002410
2016-08-30 11:16 ruslan Status feedback => assigned
2016-08-30 11:23 ruslan Note Edited: 0002410 View Revisions
2018-03-03 15:48 ruslan Note Added: 0003272
2020-07-13 21:43 ruslan Note Added: 0004404
2021-03-10 14:15 barry Status assigned => resolved
2021-03-10 14:15 barry Note Added: 0004465