/* 16.07.2004 16:16:57 - 16:16:58

amb_pkg

*/
create or replace
package amb_pkg as
/**
  Регистрационно-статистический модуль "Поликлиника".
  Реализация работы с формами модуля.
  Проверка прав доступа и правильности ввода.

  История модификации:
  -- Проверка на правильность заполнения сведений об оплате

  06-05-2004  Христюк А.С.     Добавил проверку на правильность заполнения
                               сведений об оплате в amb_talon_open_save
                               Изменил вызов services_pkg.save_service из
                               amb_visit2service_save
  27-04-2004  Христюк А.С.     Добавил процедуру amb_visit_stat_defaults
  23-04-2004  Горбунов И.П.    Исправил процедуру generate_end_mkb_by_visit (запретил изменение травматического диагноза на нетравматический и наооборот)
  22-04-2004  Горбунов И.П.    Исправил процедуру generate_end_mkb_by_visit
  21-04-2004  Горбунов И.П.    Добавил по посещениям генерацию записей в лист закл.диагнозов
  19-04-2004  Горбунов И.П.    Изменил  amb_visit_stat_display и amb_visit_ds_display (не выбирался признак отображения поля травма)
  16-04-2004  Христюк А.С.     Изменил в связи кончиной пакета services_pkg2
  30-03-2004  Горбунов И.П.    Создал.
*@headcom */ talon_open_grant constant varchar2(50):='TALON_OPEN'; amb_end_mkb_grant constant varchar2(50):='AMB_END_MKB'; amb_visit_grant constant varchar2(50):='AMB_VISIT'; /** Процедура получения информации по умолчанию в форме "Открытие талона". *@param pers_id Код пациента *@param polis_id Код полиса *@param open_date Дата открытия *@param open_doc_id Кто открыл *@param talon_type Тип талона *@param patient_info Информация о пациенте (место работы и т.п.) */ procedure amb_talon_open_default ( pers_id in out amb_talon.pers_id%type ,polis_id in out amb_talon.polis_id%type ,open_date in out amb_talon.open_date%type ,open_doc_id in out amb_talon.open_doc_id%type ,talon_type in out amb_talon.talon_type%type ,patient_info in out varchar2 ); /** Процедура отображения информации в форме "Открытие талона". *@param talon_id Идентификатор талона *@param res_cur Возвращаемый курсор с данными */ procedure amb_talon_open_display ( talon_id in amb_talon.talon_id%type ,res_cur out tools_pkg.hCursor ); /** Процедура сохранения информации в форме "Открытие талона". *@param a_rec Запись с параметрами формы */ procedure amb_talon_open_save ( a_rec in out amb_talon%rowtype ); /** Процедура удаления информации в форме "Открытие талона". *@param talon_id Идентификатор талона */ procedure amb_talon_delete ( talon_id in amb_talon.talon_id%type ); /** Процедура отображения информации по умолчанию в форме "Регистрация посещения по статталону". *@param talon_id Идентификатор талона *@param res_cur Возвращаемый курсор с данными */ procedure amb_visit_stat_defaults ( talon_id in amb_visit.talon_id%type ,res_cur out tools_pkg.hCursor ); /** Процедура отображения информации в форме "Регистрация посещения по статталону". *@param visit_id Идентификатор посещения *@param res_cur Возвращаемый курсор с данными */ procedure amb_visit_stat_display ( visit_id in amb_visit.visit_id%type ,res_cur out tools_pkg.hCursor ); /** Процедура сохранения информации в форме "Регистрация посещения по статталону". *@param a_rec Запись с параметрами формы */ procedure amb_visit_stat_save ( a_rec in out amb_visit%rowtype ); /** Процедура удаления информации в форме "Регистрация посещения по статталону". *@param visit_id Идентификатор посещения */ procedure amb_visit_delete ( visit_id in amb_visit.visit_id%type ); /** Процедура удаления информации в форме "Регистрация посещения по статталону". Удаляется посещение и связанная с ним информация *@param visit_id Идентификатор посещения */ procedure amb_visit_delete_cascade ( visit_id in amb_visit.visit_id%type ); /** Процедура отображения информации в форме "Регистрация сопутствующего диагноза". *@param ds_id Идентификатор сопутствующего заболевания *@param res_cur Возвращаемый курсор с данными */ procedure amb_visit_ds_display ( ds_id in amb_visit_ds.ds_id%type ,res_cur out tools_pkg.hCursor ); /** Процедура сохранения информации в форме "Регистрация сопутствующего диагноза". *@param a_rec Запись с параметрами формы */ procedure amb_visit_ds_save ( a_rec in out amb_visit_ds%rowtype ); /** Процедура удаления информации в форме "Регистрация сопутствующего диагноза". *@param ds_id Идентификатор сопутствующего заболевания */ procedure amb_visit_ds_delete ( ds_id in amb_visit_ds.ds_id%type ); /** Процедура удаления информации в форме "Регистрация сопутствующего диагноза". Сразу удаляются и связанные с сопутствующим заболеванием услуги *@param ds_id Идентификатор сопутствующего заболевания */ procedure amb_visit_ds_delete_cascade( ds_id in amb_visit_ds.ds_id%type ); /** Процедура выставления значений по умолчанию в форме "Регистрация выявленного заболевания". *@param reg_date Дата выявления заболевания *@param doc_id Кто выявил */ procedure amb_end_mkb_default ( reg_date in out amb_end_mkb.reg_date%type ,doc_id in out amb_end_mkb.doc_id%type ); /** Процедура отображения информации в форме "Регистрация выявленного заболевания". *@param ds_id Идентификатор диагноза *@param res_cur Возвращаемый курсор с данными */ procedure amb_end_mkb_display ( ds_id in amb_end_mkb.ds_id%type ,res_cur out tools_pkg.hCursor ); /** Процедура сохранения информации в форме "Регистрация выявленного заболевания". *@param a_rec Запись с параметрами формы */ procedure amb_end_mkb_save ( a_rec in out amb_end_mkb%rowtype ); /** Процедура удаления информации в форме "Регистрация выявленного заболевания". *@param ds_id Идентификатор диагноза */ procedure amb_end_mkb_delete ( ds_id in amb_end_mkb.ds_id%type ); /** Функция, по причине выдаче больничного листа определяющая, надо ли орображать поля с информацией об уходе (0 - нет, 1 - да) *@param bl_reason_cod Код причины выдачи больничного листка */ function get_page_care_num( bl_reason_cod in amb_visit.bl_reason_cod%type ) return integer; /** Процедура отображения информации в форме "Услуги по посещению". *@param ref_id Идентификатор связи *@param res_cur Возвращаемый курсор с данными */ procedure amb_visit2service_display ( ref_id in amb_visit2service.ref_id%type ,res_cur out tools_pkg.hCursor ); /** Процедура сохранения информации в форме "Услуги по посещению". *@param a_rec Запись с параметрами формы *@param mkb_cod мкб код заболевания *@param serv_cod код наименования услуги *@param service_count количество, в котором оказана услуга */ procedure amb_visit2service_save ( a_rec in out amb_visit2service%rowtype ,mkb_cod in services.mkb_cod%type ,serv_cod in out services.serv_cod%type ,service_count in out services.service_count%type ); /** Процедура удаления информации в форме "Услуги по посещению". *@param ref_id Идентификатор связи */ procedure amb_visit2service_delete ( ref_id in amb_visit2service.ref_id%type ); end amb_pkg; / create or replace package body amb_pkg as -- Константа, устанавливающая тип талона (пока С - статталон) c_talon_type amb_talon.talon_type%type:='С'; -- Константа, устанавливающая тип статталона c_talon_type_stat amb_talon.talon_type%type:='С'; function allowed_generate_end_mkb( nature_cod amb_visit.nature_cod%type ,change_mkb_cod amb_visit.change_mkb_cod%type ,change_ds_date amb_visit.change_ds_date%type ) return boolean is allowed boolean; begin if nature_cod is not null or change_mkb_cod is not null or change_ds_date is not null then allowed:=true; else allowed:=false; end if; return allowed; end; -- Процедура генерации записи в листе закл.диагнозов по посещению procedure generate_end_mkb_by_visit( new_rec amb_visit%rowtype ,old_rec amb_visit%rowtype ) is wEndMkb amb_end_mkb%rowtype; -- Курсор для поиска случая заболевания cursor c_end_mkb (wPersId person.pers_id%type, wDate date, wMkb spr_mkb.mkb_cod%type) is select ae.* from amb_end_mkb ae where ae.pers_id=wPersId and ae.reg_date=wDate and ae.mkb_cod=wMkb; begin -- Проверяем, могла ли по старым данным посещения создаваться запись в листе заключительных диахнозов if allowed_generate_end_mkb(old_rec.nature_cod, old_rec.change_mkb_cod, old_rec.change_ds_date) -- Если регистрация проводилась - то откатываемся в состояние, которое было then -- Считываем случай заболевания, зарегистрированный по старому посещению if old_rec.change_ds_date is not null then open c_end_mkb(old_rec.pers_id, old_rec.change_ds_date, old_rec.mkb_cod); else open c_end_mkb(old_rec.pers_id, old_rec.visit_date, old_rec.mkb_cod); end if; fetch c_end_mkb into wEndMkb; close c_end_mkb; -- Определяем, модифицировался ли в посещении существующий заключительный диагноз if old_rec.change_ds_date is not null -- Если модифицировался, то откатываеся назад then if wEndMkb.Ds_Id is not null then wEndMkb.Mkb_Cod:=old_rec.change_mkb_cod; amb_core_pkg.amb_end_mkb_save(wEndMkb); end if; -- Иначе - удаляем запись в листе заключительных диагнозов else amb_core_pkg.amb_end_mkb_delete(wEndMkb.Ds_Id); end if; end if; -- Проверяем, надо ли по новым данным посещения создавать запись в листе заключительных диахнозов if allowed_generate_end_mkb(new_rec.nature_cod, new_rec.change_mkb_cod, new_rec.change_ds_date) then -- Проверяем введенные данные на корректность if not amb_info_pkg.is_list_end_ds(new_rec.mkb_cod)=1 then raise_application_error(-20998,'MKB_COD Указанный диагноз не регистрируется в листе заключительных диагнозов'); end if; if new_rec.change_mkb_cod is not null and not amb_info_pkg.is_list_end_ds(new_rec.mkb_cod)=1 then raise_application_error(-20998,'CHANGE_MKB_COD Указанный диагноз не регистрируется в листе заключительных диагнозов'); end if; if new_rec.visit_date<= new_rec.change_ds_date then raise_application_error(-20998,'CHANGE_DS_DATE Дата регистрации изменяемого диагноза не может быть позднее даты посещения '); end if; if new_rec.change_ds_date is not null and new_rec.change_mkb_cod is null then raise_application_error(-20998,'CHANGE_MKB_COD Не указан изменяемый диагноз'); end if; if new_rec.change_ds_date is null and new_rec.change_mkb_cod is not null then raise_application_error(-20998,'CHANGE_DS_DATE Не указана дата регистрации изменяемого диагноза'); end if; -- Проверяем, что мы должны сделать - внести новую запись в лист уточненных диагнозов или модифицировать существующий диагноз if new_rec.change_ds_date is null -- Регистрируем новую запись в листе уточненных диагнозов then wEndMkb:=null; wEndMkb.Pers_Id:=new_rec.pers_id; wEndMkb.reg_date := new_rec.visit_date; wEndMkb.doc_id := new_rec.doc_id; wEndMkb.mkb_cod := new_rec.mkb_cod; wEndMkb.nature_cod := new_rec.nature_cod; wEndMkb.trauma_cod := new_rec.trauma_cod; amb_pkg.amb_end_mkb_save(wEndMkb); else -- Ищем существующую запись в листе уточненных диагнозов open c_end_mkb(new_rec.pers_id, new_rec.change_ds_date, new_rec.change_mkb_cod); fetch c_end_mkb into wEndMkb; close c_end_mkb; if wEndMkb.Ds_Id is null then raise_application_error(-20998,'CHANGE_DS_DATE Диагноз '||new_rec.change_mkb_cod||' не зарегистрирован в листе уточненных диагнозов'); -- Модифицируем диагноз else -- Проверяем, не меняется ли травматический диагноз на нетравматический if (amb_info_pkg.is_trauma_ds(new_rec.mkb_cod)+amb_info_pkg.is_trauma_ds(new_rec.change_mkb_cod))=1 then raise_application_error(-20998,'CHANGE_MKB_COD Нельзя изменять травматический диагноз на нетравматический и наооборот'); else wEndMkb.mkb_cod := new_rec.mkb_cod; amb_pkg.amb_end_mkb_save(wEndMkb); end if; end if; end if; end if; end; procedure amb_talon_open_default ( pers_id in out amb_talon.pers_id%type ,polis_id in out amb_talon.polis_id%type ,open_date in out amb_talon.open_date%type ,open_doc_id in out amb_talon.open_doc_id%type ,talon_type in out amb_talon.talon_type%type ,patient_info in out varchar2 ) is begin select nvl(open_date, tools_pkg.get_current_date) ,nvl(open_doc_id, tools_pkg.get_current_doc_id) ,person_pkg.get_pacient_info(pers_id) into open_date ,open_doc_id, patient_info from dual; end; procedure amb_talon_open_display ( talon_id in amb_talon.talon_id%type ,res_cur out tools_pkg.hCursor ) is w_rec amb_talon%rowtype; wPagePayNum integer; wPageSpecNum integer; wPageParentNum integer; begin may_do.check_permission('select',talon_open_grant); -- Счиытваем текущую запись w_rec:=amb_core_pkg.amb_talon_get(talon_id); -- Определяем номера отображаемых страниц, связанных со способом оплаты services_pkg.get_page_num_for_pay(w_rec.pay_cod,w_rec.spec_event_cod ,wPagePayNum ,wPageSpecNum ,wPageParentNum); open res_cur for select a.* ,person_pkg.get_pacient_info(a.pers_id) patient_info ,wPagePayNum page_pay_num ,wPageSpecNum page_spec_num ,wPageParentNum page_parent_num from amb_talon a where a.talon_id=amb_talon_open_display.talon_id; end; procedure amb_talon_open_save ( a_rec in out amb_talon%rowtype ) is wCount number; begin may_do.check_permission('save',talon_open_grant,a_rec.talon_id); -- Проставляем тип талона по умолчанию if a_rec.talon_type is null then a_rec.talon_type:=c_talon_type; end if; -- Проверка информации на правильность заполнения if a_rec.open_doc_id is null then raise_application_error(-20998,'OPEN_DOC_ID Не указано, кто открыл талон'); end if; -- Проверка на правильность заполнения сведений об оплате services_pkg.check_pay_info(a_rec.pay_cod,a_rec.polis_id,a_rec.contract_id); -- Проверяем, чтобы через эту процедуру не модифицировали талон, по которому есть посещения if nvl(a_rec.talon_id,0) <> 0 then select count(*) into wCount from amb_visit v where v.talon_id=a_rec.talon_id; if wCount >0 then raise_application_error (-20001,'Через данную форму нельзя модифицировать талон, по которому уже есть посещения'); end if; end if; -- Проверяем наличие в списках Застрахованных if a_rec.polis_id is not null then services_pkg.check_in_list_by_polis(a_rec.polis_id, a_rec.pay_cod, a_rec.open_date); end if; amb_core_pkg.amb_talon_save(a_rec); end; procedure amb_talon_delete ( talon_id in amb_talon.talon_id%type ) is begin may_do.check_permission('delete',talon_open_grant); amb_core_pkg.amb_talon_delete(talon_id); end; function get_page_care_num( bl_reason_cod in amb_visit.bl_reason_cod%type ) return integer is wPageNum integer; begin if amb_info_pkg.is_bl_reason_cure(bl_reason_cod)=1 then wPageNum:=1; else wPageNum:=0; end if; return wPageNum; end; -- Процедура проверки правильности ввода информации по посещению procedure check_visit ( a_rec in out amb_visit%rowtype ) is begin if a_rec.pers_id is null then raise_application_error(-20998,'PERS_ID Не указан пациент'); end if; if a_rec.visit_date is null then raise_application_error(-20998,'VISIT_DATE Не указана дата посещения'); end if; if a_rec.visit_date > tools_pkg.get_current_date then raise_application_error(-20998,'VISIT_DATE Дата посещения не может быть больше текущей'); end if; if not person_pkg.is_date_after_bday(a_rec.pers_id, a_rec.visit_date) then raise_application_error(-20998,'VISIT_DATE Дата посещения не может ранее даты рождения пациента'); end if; if a_rec.doc_id is null then raise_application_error(-20998,'DOC_ID Не указан врач'); end if; if a_rec.mkb_cod is null then raise_application_error(-20998,'MKB_COD Не указан основной диагноз'); end if; if a_rec.change_ds_date is null and a_rec.change_mkb_cod is not null then raise_application_error(-20998,'CHANGE_DS_DATE Не указана дата регистрации изменяемого диагноза'); end if; if amb_info_pkg.is_trauma_ds(a_rec.mkb_cod)=1 and a_rec.trauma_cod is null then raise_application_error(-20998,'TRAUMA_COD Не указана причина травмы'); end if; if a_rec.purpose_cod is null then raise_application_error(-20998,'PURPOSE_COD Не указана цель посещения'); end if; if a_rec.place_visit_cod is null then raise_application_error(-20998,'PLACE_VISIT_COD Не указано место посещения'); end if; if a_rec.pay_cod is null then raise_application_error(-20998,'PAY_COD Не указан вид оплаты'); end if; if a_rec.bl_status is null and a_rec.bl_reason_cod is not null then raise_application_error(-20998,'BL_STATUS Не указано, больничный лист открыт или закрыт'); end if; if a_rec.bl_status is not null and a_rec.bl_reason_cod is null then raise_application_error(-20998,'BL_REASON_COD Не указана причина выдачи б.л.'); end if; if amb_info_pkg.is_bl_reason_cure(a_rec.bl_reason_cod)=1 and a_rec.care_count_year is null then raise_application_error(-20998,'CARE_COUNT_YEAR Не указано кол-во полных лет лица, получившего больничный лист по уходу'); end if; if amb_info_pkg.is_bl_reason_cure(a_rec.bl_reason_cod)=1 and a_rec.care_sex is null then raise_application_error(-20998,'CARE_SEX Не указан пол лица, получившего больничный лист по уходу'); end if; end; procedure amb_visit_stat_defaults ( talon_id in amb_visit.talon_id%type ,res_cur out tools_pkg.hCursor ) is wTalon amb_talon%rowtype; wPagePayNum integer; wPageSpecNum integer; wPageParentNum integer; begin if talon_id is not null then wTalon:=amb_core_pkg.amb_talon_get(talon_id); services_pkg.get_page_num_for_pay(wTalon.pay_cod,wTalon.spec_event_cod ,wPagePayNum ,wPageSpecNum ,wPageParentNum); end if; open res_cur for select wTalon.talon_id talon_id ,wTalon.pers_id pers_id ,person_pkg.get_pacient_info(wTalon.pers_id) patient_info ,wTalon.pay_cod pay_cod ,wTalon.polis_id polis_id ,wTalon.contract_id contract_id ,wTalon.is_paid is_paid ,wTalon.spec_event_cod spec_event_cod ,wTalon.parent_person_id parent_person_id ,nvl(wTalon.open_date,tools_pkg.get_current_date) visit_date ,tools_pkg.get_current_doc_id doc_id ,wPagePayNum page_pay_num ,wPageSpecNum page_spec_num ,wPageParentNum page_parent_num from dual; end; procedure amb_visit_stat_display ( visit_id in amb_visit.visit_id%type ,res_cur out tools_pkg.hCursor ) is w_rec amb_visit%rowtype; wPagePayNum integer; wPageSpecNum integer; wPageParentNum integer; begin may_do.check_permission('select',amb_visit_grant); -- Счиытваем текущую запись w_rec:=amb_core_pkg.amb_visit_get(visit_id); -- Определяем номера отображаемых страниц, связанных со способом оплаты services_pkg.get_page_num_for_pay(w_rec.pay_cod,w_rec.spec_event_cod ,wPagePayNum ,wPageSpecNum ,wPageParentNum); open res_cur for select v.* ,person_pkg.get_pacient_info(v.pers_id) patient_info ,wPagePayNum page_pay_num ,wPageSpecNum page_spec_num ,wPageParentNum page_parent_num ,amb_pkg.get_page_care_num(v.bl_reason_cod) page_care_num ,decode(amb_info_pkg.is_trauma_ds(v.mkb_cod),1,1,0) view_trauma from amb_visit v where v.visit_id=amb_visit_stat_display.visit_id; end; procedure amb_visit_stat_save ( a_rec in out amb_visit%rowtype ) is wTalon amb_talon%rowtype; wOldVisit amb_visit%rowtype; wVisit2Serv amb_visit2service%rowtype; wServices services%rowtype; -- Курсор для выборки оказанных услуг по посещению cursor cVisit2Serv(wVisitId number) is select v2s.* from amb_visit2service v2s where v2s.visit_id=wVisitId; begin may_do.check_permission('save',amb_visit_grant,a_rec.visit_id); -- Выбираем старую запись if a_rec.visit_id is not null then wOldVisit:=amb_core_pkg.amb_visit_get(a_rec.visit_id); else wOldVisit:=null; end if; -- Проверяем поля на правильность заполнения check_visit(a_rec); -- Проверяем, есть ли талон if a_rec.talon_id is null then -- автоматически регистрируем талон по посещению wTalon.pers_id:=a_rec.pers_id; wTalon.Talon_Type:=c_talon_type; wTalon.Open_Date:=a_rec.visit_date; wTalon.Open_Doc_Id:=a_rec.doc_id; wTalon.Pay_Cod:=a_rec.pay_cod; wTalon.polis_id:=a_rec.polis_id; wTalon.Contract_Id:=a_rec.contract_id; wTalon.Spec_Event_Cod:=a_rec.Spec_Event_Cod; wTalon.Parent_Person_Id:=a_rec.Parent_Person_Id; wTalon.Close_Date:=a_rec.visit_date; amb_core_pkg.amb_talon_save(wTalon); a_rec.talon_id:=wTalon.Talon_Id; end if; -- Сохраняем посещение amb_core_pkg.amb_visit_save(a_rec); -- Регистрируем случай заболевания generate_end_mkb_by_visit(a_rec,wOldVisit); -- Изменяем данные талона update amb_talon t set t.close_date=a_rec.visit_date where t.talon_id=a_rec.talon_id; -- Изменяем данные об услугах, оказанных в посещении. open cVisit2Serv(a_rec.visit_id); loop fetch cVisit2Serv into wVisit2Serv; exit when cVisit2Serv%notfound; -- Выбираем услугу, связанную с посещением select * into wServices from services s where s.service_id=wVisit2Serv.Service_Id; -- Если у посещения изменился основной диагноз, то у услуг по основному диагнозы меняем диагноз if wServices.Mkb_Cod=wOldVisit.Mkb_cod then wServices.Mkb_Cod:=a_rec.mkb_cod; end if; amb_visit2service_save(wVisit2Serv, wServices.Mkb_Cod, wServices.serv_cod,wServices.service_count); end loop; close cVisit2Serv; end; procedure amb_visit_delete ( visit_id in amb_visit.visit_id%type ) is begin may_do.check_permission('delete',amb_visit_grant); amb_core_pkg.amb_visit_delete(visit_id); end; procedure amb_visit_delete_cascade ( visit_id in amb_visit.visit_id%type ) is -- Курсор для сопутствующих заболевания по посещению cursor cVisitDs(wVisitId number) is select vd.ds_id from amb_visit_ds vd where vd.visit_id=wVisitId; -- Курсор для услуг по посещению cursor cVisit2Services(wVisitId number) is select v2s.ref_id from amb_visit2service v2s where v2s.visit_id=wVisitId; wVisit amb_visit%rowtype; wOldVisit amb_visit%rowtype :=Null; begin may_do.check_permission('delete',amb_visit_grant); -- Выбираем удаляемую запись wVisit:=amb_core_pkg.amb_visit_get(visit_id); -- Удаляем все сопутствующие заболевания по посещению for i in cVisitDs(wVisit.Visit_Id) loop amb_pkg.amb_visit_ds_delete_cascade(i.ds_id); end loop; -- Удаляем все услуги по посещению for i in cVisit2Services(wVisit.Visit_Id) loop amb_pkg.amb_visit2Service_delete(i.ref_id); end loop; -- Удаляем случай заболевания, связанный с посещением generate_end_mkb_by_visit( wOldVisit, wVisit); -- Удаляем посещение amb_core_pkg.amb_visit_delete(visit_id); end; procedure amb_visit_ds_display ( ds_id in amb_visit_ds.ds_id%type ,res_cur out tools_pkg.hCursor ) is begin may_do.check_permission('select',amb_visit_grant); open res_cur for select a.* ,decode(amb_info_pkg.is_trauma_ds(a.mkb_cod),1,1,0) view_trauma from amb_visit_ds a where a.ds_id=amb_visit_ds_display.ds_id; end; procedure amb_visit_ds_save ( a_rec in out amb_visit_ds%rowtype ) is wOldRec amb_visit_ds%rowtype; wVisit amb_visit%rowtype; wOldVisit amb_visit%rowtype; wVisit2Serv amb_visit2service%rowtype; wServices services%rowtype; -- Курсор для выборки оказанных услуг по посещению cursor cVisit2Serv(wVisitId number, wMkb spr_mkb.mkb_cod%type) is select v2s.* from amb_visit2service v2s, services s where v2s.service_id=s.service_id and v2s.visit_id=wVisitId and s.mkb_cod=wMkb; begin may_do.check_permission('save',amb_visit_grant,a_rec.ds_id); -- Считываем старые значения if a_rec.ds_id is not null then wOldRec:=amb_core_pkg.amb_visit_ds_get(a_rec.ds_id); else wOldRec:=null; end if; wVisit:=amb_core_pkg.amb_visit_get(a_rec.visit_id); amb_core_pkg.amb_visit_ds_save(a_rec); -- if wOldRec.Mkb_Cod <> a_rec.mkb_cod then -- Изменяем данные об услугах, оказанных по сопутствующему заболеванию. open cVisit2Serv(a_rec.visit_id,wOldRec.Mkb_Cod); loop fetch cVisit2Serv into wVisit2Serv; exit when cVisit2Serv%notfound; -- Выбираем услугу, связанную с посещением select * into wServices from services s where s.service_id=wVisit2Serv.Service_Id; wServices.Mkb_Cod:=a_rec.mkb_cod; amb_visit2service_save(wVisit2Serv, wServices.Mkb_Cod, wServices.serv_cod,wServices.service_count); end loop; close cVisit2Serv; end if; -- Регистрируем случай заболевания, иммитируя посещение -- Подготавливаем запись о новом посещении wVisit.Mkb_Cod:=a_rec.mkb_cod; wVisit.Nature_Cod:=a_rec.nature_cod; wVisit.Trauma_Cod :=a_rec.Trauma_Cod; wVisit.Change_Mkb_Cod :=a_rec.Change_Mkb_Cod; wVisit.Change_Ds_Date :=a_rec.Change_Ds_Date; -- Подготавливаем запись о старом значении посещения wOldVisit:=wVisit; wOldVisit.Mkb_Cod:=wOldRec.mkb_cod; wOldVisit.Nature_Cod:=wOldRec.nature_cod; wOldVisit.Trauma_Cod :=wOldRec.Trauma_Cod; wOldVisit.Change_Mkb_Cod :=wOldRec.Change_Mkb_Cod; wOldVisit.Change_Ds_Date :=wOldRec.Change_Ds_Date; generate_end_mkb_by_visit(wVisit,wOldVisit); end; procedure amb_visit_ds_delete ( ds_id in amb_visit_ds.ds_id%type ) is wOldRec amb_visit_ds%rowtype; wVisit amb_visit%rowtype; begin may_do.check_permission('delete',amb_visit_grant); -- Считываем старые значения wOldRec:=amb_core_pkg.amb_visit_ds_get(ds_id); -- wVisit:=amb_core_pkg.amb_visit_get(a_rec.visit_id); amb_core_pkg.amb_visit_ds_delete(ds_id); end; procedure amb_visit_ds_delete_cascade( ds_id in amb_visit_ds.ds_id%type ) is wOldRec amb_visit_ds%rowtype; wRefId amb_visit2service.ref_id%type; wVisit amb_visit%rowtype; wOldVisit amb_visit%rowtype; -- Курсор для выборки оказанных услуг по посещению cursor cVisit2Serv(wVisitId number, wMkb spr_mkb.mkb_cod%type) is select v2s.ref_id from amb_visit2service v2s, services s where v2s.service_id=s.service_id and v2s.visit_id=wVisitId and s.mkb_cod=wMkb; begin may_do.check_permission('delete',amb_visit_grant); -- Считываем старые значения wOldRec:=amb_core_pkg.amb_visit_ds_get(ds_id); wOldVisit:=amb_core_pkg.amb_visit_get(wOldRec.Visit_Id); -- Выбираем все услуги, связанные с сопутствующим заболеванием. for i in cVisit2Serv(wOldRec.Visit_Id, wOldRec.Mkb_Cod) loop amb_visit2service_delete(i.ref_id); end loop; -- Регистрируем случай заболевания, иммитируя посещение -- Подготавливаем запись о старом значении посещения wOldVisit.Mkb_Cod:=wOldRec.mkb_cod; wOldVisit.Nature_Cod:=wOldRec.nature_cod; wOldVisit.Trauma_Cod :=wOldRec.Trauma_Cod; wOldVisit.Change_Mkb_Cod :=wOldRec.Change_Mkb_Cod; wOldVisit.Change_Ds_Date :=wOldRec.Change_Ds_Date; wVisit:=null; generate_end_mkb_by_visit(wVisit, wOldVisit); amb_core_pkg.amb_visit_ds_delete(ds_id); end; procedure amb_end_mkb_default ( reg_date in out amb_end_mkb.reg_date%type ,doc_id in out amb_end_mkb.doc_id%type ) is begin -- Выставляем по умолчанию дату диагноза и врача select nvl(amb_end_mkb_default.doc_id, tools_pkg.get_current_doc_id ) ,nvl(amb_end_mkb_default.reg_date, tools_pkg.get_current_date) into amb_end_mkb_default.doc_id, amb_end_mkb_default.reg_date from dual; end; procedure amb_end_mkb_display ( ds_id in amb_end_mkb.ds_id%type ,res_cur out tools_pkg.hCursor ) is begin may_do.check_permission('select',amb_end_mkb_grant); -- Выбираем данные записи open res_cur for select em.* ,decode(amb_info_pkg.is_trauma_ds(em.mkb_cod),1,1,0) view_trauma from amb_end_mkb em where em.ds_id=amb_end_mkb_display.ds_id; end; procedure amb_end_mkb_save ( a_rec in out amb_end_mkb%rowtype ) is begin -- Проверка прав may_do.check_permission('save',amb_end_mkb_grant, a_rec.ds_id); -- Проверка данных на корректность if amb_info_pkg.is_trauma_ds(a_rec.mkb_cod)=1 and a_rec.trauma_cod is null then raise_application_error(-20998,'TRAUMA_COD Не указана причина травмы'); end if; -- Выставляем автоматически признак впервые выявленного заболевания if amb_info_pkg.is_first_ds(a_rec.nature_cod)=1 then a_rec.is_first:='Y'; else a_rec.is_first:='N'; end if; if a_rec.reg_date is null then raise_application_error(-20998,'REG_DATE Не указана дата выявления заболевания'); end if; if not person_pkg.is_date_after_bday(a_rec.pers_id, a_rec.reg_date) then raise_application_error(-20998,'REG_DATE Дата выявления не может быть раньше даты рождения пациента'); end if; if a_rec.reg_date >tools_pkg.get_current_date then raise_application_error(-20998,'REG_DATE Дата выявления не может быть позже текущей даты'); end if; -- Сохраняем случай заболевания amb_core_pkg.amb_end_mkb_save(a_rec); end; procedure amb_end_mkb_delete ( ds_id in amb_end_mkb.ds_id%type ) is begin may_do.check_permission('delete',amb_end_mkb_grant); amb_core_pkg.amb_end_mkb_delete(ds_id); end; procedure amb_visit2service_display ( ref_id in amb_visit2service.ref_id%type ,res_cur out tools_pkg.hCursor ) is begin open res_cur for select v2s.* ,s.serv_cod serv_cod ,s.service_count service_count ,s.summ_pay summ_pay ,s.tarif_pay from amb_visit2service v2s ,services s where v2s.service_id=s.service_id and v2s.ref_id=amb_visit2service_display.ref_id; end; procedure amb_visit2service_save ( a_rec in out amb_visit2service%rowtype ,mkb_cod in services.mkb_cod%type ,serv_cod in out services.serv_cod%type ,service_count in out services.service_count%type ) is wServices services%rowtype; wVisit amb_visit%rowtype; begin if a_rec.visit_id is null then raise_application_error(-20998,'VISIT_ID Не указано посещение'); else wVisit:=amb_core_pkg.amb_visit_get(a_rec.visit_id); end if; wServices:=services_core_pkg.services_get(a_rec.service_id); -- Подготавливаем услугу к сохранению wServices.service_id:=a_rec.service_id; wServices.pers_id:=wVisit.pers_id; wServices.parent_person_id:=wVisit.parent_person_id; wServices.mkb_cod:=mkb_cod; -- wServices.who_send_Cod:=wVisit %%%%%%%%%%; wServices.contract_id:=wVisit.contract_id; wServices.polis_id:=wVisit.polis_id; wServices.doc_id:=wVisit.doc_id ; wServices.pay_cod:=wVisit.pay_cod ; wServices.send_mkb_cod:=wVisit.mkb_cod; wServices.spec_event_cod:=wVisit.spec_event_cod ; wServices.serv_cod:=serv_cod; wServices.service_date:=wVisit.visit_date; wServices.service_count:=service_count; wServices.is_paid:=wVisit.is_paid; wServices.factura_date:=wVisit.visit_date; wServices.lpu_type:=0; -- Сохраняем услугу services_pkg.save_service(wServices); a_rec.service_id:=wServices.service_id; amb_core_pkg.amb_visit2service_save(a_rec); end; procedure amb_visit2service_delete ( ref_id in amb_visit2service.ref_id%type ) is wRec amb_visit2service%rowtype; begin -- Выбираем старую запись wRec:=amb_core_pkg.amb_visit2service_get(ref_id); -- Удаляем связь посещения с услугой amb_core_pkg.amb_visit2service_delete(ref_id); -- Удаляем услугу services_pkg.delete_service(wRec.Service_Id); end; end amb_pkg; /