Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Function: fin_get_price_day_station_case(integer)
- -- DROP FUNCTION fin_get_price_day_station_case(integer);
- CREATE OR REPLACE FUNCTION fin_get_price_day_station_case(p1_case_id integer)
- RETURNS numeric AS
- $BODY$
- DECLARE
- _r RECORD;
- _csg_id INTEGER;
- _step_level INTEGER;
- _price_list RECORD;
- _position_id INTEGER;
- _m RECORD;
- _bed_days_count INTEGER;
- _mes_duration NUMERIC;
- _duration_percent NUMERIC;
- _diag_class VARCHAR;
- tariff NUMERIC(19,2);
- BEGIN
- /*
- функция расчета стоимости пребывания на дневном стационаре
- */
- 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
- RAISE EXCEPTION 'Случай не на дневном стационаре!';
- END IF;
- --подбираем прайслист
- _price_list = fin_get_pricelist_by_case(p1_case_id);
- IF (_price_list.cnt <> 1) THEN
- --RAISE EXCEPTION 'Не удалось однозначно определить прейскурант для случая!';
- END IF;
- tariff = 0.00;
- --очищаем таблицу промежуточных результатов
- DELETE FROM fin_temp_hsp_rec_price_kurgan WHERE case_id = p1_case_id;
- --перебираем все отделения (кроме приемного)
- FOR _r IN
- SELECT s.id as step_id, s.deviation_reason_id, s.mes_id, c.care_regimen_id
- FROM mc_step s
- JOIN hsp_record h ON s.id = h.id
- JOIN pim_department dep ON h.department_id = dep.id
- JOIN mc_case c ON c.id = s.case_id
- WHERE s.case_id = p1_case_id AND dep.type_id <> 4 and COALESCE(h.funding_id,8) = 8
- ORDER BY s.admission_date,s.admission_time
- LOOP
- _csg_id = fin_get_csg(_r.step_id); --определяем КСГ
- IF (_csg_id IS NOT NULL) THEN
- --определяем уровень
- _step_level = fin_get_step_level(_r.step_id);
- --находим позицию прейскуранта
- SELECT DISTINCT
- pos.id
- INTO
- _position_id
- FROM
- fin_price_list pr
- JOIN fin_pl_position pos ON pr.id = pos.price_list_id
- JOIN fin_pl_position_to_csg c ON pos.id = c.position_id
- WHERE pr.id = _price_list.id AND c.csg_id = _csg_id
- AND pos.group_id IN (SELECT id FROM fin_pl_group g WHERE g.clinic_id = pr.clinic_id AND trim(g.code)='3')
- LIMIT 1
- ;
- IF (_position_id IS NULL) THEN RAISE EXCEPTION 'Не удалось определить позицию прейскуранта! (mc_case.id = %)',p1_case_id; END IF;
- --получаем стоимость на 1 уровне
- SELECT COALESCE(p.price,0.00) INTO tariff FROM fin_pl_position p WHERE p.id = _position_id;
- IF (_step_level <> 3) THEN --если не районный уровень, то применяем повышающие коэффициенты из модификаторов
- FOR _m IN
- 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
- WHERE mp.pl_position_id = _position_id
- ORDER BY mod.apply_order
- LOOP
- IF fin_price_modifier_need_apply(_r.step_id,0,_m.condition) THEN --если условие выполнено то применяем модификатор
- tariff = CASE _m.type
- WHEN 1 THEN tariff * _m.value::NUMERIC(19,2)
- ELSE tariff
- END;
- END IF;
- END LOOP;
- END IF; --IF (_step_level <> 3)
- --проверяем выполнение стандарта и применение понижающего кэфа если стандарт не выполнен
- IF (NOT _r.deviation_reason_id IN (1,4,13,16)) THEN --если не выполнен
- --определяем нормативную длительность лечения по МЭС
- 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;
- IF COALESCE(_mes_duration,0)>0 THEN
- --определяем фактическую длительность
- _bed_days_count = get_bed_day_count_on_step(_r.step_id);
- --процент длительности от нормативной
- _duration_percent = (_bed_days_count/_mes_duration*100)::NUMERIC(19,2);
- --применяем понижающий коэффициент
- tariff = CASE
- WHEN _duration_percent <= 50 THEN tariff * 0.5
- ELSE tariff * 0.75
- END;
- END IF;
- END IF; -- IF (NOT _r.deviation_reason_id IN (1,4,13,16)) THEN
- --определяем класс МКБ КСГ
- /*
- 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
- WHERE k.id = _csg.group_id_out
- ;
- */
- SELECT
- substring(trim(md.code) from 1 for 1) INTO _diag_class
- FROM mc_diagnosis mc
- JOIN md_diagnosis md ON mc.diagnos_id = md.id
- WHERE mc.step_id = _r.step_id AND mc.case_id = p1_case_id AND mc.is_main
- LIMIT 1
- ;
- --сохраняем результаты во временную таблицу
- INSERT INTO fin_temp_hsp_rec_price_kurgan (case_id, csg_id, tariff, diag_class, step_id)
- VALUES (p1_case_id, _csg_id, tariff, _diag_class, _r.step_id);
- END IF; --IF (_csg.csg_id_out IS NOT NULL) THEN
- END LOOP;
- --обнуляем стоимость невлияющих ЗОГ
- WITH q AS (
- SELECT id FROM (
- SELECT t.id,t.tariff,t.diag_class,
- row_number() over(partition by diag_class order by t.tariff desc) as rank
- FROM fin_temp_hsp_rec_price_kurgan t
- WHERE case_id = p1_case_id
- )ll
- WHERE rank <> 1
- )
- UPDATE fin_temp_hsp_rec_price_kurgan k
- SET
- tariff = 0.00
- FROM q
- WHERE k.id = q.id
- ;
- --выбираем из каждого класса заболеваний КСГ с максимальной стомсостью
- --и складываем их стоимости
- WITH q AS (
- SELECT t.tariff,t.diag_class,
- row_number() over(partition by diag_class order by t.tariff desc) as rank
- FROM fin_temp_hsp_rec_price_kurgan t
- WHERE case_id = p1_case_id
- )
- SELECT SUM(q.tariff) INTO tariff FROM q
- WHERE rank = 1
- ;
- RETURN tariff;
- END;
- $BODY$
- LANGUAGE plpgsql VOLATILE
- COST 100;
- ALTER FUNCTION fin_get_price_day_station_case(integer)
- OWNER TO idev;
- GRANT EXECUTE ON FUNCTION fin_get_price_day_station_case(integer) TO public;
- GRANT EXECUTE ON FUNCTION fin_get_price_day_station_case(integer) TO idev;
- GRANT EXECUTE ON FUNCTION fin_get_price_day_station_case(integer) TO jenkins;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement