Advertisement
Guest User

Untitled

a guest
Feb 11th, 2016
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.39 KB | None | 0 0
  1. -- Function: fin_get_price_day_station_case(integer)
  2.  
  3. -- DROP FUNCTION fin_get_price_day_station_case(integer);
  4.  
  5. CREATE OR REPLACE FUNCTION fin_get_price_day_station_case(p1_case_id integer)
  6. RETURNS numeric AS
  7. $BODY$
  8. DECLARE
  9. _r RECORD;
  10. _csg_id INTEGER;
  11. _step_level INTEGER;
  12. _price_list RECORD;
  13. _position_id INTEGER;
  14. _m RECORD;
  15. _bed_days_count INTEGER;
  16. _mes_duration NUMERIC;
  17. _duration_percent NUMERIC;
  18. _diag_class VARCHAR;
  19. tariff NUMERIC(19,2);
  20. BEGIN
  21. /*
  22.  
  23. функция расчета стоимости пребывания на дневном стационаре
  24.  
  25. */
  26.  
  27. IF NOT EXISTS (SELECT 1 FROM mc_case c WHERE c.id = p1_case_id AND c.care_regimen_id IN (3,4,5)) THEN
  28. RAISE EXCEPTION 'Случай не на дневном стационаре!';
  29. END IF;
  30.  
  31. --подбираем прайслист
  32. _price_list = fin_get_pricelist_by_case(p1_case_id);
  33. IF (_price_list.cnt <> 1) THEN
  34. --RAISE EXCEPTION 'Не удалось однозначно определить прейскурант для случая!';
  35. END IF;
  36.  
  37. tariff = 0.00;
  38.  
  39. --очищаем таблицу промежуточных результатов
  40. DELETE FROM fin_temp_hsp_rec_price_kurgan WHERE case_id = p1_case_id;
  41.  
  42. --перебираем все отделения (кроме приемного)
  43. FOR _r IN
  44. SELECT s.id as step_id, s.deviation_reason_id, s.mes_id, c.care_regimen_id
  45. FROM mc_step s
  46. JOIN hsp_record h ON s.id = h.id
  47. JOIN pim_department dep ON h.department_id = dep.id
  48. JOIN mc_case c ON c.id = s.case_id
  49. WHERE s.case_id = p1_case_id AND dep.type_id <> 4 and COALESCE(h.funding_id,8) = 8
  50. ORDER BY s.admission_date,s.admission_time
  51. LOOP
  52. _csg_id = fin_get_csg(_r.step_id); --определяем КСГ
  53.  
  54. IF (_csg_id IS NOT NULL) THEN
  55.  
  56. --определяем уровень
  57. _step_level = fin_get_step_level(_r.step_id);
  58.  
  59. --находим позицию прейскуранта
  60. SELECT DISTINCT
  61. pos.id
  62. INTO
  63. _position_id
  64. FROM
  65. fin_price_list pr
  66. JOIN fin_pl_position pos ON pr.id = pos.price_list_id
  67. JOIN fin_pl_position_to_csg c ON pos.id = c.position_id
  68. WHERE pr.id = _price_list.id AND c.csg_id = _csg_id
  69. AND pos.group_id IN (SELECT id FROM fin_pl_group g WHERE g.clinic_id = pr.clinic_id AND trim(g.code)='3')
  70. LIMIT 1
  71. ;
  72.  
  73. IF (_position_id IS NULL) THEN RAISE EXCEPTION 'Не удалось определить позицию прейскуранта! (mc_case.id = %)',p1_case_id; END IF;
  74.  
  75. --получаем стоимость на 1 уровне
  76. SELECT COALESCE(p.price,0.00) INTO tariff FROM fin_pl_position p WHERE p.id = _position_id;
  77.  
  78. IF (_step_level <> 3) THEN --если не районный уровень, то применяем повышающие коэффициенты из модификаторов
  79.  
  80. FOR _m IN
  81. SELECT mod.type,COALESCE(mod.value,'0.00') as value,trim(mod.condition) AS condition FROM fin_modifier_to_pl_pos mp JOIN fin_price_modifier mod ON mod.id = mp.price_modifier_id
  82. WHERE mp.pl_position_id = _position_id
  83. ORDER BY mod.apply_order
  84. LOOP
  85. IF fin_price_modifier_need_apply(_r.step_id,0,_m.condition) THEN --если условие выполнено то применяем модификатор
  86. tariff = CASE _m.type
  87. WHEN 1 THEN tariff * _m.value::NUMERIC(19,2)
  88. ELSE tariff
  89. END;
  90. END IF;
  91. END LOOP;
  92.  
  93. END IF; --IF (_step_level <> 3)
  94.  
  95. --проверяем выполнение стандарта и применение понижающего кэфа если стандарт не выполнен
  96. IF (NOT _r.deviation_reason_id IN (1,4,13,16)) THEN --если не выполнен
  97.  
  98. --определяем нормативную длительность лечения по МЭС
  99. SELECT d.duration INTO _mes_duration FROM mc_mes_duration d WHERE d.md_mes = _r.mes_id AND d.care_regimen_id = _r.care_regimen_id;
  100.  
  101. IF COALESCE(_mes_duration,0)>0 THEN
  102.  
  103. --определяем фактическую длительность
  104. _bed_days_count = get_bed_day_count_on_step(_r.step_id);
  105.  
  106. --процент длительности от нормативной
  107. _duration_percent = (_bed_days_count/_mes_duration*100)::NUMERIC(19,2);
  108.  
  109. --применяем понижающий коэффициент
  110. tariff = CASE
  111. WHEN _duration_percent <= 50 THEN tariff * 0.5
  112. ELSE tariff * 0.75
  113. END;
  114.  
  115. END IF;
  116.  
  117. END IF; -- IF (NOT _r.deviation_reason_id IN (1,4,13,16)) THEN
  118.  
  119. --определяем класс МКБ КСГ
  120. /*
  121. SELECT substring(trim(d.code) from 1 for 1) INTO _diag_class FROM md_csg_group_all_kurgan k JOIN md_diagnosis d ON k.diag_id = d.id
  122. WHERE k.id = _csg.group_id_out
  123. ;
  124. */
  125.  
  126. SELECT
  127. substring(trim(md.code) from 1 for 1) INTO _diag_class
  128. FROM mc_diagnosis mc
  129. JOIN md_diagnosis md ON mc.diagnos_id = md.id
  130. WHERE mc.step_id = _r.step_id AND mc.case_id = p1_case_id AND mc.is_main
  131. LIMIT 1
  132. ;
  133.  
  134. --сохраняем результаты во временную таблицу
  135. INSERT INTO fin_temp_hsp_rec_price_kurgan (case_id, csg_id, tariff, diag_class, step_id)
  136. VALUES (p1_case_id, _csg_id, tariff, _diag_class, _r.step_id);
  137.  
  138. END IF; --IF (_csg.csg_id_out IS NOT NULL) THEN
  139.  
  140. END LOOP;
  141.  
  142.  
  143. --обнуляем стоимость невлияющих ЗОГ
  144. WITH q AS (
  145. SELECT id FROM (
  146. SELECT t.id,t.tariff,t.diag_class,
  147. row_number() over(partition by diag_class order by t.tariff desc) as rank
  148. FROM fin_temp_hsp_rec_price_kurgan t
  149. WHERE case_id = p1_case_id
  150. )ll
  151. WHERE rank <> 1
  152. )
  153. UPDATE fin_temp_hsp_rec_price_kurgan k
  154. SET
  155. tariff = 0.00
  156. FROM q
  157. WHERE k.id = q.id
  158. ;
  159.  
  160.  
  161. --выбираем из каждого класса заболеваний КСГ с максимальной стомсостью
  162. --и складываем их стоимости
  163. WITH q AS (
  164. SELECT t.tariff,t.diag_class,
  165. row_number() over(partition by diag_class order by t.tariff desc) as rank
  166. FROM fin_temp_hsp_rec_price_kurgan t
  167. WHERE case_id = p1_case_id
  168. )
  169. SELECT SUM(q.tariff) INTO tariff FROM q
  170. WHERE rank = 1
  171. ;
  172.  
  173. RETURN tariff;
  174.  
  175. END;
  176. $BODY$
  177. LANGUAGE plpgsql VOLATILE
  178. COST 100;
  179. ALTER FUNCTION fin_get_price_day_station_case(integer)
  180. OWNER TO idev;
  181. GRANT EXECUTE ON FUNCTION fin_get_price_day_station_case(integer) TO public;
  182. GRANT EXECUTE ON FUNCTION fin_get_price_day_station_case(integer) TO idev;
  183. GRANT EXECUTE ON FUNCTION fin_get_price_day_station_case(integer) TO jenkins;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement