Текущее время: Вс, июл 20 2025, 00:06

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Амбулаторные и стационарные детские больничные
СообщениеДобавлено: Чт, ноя 27 2014, 16:25 
Ассистент
Ассистент

Зарегистрирован:
Вт, июн 11 2013, 10:11
Сообщения: 31
Уважаемые коллеги. Хотелось бы узнать, какие подходы вы использовали для реализации следующего требования: есть стационарный больничный по уходу за ребенком до 7 лет (12 дней) и амбулаторное продолжение 15 дней. ФСС разъясняет, что в этом случае из 50% следует оплачивать только последние 5 дней амбулаторного больничного, то есть по факту на стыке стационарного и амбулаторного больничного нужно делать сброс подсчета дней. Стандарт предлагает сквозную нумерацию дней по ссылке KENN1 в RUSI0. В таком случае все 15 дней оплатятся из 50%. Остается делить амбулаторный больничный на два отсутствия сугубо вручную. И ввести разные ссылки KENN1 мы также не можем, так как HRUL4FSS учитывает именно KENN1 при подсчете страховых случаев,а это именно один случай. У кого есть опыт решения этой проблемы, хотелось бы обойтись наименьшим сломо стандартной логики.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Амбулаторные и стационарные детские больничные
СообщениеДобавлено: Пт, ноя 28 2014, 08:41 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Пт, сен 07 2007, 07:53
Сообщения: 1398
Делал подломом стандартной функции RUSI0. За определение даты начала больничного отвечает процедура get_absence_date
Code:
*       get start date of illness
        PERFORM get_absence_date USING <l_wa_ab>
                              CHANGING l_sibegda
                                       lt_2001.

в l_sibegda должна вернутся дата, от которой будет производится подсчет дней и определение %.

Ну и ниже приведу свой код подлома (в одно сообщение почему-то не встало). Подлом выполнен в виде ENHANCEMENT на выходе из get_absence_date, поэтому стандартный код страдает не так сильно :)
Код повторяет последние строчки процедуры get_absence_date с более глубокой обработкой. Вид отсутствия 0209 "Уход за реб./стационар", остальные перечисленные виды - коды больничных по уходу за ребенком.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Амбулаторные и стационарные детские больничные
СообщениеДобавлено: Пт, ноя 28 2014, 08:43 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Пт, сен 07 2007, 07:53
Сообщения: 1398
Code:
ENHANCEMENT 2  ZHR_PY_RUSI0_GET_ABSENCE_DATE.    "active version
* Определение начала больничного с реакций на тип отсутствия

* Больничный по уходу за ребенком стационар (0209) и амбулаторно (0202) не должны перемешиваться
* отчет дней должен вестись отдельно для каждого вида отсутствия, хотя
* это и связанное событие
* Настройка сделана удалением несмешиваемых отсутствий из таблицы pt_2001, где подготовлены
* связанные отсутствия
  data lt_sick_child like range of ps_ab-AWART.
  data ls_sick_child like line of lt_sick_child.

  ls_sick_child-sign   = 'I'.
  ls_sick_child-option = 'EQ'.
  ls_sick_child-low    = '0202'.
  APPEND ls_sick_child TO lt_sick_child.
  ls_sick_child-low    = '0203'.
  APPEND ls_sick_child TO lt_sick_child.
  ls_sick_child-low    = '0214'.
  APPEND ls_sick_child TO lt_sick_child.

  check ps_ab-AWART in lt_sick_child or ps_ab-AWART ='0209'.
  p_begda = ps_ab-obegd.
  LOOP AT pt_2001 ASSIGNING <l_wa_p2001>.
    if ( ps_ab-AWART in lt_sick_child and <l_wa_p2001>-subty = '0209' ) or
       ( ps_ab-AWART = '0209' and <l_wa_p2001>-subty in lt_sick_child ).
      delete pt_2001.
    else.
      IF <l_wa_p2001>-begda LT p_begda.
        p_begda = <l_wa_p2001>-begda.
      ENDIF.
    endif.
  ENDLOOP.
ENDENHANCEMENT.

В таком виде работает 2,5 года. Проблем не было.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Амбулаторные и стационарные детские больничные
СообщениеДобавлено: Пт, ноя 28 2014, 10:11 
Ассистент
Ассистент

Зарегистрирован:
Вт, июн 11 2013, 10:11
Сообщения: 31
RoustR написал(а):
Делал подломом стандартной функции RUSI0. За определение даты начала больничного отвечает процедура get_absence_date.

В принципе я думаю, по-другому это и не реализовать, но есть один интересный момент: l_sibegda влияет еще и на выбор самой социальной группы как дата, от которой считается страховой стаж и теоретически возможна ситуация, когда социальная группа для продолжения будет уже другой:
Code:
*       Get social group for illness
        PERFORM get_socgr USING    l_sibegda
                                   lv_sckn
                                   <l_wa_ab>-obegd
                          CHANGING l_socgr
                                   l_modsg
                                   l_duration
                                   l_socgr_default.

