View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0000853 | Зарплата | General | public | 2015-08-10 15:26 | 2021-03-10 14:15 |
Reporter | ruslan | Assigned To | ruslan | ||
Priority | urgent | Severity | crash | Reproducibility | always |
Status | resolved | Resolution | reopened | ||
Summary | 0000853: -Проверить расчет начисления отпускных- Расчет кол-ва дней в расчетном периоде-ПРием сотрудника не с 1-ого числа | ||||
Description | Для расчета среднедневной ЗП для расчета отпускных берется период 12 месяцев, если сотрудник отработал МЕНЬШЕ 12 месяцев, то берется период фактически отработанный с 01 числа месяца следующим за месяцем приема по последнее число месяца перед месяцем начисления отпускных, для всех случаев, кроме когда сотрудник оформлен с ПЕРВОГО РАБОЧЕГО ДНЯ месяца, тогда этот месяц считается в расчет среднедневной ЗП. Момент оформления сотрудника в первый РАБОЧИЙ ДЕНЬ МЕСЯЦА у нас не считается, считается только если оформлен в первый КАЛЕНДАРНЫЙ день месяца. Исправь пожалуйста. | ||||
Tags | No tags attached. | ||||
|
Вот процедура я проверил правильно считает, там была одна неточность - я исправил: 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 |
|
Похоже, что я зря закрыл эту задачу - не понимаю как это произошло я вроде проверял, когда закрывал, НО ты не внес изменения в расчет и расчет периода у нас снова слетел... И там выяснилась бага - у нас почему-то из расчета не исключались дни отпуска за свой счет :-(, я тоже исправил - проверь и однови процедуру в эталонной базе, только с моими каментами в коде: 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 |
|
И в Модуле ЗП в форме расчета отпускных и больничных - добавь поле Отпуск без сохр.ЗП(аналогично праздничным и др. расчетным дням), чтоб можно было визуально проверить расчет...(для больничных тебе надо будет в процедуру добавить переменную, аналогично как я добавил в расчет отпускных) |
|
Учтите при этом, что если 03 числo, было первым рабочим днем, указанный месяц будeт учитываться при исчислении среднeй зарплаты для работников, отработавших меньше года. A eсли работник принят на работу с 04 числа, этот месяц не учитывается. http://www.buhoblik.org.ua/kadry-zarplata/otpuska/1851-raschet-srednej-zarplaty.html |
|
Доделай эту задачу пожалуйста.... если в интерфейс щас не когда вносить изменения - добавь в БД измененную процедуру из камента 0002408. Сейчас опять звонили клиенты... не учитывает дни в отпуске за свой счет из общего расчета среднедневной ЗП |
|
mebl_ib5.zip |
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 |