Нашел в старых записках описание, как создавать отпуск за вредные/особые условия труда. Критиковать кривизну реализации бессмысленно, так как это было в «мохнатые» годы. Поэтому приветствуется только улучшайзинг! В САП главное понять принцип, получить вектор, а дальше включить фантазию 😉

Для генерации отпусков за работу во вредных условиях труда (ВУТ) создаем лимит  (например, код 06) с автоматической генерацией в оценке времени. Для генерации лимита необходимы два условия:

  1. Наличие связи штатной должности (S) с объектом вредных условий (CH). Для объекта CH создаем инфотип 9100, в котором указывается количество дней отпуска за ВУТ (IT9100-ZDAYS). При генерации лимита в user-exit EXIT_SAPLHRLV_004 читается этот ИТ на оцениваемую дату и устанавливается количество базового права в лимите согласно HRP9100-ZDAYS. Транзакция CMOD для создания расширения.
  2. Сотрудник должен отработать более 50% рабочего времени за смену для получения права на отпуск. Для этого используется вид времени 9000. В правиле вычисляется процент отработанного времени путем:  вид времени 0002/вид времени 0050. Если больше 0.5, то вид времени 9000 = 1, иначе – 0. В функции QUOTA при генерации лимита производится умножение начисленного права на отпуск за день на вид времени 9000 «Фактич время > 50%». То есть, отработал больше 0.5 смены, то умножаем начисленное право на 1, в противном случае на ноль.

При накоплении права на отпуск кратного целой единице, система переносит целую единицу в 2006 ИТ. То есть, за 3 дня накопили 1,12 дня отпуска, то один день отпуска начислится в ИТ2006.

Текст EXIT_SAPLHRLV_004 инклуд ZXPLAU05

 

*&———————————————————————*
*& Include ZXPLAU05
*&———————————————————————*

infotypes: 9100.

data:
l_sobid like hrp1001-sobid,
l_ch_objid like hrp1001-objid.

* Read base entitlement for hazardous work conditions from CH object IT9100-ZDAYS
* We do this only quota type 06 «Hazardous work conditions»
if xqtype = ’06’.
xlvnum = 0.

loop at xp0001 where begda le xgdate and endda ge xgdate.
select single sobid from hrp1001 into l_sobid where
otype = ‘S’ and
objid = xp0001-plans and
plvar = ’01’ and
istat = ‘1’ and
begda le xgdate and
endda ge xgdate and
sclas = ‘CH’.

if sy-subrc <> 0.
exit.
endif.

l_ch_objid = l_sobid(8).

CALL FUNCTION ‘RH_READ_INFTY’
EXPORTING
AUTHORITY = ‘DISP’
* WITH_STRU_AUTH = ‘X’
PLVAR = ’01’
OTYPE = ‘CH’
OBJID = l_ch_objid
INFTY = ‘9100’
ISTAT = ‘1’
* EXTEND = ‘X’
* SUBTY = ‘ ‘
BEGDA = xgdate
ENDDA = xgdate
TABLES
INNNN = p9100.

loop at p9100.
xlvnum = p9100-zdays.
exit.
endloop.
endloop.
endif.