Возможно, есть смысл аналогичный enhancement добавить в FORM init_current_cal_day, тогда это повлияет только на подсчет дней. Я поробую, потестирую и отпишусь.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Амбулаторные и стационарные детские больничные
СообщениеДобавлено: Пт, дек 05 2014, 11:00 
Ассистент
Ассистент

Зарегистрирован:
Вт, июн 11 2013, 10:11
Сообщения: 31
В итоге бизнес сформулировал правило подсчета дней для детских больничных так: 10 дней считается только в рамках амбулаторных больничных. А ограничение на 15 дней для больничного > 7 лет - по всем (как амбулаторным, так и стационарным). В итоге стандартная логика с этим даже с учетом подлома, фильтрующего содержимое pt_2001, несовместима. Пришлось ломать еще фундаментальнее: в 2 местах.

1) Подсчет разницы - с учетом стационара и без учета. В конце FORM init_current_cal_day:

Code:
ENHANCEMENT 2  Z_RUSI0_INIT_CAL_DAY.    "active version
* подсчитать дни, приходящиеся только на этот больничный
  perform zzcalc_altern_current_day   using    ps_ab
                                    pt_2001
                                    p_method
                                    p_datum
                                    p_current_cal_day.
ENDENHANCEMENT.


Сама реализация (zhrpyhosp01 - настроечная таблица для детских больничных):

Code:
data: zzgv_current_cal_day type i. " разница между днем с учетом другого типа отсутствий и без него

form zzcalc_altern_current_day   using    ps_ab structure pc20i
                                    pt_2001 type p2001_tab
                                    p_method
                                    p_datum
                                    p_current_cal_day.

  statics: st_zhrpyhosp01 type sorted table of zhrpyhosp01 with unique key awart endda.

  data: l_num_cdays  type i,
        lv_hospt.

  field-symbols: <l_wa_p2001> type p2001,
                 <fs_zhrpyhosp01> type zhrpyhosp01.

  clear: zzgv_current_cal_day. " по умолчанию разницы просто нет

  " убрать все отсутствия, не относящиеся к этому типу
  if st_zhrpyhosp01 is initial.
    select * from zhrpyhosp01 into table st_zhrpyhosp01.
  endif.

  check st_zhrpyhosp01 is not initial.
  loop at st_zhrpyhosp01 assigning <fs_zhrpyhosp01> where awart = ps_ab-awart and
                                                    endda >= p_datum and
                                                    begda <= p_datum.
    lv_hospt = <fs_zhrpyhosp01>-hospt.
  endloop.
  check sy-subrc = 0. " отсутствие входит в список детских амбулаторных/стационарных

*Evaluate Calendar Days

  if lines( pt_2001 ) ne 0.
    loop at pt_2001 assigning <l_wa_p2001>.
      if lv_hospt = 'X'. " для стационара - только стационар
        loop at st_zhrpyhosp01 assigning <fs_zhrpyhosp01> where awart = <l_wa_p2001>-awart and
                                                      endda >= p_datum and
                                                      begda <= p_datum and
                                                      hospt = 'X'. " только стационар
          l_num_cdays = <l_wa_p2001>-endda - <l_wa_p2001>-begda + 1.
          add l_num_cdays to zzgv_current_cal_day.
          exit.
        endloop.
      else.
        " в остальных случаях все кроме стационара
        loop at st_zhrpyhosp01 assigning <fs_zhrpyhosp01> where awart = <l_wa_p2001>-awart and
                                                      endda >= p_datum and
                                                      begda <= p_datum and
                                                      hospt = 'X'.
          exit.
        endloop.
        if sy-subrc <> 0. " не стационар
          l_num_cdays = <l_wa_p2001>-endda - <l_wa_p2001>-begda + 1.
          add l_num_cdays to zzgv_current_cal_day.
        endif.
      endif.
    endloop.
  endif.

  " разница между полным подсчетом и только амбулаторные отсутствия/стационар
  zzgv_current_cal_day = p_current_cal_day - zzgv_current_cal_day.

endform.


2) Применение самой разницы при определении процента. В конце FORM re7rut5:

Code:
ENHANCEMENT 3  Z_RUSI0_RE7RUT5_DIFF_DAYS.    "active version
* Если есть разница за счет амбулаторных/стационарных больничных
  data: lv_current_cal_day type i.
  if zzgv_current_cal_day is not initial and ps_abw-prl > 0. " есть разница и оплата не прекращена
    lv_current_cal_day = p_current_cal_day - zzgv_current_cal_day.
    refresh lt_i7rut5.
    select * from t7rut5 into table lt_i7rut5
                             where land eq calc_land
                               and varky eq p_socgr
                               and moabw eq t001p-moabw
                               and modsg eq p_modsg
                               and dna   le lv_current_cal_day
                               and abt   eq ps_ab-awart
                               and begda le ps_ab-obegd
                               and endda ge ps_ab-obegd.
    sort lt_i7rut5 by dna descending.
    read table lt_i7rut5 assigning <l_wa_7rut5> index 1.
    if sy-subrc = 0.
      move-corresponding <l_wa_7rut5> to ps_abw. " изменить процент оплаты для амбулаторных/стационарных больничных
    endif.
  endif.
ENDENHANCEMENT.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB