Advertisement
Guest User

123

a guest
May 15th, 2019
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. WITH outside_d AS (
  2.     SELECT NULLIF(diagnos_id, '')::INTEGER AS diagnos_id, NULLIF(type_id,'')::INTEGER AS type_id
  3.     FROM billing.get_element_fj(:diagnosis::TEXT, 'mkb_id;type_id'::TEXT) AS t (diagnos_id TEXT, type_id TEXT)
  4.     ),
  5. outside_u AS (
  6.     SELECT NULLIF(service_id, '')::INTEGER AS service_id
  7.     FROM billing.get_element_fj(:services::TEXT, 'service_id'::TEXT) AS t (service_id TEXT)
  8.     ),
  9. outside_da AS (
  10.     SELECT NULLIF(admission_date, '')::DATE AS admission_date, NULLIF(outcome_date, '')::DATE AS outcome_date
  11.     FROM billing.get_element_fj(:visits::TEXT, 'admission_date;outcome_date'::TEXT) AS t (admission_date TEXT, outcome_date TEXT)
  12.     ),
  13. cli AS(
  14. SELECT :organizationId::INTEGER as clinic_id,:careRegimenId::INTEGER as care_regimen_id,array_agg(oc.code) as org_code_arr
  15.   FROM pim_org_code oc
  16.  where oc.org_id =:organizationId::INTEGER
  17.  GROUP BY oc.org_id
  18. ),
  19. cl AS (
  20. SELECT c.clinic_id, c.care_regimen_id, c.org_code_arr, d.diagnos_id AS "diagnosisId", dd.add_diagnos_id_arr, u.service_id_arr, da.adm_date AS "admissionDate", da.out_date AS "outcomeDate", da.open_date AS "openDate", :patientId::INTEGER AS "patientId"
  21. FROM cli AS c
  22. LEFT JOIN LATERAL (SELECT diagnos_id FROM outside_d WHERE type_id = 1 LIMIT 1) AS d ON TRUE
  23. LEFT JOIN LATERAL (SELECT ARRAY_AGG(diagnos_id) AS add_diagnos_id_arr FROM outside_d WHERE type_id <> 1) AS dd ON TRUE
  24. LEFT JOIN LATERAL (SELECT ARRAY_AGG(service_id) AS service_id_arr FROM outside_u) AS u ON TRUE
  25. LEFT JOIN LATERAL (SELECT MAX(admission_date) AS adm_date, MAX(outcome_date) AS out_date, MIN(admission_date) AS open_date FROM outside_da) AS da ON TRUE
  26. ),
  27. tb1 AS(SELECT CASE WHEN :organizationId::INTEGER IN (33656)
  28.             THEN NULL
  29.             ELSE case when "outcomeDate" < '2017-01-01'::date then typing.fin_get_ksg_typing(:diagnosis::JSON,:visits::JSON,:services::JSON,:patientId::INTEGER,:organizationId::INTEGER,:careRegimenId::INTEGER)
  30.                                  when "outcomeDate" between '2017-01-01'::date and '2017-12-31'::date then typing.fin_get_ksg_typing_2017(:diagnosis::JSON,:visits::JSON,:services::JSON,:patientId::INTEGER,:organizationId::INTEGER,:careRegimenId::INTEGER)
  31.                  when "outcomeDate" between '2018-01-01'::date and '2018-12-31'::date then typing.fin_get_ksg_typing_2018(:diagnosis::JSON,:visits::JSON,:services::JSON,:patientId::INTEGER,:organizationId::INTEGER,:careRegimenId::INTEGER)
  32.                                  ELSE (SELECT billing.get_csg_by_params_2019(NULL, hstore(cl)) -> 'csg_id')::int end
  33.        END AS "id", cl.org_code_arr
  34.   FROM cl
  35. ),tb AS(
  36. SELECT tb1.id AS "id"
  37. FROM tb1
  38. LEFT JOIN billing.billing_csg_to_bed_profile b on b.code_mo = ANY(tb1.org_code_arr) and b.ksg_id = tb1.id
  39.  WHERE
  40.    (b.bed_profile_id in (select to_int((json_array_elements(:visits::JSON) ->>'bed_profile_id'))) or not exists  (select 1 from json_array_elements(:visits::JSON) x where typing.to_int(x->>'bed_profile_id') is not null) OR b.bed_profile_id IS NULL)
  41.    AND coalesce( (select typing.to_dt(max(x.outcome_date)) from (select json_array_elements(:visits::JSON)->> 'outcome_date' outcome_date )x),(select typing.to_dt(max(x.admission_date)) from (select json_array_elements(:visits::JSON)->> 'admission_date' admission_date )x)) BETWEEN COALESCE(b.from_dt, DATE '1900-01-01') AND COALESCE(b.to_dt, DATE '4000-01-01')
  42. ),sg as(
  43. SELECT sg.id
  44.   FROM sr_res_group g
  45.     LEFT JOIN LATERAL (SELECT array_agg(DISTINCT pbp.bed_profile_id) bed_profile_id_arr FROM md_profile_to_bed_profile pbp WHERE pbp.profile_id in (select to_int((json_array_elements(:visits::JSON) ->>'profile_id')))) AS pbp ON TRUE
  46.    LEFT JOIN LATERAL (SELECT b.bed_profile_id
  47.                        FROM sr_res_group_relationship rgr
  48.                        JOIN sr_resource r ON r.id = rgr.resource_id
  49.                        JOIN md_bed_resource br ON br.id = r.id
  50.                        JOIN md_bed b ON b.id = br.bed_id
  51.                       WHERE rgr.group_id = g.id
  52.                         AND rgr.role_id = 6) AS b ON TRUE
  53.   LEFT JOIN md_bed_profile bp ON (bp.id = b.bed_profile_id OR bp.id = ANY(pbp.bed_profile_id_arr))
  54.   LEFT JOIN md_clinical_statistical_group sg ON sg.bed_profile_id = bp.id
  55.   LEFT JOIN LATERAL (SELECT id, :careRegimenId::INTEGER FROM tb LIMIT 1) AS tb ON TRUE
  56.  WHERE g.id = coalesce(:resGroupId::INTEGER,(select to_int((json_array_elements(:visits::JSON) ->>'res_group_id')  )
  57. order by 1 desc limit 1))
  58.       AND sg.type_id = 3
  59.    AND sg.to_dt IS NULL
  60.    AND tb.id IS NULL
  61. --union
  62. --select sg.id from md_clinical_statistical_group sg where sg.bed_profile_id in (select to_int((json_array_elements(:visits::JSON) ->>'bed_profile_id')))
  63. ),csg AS(
  64. SELECT csg.id
  65.   FROM md_clinical_statistical_group csg
  66.   JOIN billing.billing_csg_to_bed_profile b ON csg.id = b.ksg_id
  67.   JOIN cl ON b.code_mo = ANY(cl.org_code_arr)
  68.   LEFT JOIN LATERAL (SELECT id FROM tb LIMIT 1) AS tb ON TRUE
  69.   LEFT JOIN LATERAL (SELECT id FROM sg LIMIT 1) AS sg ON TRUE
  70.  WHERE csg.to_dt IS NULL
  71.    AND csg.code LIKE '%'|| CASE WHEN cl.care_regimen_id IN (3,4,5) THEN '1' WHEN cl.care_regimen_id = 2 THEN '0' ELSE '' END
  72.    AND csg.type_id IN (3, 4)
  73.    AND tb.id IS NULL
  74.    AND sg.id IS NULL)
  75. , q as (SELECT g.id, g.code, g.code||' '||g.name as name
  76.   FROM md_clinical_statistical_group g
  77.   JOIN (SELECT id FROM tb
  78.         UNION ALL
  79.         SELECT id FROM sg
  80.         UNION ALL
  81.         SELECT id FROM csg
  82.        ) AS s ON s.id = g.id
  83. )
  84. ,q1 as (
  85. select case q.code
  86. when '1500030' then regexp_split_to_table('1504030,1564030', ',')
  87. when '1500040' then regexp_split_to_table('1504040,1564040,1564030', ',')
  88. when '1500050' then regexp_split_to_table('1504050,1564050', ',')
  89. when '1500010' then regexp_split_to_table('1560010', ',')
  90. when '1500170' then regexp_split_to_table('1564030', ',')
  91.   end as code_dop , *
  92. from q,cl
  93. where case when cl.clinic_id = 33664  then q.code in ('1500030','1500040','1500050','1500010','1500170')  end
  94. )
  95. select distinct id, name||' '||COALESCE(p.price, pp.price, 'Тариф не найден') as name from (
  96. select distinct id, name from q
  97. union all
  98. select g.id, g.code||' '||g.name as name
  99. from md_clinical_statistical_group g
  100. join q1 a on g.code = a.code_dop
  101. union all
  102. select distinct g.id, g.code||' '||g.name as name
  103. from md_clinical_statistical_group g
  104. join q on g.code like substring (q.code,1,2)||'_'||substring (q.code,4,4) and q.id <> g.id and (select max( typing.to_dt(x->>'outcome_date')) from json_array_elements(:visits::json) x) between coalesce (g.from_dt, DATE '1900-01-01') AND coalesce (g.to_dt, DATE '4000-01-01')
  105. )qall
  106. left join lateral (select p.price::text from fin_price_list l,fin_pl_position_to_csg c,fin_pl_position p where l.clinic_id=:organizationId::INTEGER
  107. and coalesce( (select typing.to_dt(max(x.outcome_date)) from (select json_array_elements(:visits::JSON)->> 'outcome_date' outcome_date )x),(select typing.to_dt(max(x.admission_date)) from (select json_array_elements(:visits::JSON)->> 'admission_date' admission_date )x))between coalesce (l.from_dt, DATE '1900-01-01') AND coalesce (l.to_dt, DATE '4000-01-01')
  108. and l.id=p.price_list_id and coalesce( (select typing.to_dt(max(x.outcome_date)) from (select json_array_elements(:visits::JSON)->> 'outcome_date' outcome_date )x),(select typing.to_dt(max(x.admission_date)) from (select json_array_elements(:visits::JSON)->> 'admission_date' admission_date )x)) between coalesce (p.from_dt, DATE '1900-01-01') AND coalesce (p.to_dt, DATE '4000-01-01')
  109. and p.id=c.position_id and c.csg_id=qall.id limit 1)p on true left join lateral (select p.price::text from fin_price_list l,billing.fin_pl_position_to_csg c,billing.fin_pl_position_polyclinic p where l.clinic_id=:organizationId::INTEGER
  110. and coalesce( (select typing.to_dt(max(x.outcome_date)) from (select json_array_elements(:visits::JSON)->> 'outcome_date' outcome_date )x),(select typing.to_dt(max(x.admission_date)) from (select json_array_elements(:visits::JSON)->> 'admission_date' admission_date )x))between coalesce (l.from_dt, DATE '1900-01-01') AND coalesce (l.to_dt, DATE '4000-01-01')
  111. and l.id=p.price_list_id and coalesce( (select typing.to_dt(max(x.outcome_date)) from (select json_array_elements(:visits::JSON)->> 'outcome_date' outcome_date )x),(select typing.to_dt(max(x.admission_date)) from (select json_array_elements(:visits::JSON)->> 'admission_date' admission_date )x)) between coalesce (p.from_dt, DATE '1900-01-01') AND coalesce (p.to_dt, DATE '4000-01-01')
  112. and p.id=c.position_id and c.csg_id=qall.id limit 1)pp on true
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement