Advertisement
Guest User

Untitled

a guest
Apr 18th, 2019
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 60.19 KB | None | 0 0
  1. CREATE OR REPLACE PROCEDURE IMP70_P_ISKUS_AMB_TALONS
  2. (
  3.   pnLPU                                IN  NUMBER,
  4.   pnLOG_IDENT                          OUT NUMBER,
  5.   pnERR_IGNORE                         IN  NUMBER DEFAULT 0
  6. )
  7. IS
  8.   nDISEAS_TYPES_POLIK                  CONSTANT D_DISEASECASE_TYPES.DCT_CODE%TYPE := 0;
  9.                                                            -- тип случая заболевания "поликлиника"
  10.   nFD_PRVD_CONDITS_POLIK               CONSTANT D_FD_PRVD_CONDITS.ID%TYPE := 3;
  11.                                                            -- условие оказания "поликлиника"
  12.  
  13.   sVIS_TEMPL_CODE_FTIZ                 CONSTANT D_VISIT_TEMPLATES.VT_CODE%TYPE := 'ftiz2-mini';
  14.                                                            -- шаблон приема "прием фтизиатра3"
  15.  
  16.  
  17.   sCONTEXT_EMPLOYER                    D_PKG_STD.tSTR;     -- контекстная переменная EMPLOYER
  18.  
  19.   nVER_VISITPURPOSES                   D_PKG_STD.tREF;     -- идентификатор версии для раздела VISITPURPOSES
  20.   nVER_VISITRESULTS                    D_PKG_STD.tREF;     -- идентификатор версии для раздела VISITRESULTS
  21.   nVER_PAYMENT_KIND                    D_PKG_STD.tREF;     -- идентификатор версии для раздела PAYMENT_KIND
  22.   nVER_VISITPLACES                     D_PKG_STD.tREF;     -- идентификатор версии для раздела VISITPLACES
  23.   nVER_SERVICES                        D_PKG_STD.tREF;     -- идентификатор версии для раздела SERVICES
  24.   nVER_MKB                             D_PKG_STD.tREF;     -- идентификатор версии для раздела MKB10
  25.  
  26.   nAGENTS_ID                           D_PKG_STD.tREF;     -- идентификатор записи в таблице D_AGENTS
  27.   nPERSMEDCARD_ID                      D_PKG_STD.tREF;     -- идентификатор записи в таблице D_PERSMEDCARD
  28.   nDIRECTIONS_ID                       D_PKG_STD.tREF;     -- идентификатор записи в таблице D_DIRECTIONS
  29.   nDIRECTION_SERVICES_ID               D_PKG_STD.tREF;     -- идентификатор записи в таблице D_DIRECTION_SERVICES
  30.   nDISEASECASES_ID                     D_PKG_STD.tREF;     -- идентификатор записи в таблице D_DISEASECASES
  31.   nVISITS_ID                           D_PKG_STD.tREF;     -- идентификатор записи в таблице D_VISITS
  32.   nVIS_DIAGNOSISES_ID                  D_PKG_STD.tREF;     -- идентификатор записи в таблице D_VIS_DIAGNOSISES
  33.   nAMB_TALONS_ID                       D_PKG_STD.tREF;     -- идентификатор записи в таблице D_AMB_TALONS
  34.   nAMB_TALON_VISITS_ID                 D_PKG_STD.tREF;     -- идентификатор записи в таблице D_AMB_TALON_VISITS
  35.   nAMB_TALON_MKBS_ID                   D_PKG_STD.tREF;     -- идентификатор записи в таблице D_AMB_TALON_MKBS
  36.   nLPUDICT_ID                          D_PKG_STD.tREF;     -- идентификатор записи в таблице D_LPUDICT
  37.  
  38.  
  39.   nNOMER_PP                            D_PKG_STD.tREF;     -- номер по порядку строки испорта
  40.   nERROR                               D_PKG_STD.tREF := 0;-- кол-во ошибок импорта
  41.   sERROR_CODE                          D_PKG_STD.tSTR;     -- код ошибки
  42.   sCARD_NUMB                           D_PKG_STD.tSTR;     -- номер мед карты пациента
  43.   nVIS_PURPOSE                         D_PKG_STD.tREF;     -- идентификатор записи D_VISITPURPOSES
  44.   nVIS_RESULT                          D_PKG_STD.tREF;     -- идентификатор записи D_VISITRESULTS
  45.   nPAYMENT_KIND                        D_PKG_STD.tREF;     -- идентификатор записи D_PAYMENT_KIND
  46.   nVIS_PLACE                           D_PKG_STD.tREF;     -- идентификатор записи D_VISITPLACES
  47.   nDC_TYPE                             D_PKG_STD.tREF;     -- тип случая заболевания
  48.   nDC_IS_CLOSE                         D_PKG_STD.tREF;     -- признак закрытия случая (1- закрывается, 0 - нет)
  49.   nSERVICE                             D_PKG_STD.tREF;     -- Услуга ЛПУ
  50.   nEMPLOYERS                           D_PKG_STD.tREF;     -- врач
  51.   nUET_COUNT                           D_PKG_STD.tREF;     -- Кол-во затраченных Условных Единиц Труда (УЕТ)
  52.   nVISIT_TEMPLATE                      D_PKG_STD.tREF;     -- Шаблон приема
  53.   nMKB                                 D_PKG_STD.tREF;     -- идентификатор кода МКБ10
  54.   sDC_CONTENT                          D_PKG_STD.tSTR;     -- содержание случая заболевания
  55.  
  56.  
  57.   --Процедура добавления записи в лог импорта
  58.   PROCEDURE LG
  59.   (
  60.     ppsLOG_CODE         IN VARCHAR2,
  61.     ppsLOG_TEXT         IN VARCHAR2,
  62.     ppsINFO1            IN VARCHAR2 DEFAULT NULL,
  63.     ppsINFO2            IN VARCHAR2 DEFAULT NULL,
  64.     ppsINFO3            IN VARCHAR2 DEFAULT NULL
  65.   )
  66.   IS
  67.   BEGIN
  68.     D_PKG_IMP_LOG.ADD(pnLOG_IDENT, ppsLOG_CODE, ppsLOG_TEXT, ppsINFO1, ppsINFO2, ppsINFO3);
  69.   END LG;
  70.  
  71.  
  72.   --функция проверки наличия пациента в D_AGENTS
  73.   PROCEDURE GET_AGENT_ID
  74.   (
  75.     psFIO               IN  VARCHAR2,
  76.     pdBIRTHDATE         IN  DATE,
  77.     psSNILS             IN  VARCHAR2,
  78.     pnAGENTS_ID         OUT NUMBER,
  79.     psERROR_CODE        OUT VARCHAR2
  80.   )
  81.   IS
  82.   BEGIN
  83.     SELECT a.ID
  84.       INTO pnAGENTS_ID
  85.       FROM D_AGENTS a
  86.      WHERE UPPER(regexp_replace(a.SURNAME||a.FIRSTNAME||a.LASTNAME,'(-)*(\s)','')) = UPPER(regexp_replace(psFIO,'(-)*(\s)',''))
  87.        AND a.BIRTHDATE = pdBIRTHDATE
  88.        AND (a.SNILS = regexp_replace(psSNILS,'\D','')
  89.             OR psSNILS IS NULL);
  90.  
  91.   EXCEPTION
  92.     WHEN NO_DATA_FOUND THEN
  93.       pnAGENTS_ID  := NULL;
  94.       psERROR_CODE := 'ERR_NDF_AGENTS';
  95.     WHEN TOO_MANY_ROWS THEN
  96.       pnAGENTS_ID       := NULL;
  97.       psERROR_CODE := 'ERR_TMR_AGENTS';
  98.   END GET_AGENT_ID;
  99.  
  100.   --процедура установки контекста EMPLOYER
  101.   PROCEDURE set_context_employer
  102.   (
  103.     psEMPLOYER          IN  VARCHAR2
  104.   )
  105.   IS
  106.   BEGIN
  107.     D_PKG_SES.SETCONTEXT('MED','EMPLOYER',psEMPLOYER);
  108.   END;
  109.  
  110.  
  111.  
  112. BEGIN
  113.  
  114.   D_PKG_IMP_LOG.INIT('IMP70_ISKUS_AMB_TALONS', pnLPU, pnLOG_IDENT, 0);
  115.   lg('START_IMP','Начало импорта в '||TO_CHAR(SYSDATE,'dd.mm.yyyy hh24:mi:ss'));
  116.  
  117.   --блок получения версий для разделов
  118.   nVER_VISITPURPOSES       := D_PKG_VERSIONS.GET_VERSION_BY_LPU(1,pnLPU,'VISITPURPOSES');
  119.   nVER_VISITRESULTS        := D_PKG_VERSIONS.GET_VERSION_BY_LPU(1,pnLPU,'VISITRESULTS');
  120.   nVER_PAYMENT_KIND        := D_PKG_VERSIONS.GET_VERSION_BY_LPU(1,pnLPU,'PAYMENT_KIND');
  121.   nVER_VISITPLACES         := D_PKG_VERSIONS.GET_VERSION_BY_LPU(1,pnLPU,'VISITPLACES');
  122.   nVER_SERVICES            := D_PKG_VERSIONS.GET_VERSION_BY_LPU(1,pnLPU,'SERVICES');
  123.   nVER_MKB                 := D_PKG_VERSIONS.GET_VERSION_BY_LPU(1,pnLPU,'MKB10');
  124.  
  125.  
  126.   --по заданному ЛПУ получим LPUDICT
  127.   BEGIN
  128.     SELECT l.LPUDICT
  129.       INTO nLPUDICT_ID
  130.       FROM D_LPU l
  131.      WHERE l.id = pnLPU
  132.        AND ROWNUM = 1;
  133.   EXCEPTION
  134.     WHEN NO_DATA_FOUND THEN
  135.       nERROR := nERROR + 1;
  136.       lg('ERR_NFD_LPUDICT','Не определно заданное ЛПУ: '||pnLPU);
  137.   END;
  138.  
  139.  
  140.   --Запомним врача, под которым делаемся импорт, чтобы в конце процедуры вернуть назад
  141.   --так как в процессе импорта мы будем менять контекстную переменную
  142.   --надо для того, так как D_PKG_AMB_TALONS.ADD использует контекстную переменную для определения EMPLOYERS
  143.   sCONTEXT_EMPLOYER := D_PKG_EMPLOYERS.GET_ID(pnLPU);
  144.  
  145.  
  146.  
  147.  
  148.  
  149.   --Цикл по всем записям таблицы IMP70_TUBKONVE с импортируемыми данными
  150.   IF nERROR = 0 OR pnERR_IGNORE = 1 THEN
  151.     FOR cr IN (SELECT t.nomer_pp,
  152.                       t.fio,
  153.                       t.birthdate,
  154.                       t.mkb,
  155.                       t.employer,
  156.                       t.visit_date,
  157.                       t.vis_result,
  158.                       t.vis_purpos       vis_purpose,
  159.                       t.paym_kind        payment_kind,
  160.                       t.vis_place,
  161.                       LAG(t.FIO)         over (PARTITION BY NULL ORDER BY t.FIO, t.BIRTHDATE, t.VISIT_DATE) prev_fio,
  162.                       LAG(t.BIRTHDATE)   over (PARTITION BY NULL ORDER BY t.FIO, t.BIRTHDATE, t.VISIT_DATE) prev_birthdate,
  163.                       LAG(t.VIS_RESULT)  over (PARTITION BY NULL ORDER BY t.FIO, t.BIRTHDATE, t.VISIT_DATE) prev_vis_result
  164.  
  165.                  FROM IMP70_ISKUS_AMB_TALONS t
  166.                 ORDER BY t.FIO, t.BIRTHDATE, t.VISIT_DATE, t.VIS_RESULT nulls FIRST
  167.               )
  168.     LOOP
  169.       nNOMER_PP              := cr.NOMER_PP;
  170.  
  171.       nAGENTS_ID             := NULL;
  172.       nPERSMEDCARD_ID        := NULL;
  173.       nDIRECTIONS_ID         := NULL;
  174.       nDIRECTION_SERVICES_ID := NULL;
  175.       nVISITS_ID             := NULL;
  176.       nVIS_DIAGNOSISES_ID    := NULL;
  177.       nAMB_TALON_VISITS_ID   := NULL;
  178.       nAMB_TALON_MKBS_ID     := NULL;
  179.  
  180.       sCARD_NUMB             := NULL;
  181.       nDC_TYPE               := NULL;
  182.       nDC_IS_CLOSE           := NULL;
  183.  
  184.       nVIS_PURPOSE           := NULL;
  185.       nVIS_RESULT            := NULL;
  186.       nPAYMENT_KIND          := NULL;
  187.       nVIS_PLACE             := NULL;
  188.       nSERVICE               := NULL;
  189.       nEMPLOYERS             := NULL;
  190.       nUET_COUNT             := NULL;
  191.       nVISIT_TEMPLATE        := NULL;
  192.       nMKB                   := NULL;
  193.       sDC_CONTENT            := NULL;
  194.  
  195.  
  196.       --блок проверки заполнения всех обязательных полей в таблице импорта
  197.       --если данных нет, то пишем в лог и переходим к следующей строке
  198.       IF cr.FIO IS NULL THEN
  199.         lg('ERR_NULL_COLUMN','Не заполнено поле ФИО в строке '||cr.NOMER_PP);
  200.       END IF;
  201.  
  202.       IF cr.BIRTHDATE IS NULL THEN
  203.         lg('ERR_NULL_COLUMN','Не заполнено поле Дата рождения в строке '||cr.NOMER_PP);
  204.       END IF;
  205.  
  206.       IF cr.MKB IS NULL THEN
  207.         lg('ERR_NULL_COLUMN','Не заполнено поле Код МКБ в строке '||cr.NOMER_PP);
  208.       END IF;
  209.  
  210.       IF cr.EMPLOYER IS NULL THEN
  211.         lg('ERR_NULL_COLUMN','Не заполнено поле Врач в строке '||cr.NOMER_PP);
  212.       END IF;
  213.  
  214.       IF cr.VISIT_DATE IS NULL THEN
  215.         lg('ERR_NULL_COLUMN','Не заполнено поле Дата посещения в строке '||cr.NOMER_PP);
  216.       END IF;
  217.  
  218.       IF cr.VIS_PURPOSE IS NULL THEN
  219.         lg('ERR_NULL_COLUMN','Не заполнено поле Цель посещения в строке '||cr.NOMER_PP);
  220.       END IF;
  221.  
  222.       IF cr.PAYMENT_KIND IS NULL THEN
  223.         lg('ERR_NULL_COLUMN','Не заполнено поле Вид оплаты в строке '||cr.NOMER_PP);
  224.       END IF;
  225.  
  226.       IF cr.FIO IS NULL
  227.          OR cr.BIRTHDATE IS NULL
  228.          OR cr.MKB IS NULL
  229.          OR cr.EMPLOYER IS NULL
  230.          OR cr.VISIT_DATE IS NULL
  231.          OR cr.VIS_PURPOSE IS NULL
  232.          OR cr.PAYMENT_KIND IS NULL THEN
  233.         continue;
  234.       END IF;
  235.       --------------------------------------
  236.  
  237.  
  238.  
  239.       --проверим нет ли в таблице D_AGENTS такого пациента
  240.       GET_AGENT_ID(psFIO        => cr.FIO,
  241.                    pdBIRTHDATE  => cr.BIRTHDATE,
  242.                    psSNILS      => NULL,
  243.                    pnAGENTS_ID  => nAGENTS_ID,
  244.                    psERROR_CODE => sERROR_CODE);
  245.  
  246.       IF nAGENTS_ID IS NULL THEN
  247.         IF sERROR_CODE = 'ERR_TMR_AGENTS' THEN
  248.           lg('ERR_TMR_AGENTS','Найдено несколько пациентов: ФИО - '||cr.FIO||', Дата рожд.- '||TO_CHAR(cr.BIRTHDATE,'dd.mm.yyyy')||' (строка №'||cr.NOMER_PP||')');
  249.         ELSIF sERROR_CODE = 'ERR_NDF_AGENTS' THEN
  250.           lg('ERR_NDF_AGENTS','Не определен пациент: ФИО - '||cr.FIO||', Дата рожд.- '||TO_CHAR(cr.BIRTHDATE,'dd.mm.yyyy')||' (строка №'||cr.NOMER_PP||')');
  251.         END IF;
  252.  
  253.         continue;
  254.       END IF;
  255.      
  256.  
  257.       --Если пациент найден в системе, то производим запись в остальные разделы
  258.       --В соответствии с ТЗ новых пациентов не создаем
  259.       IF nAGENTS_ID IS NOT NULL THEN
  260.         ----------------------------------------
  261.         --2 блок обработки данных в разделе D_PERSMEDCARD
  262.         ----------------------------------------
  263.         BEGIN
  264.           SELECT pmc.ID
  265.             INTO nPERSMEDCARD_ID
  266.             FROM D_PERSMEDCARD pmc
  267.            WHERE pmc.LPU = pnLPU
  268.              AND pmc.AGENT = nAGENTS_ID
  269.              AND ROWNUM = 1;  
  270.         EXCEPTION
  271.           WHEN NO_DATA_FOUND THEN
  272.             sCARD_NUMB := D_PKG_PERSMEDCARD.GET_CARD_NUMB(pnlpu => pnLPU);
  273.            
  274.             --при сортировке цикла по таблице импорта (order by t.FIO, t.BIRTHDATE, t.VISIT_DATE, t.VIS_RESULT nulls first)
  275.             --данный блок должен вызываться только первый раз для пациента и поле cr.VISIT_DATE содержать дату самого раннего визита
  276.             BEGIN
  277.               D_PKG_PERSMEDCARD.ADD(pnD_INSERT_ID  => nPERSMEDCARD_ID,
  278.                                     pnLPU          => pnLPU,
  279.                                     pnCID          => NULL,
  280.                                     pnAGENT        => nAGENTS_ID,
  281.                                     pnBLOODGROUPE  => NULL,
  282.                                     pnRHESUS       => NULL,
  283.                                     psECOLOR       => NULL,
  284.                                     psCARD_NUMB    => sCARD_NUMB,
  285.                                     psNOTE         => NULL,
  286.                                     pnREG_DIVISION => NULL,
  287.                                     pnPMC_TYPE     => NULL,
  288.                                     pnIA_PRINTED   => 0,
  289.                                     pnSMS_AGREE    => 0,
  290.                                     pnEMAIL_AGREE  => 0,
  291.                                     pdCREATEDATE   => cr.VISIT_DATE);
  292.             EXCEPTION
  293.               WHEN OTHERS THEN
  294.                 nPERSMEDCARD_ID := NULL;
  295.                 lg(pnLOG_IDENT,'ERR_ADD_PERSMEDCARD','Ошибка добавления карты пациента: '||cr.FIO, SQLERRM);
  296.             END;
  297.         END;
  298.  
  299.  
  300.         IF nPERSMEDCARD_ID IS NULL THEN
  301.           lg('ERR_NDF_PERSMEDCARD','Не определена мед карта пациента: ФИО - '||cr.FIO||' (строка №'||cr.NOMER_PP||')');
  302.           continue;
  303.         END IF;
  304.  
  305.  
  306.  
  307.         SAVEPOINT IMP70_P_ISKUS_PERSMEDCARD;
  308.  
  309.  
  310.         ----------------------------------------
  311.         --блок обработки данных для последующих вставок в таблицы
  312.         ----------------------------------------
  313.        
  314.         --определение цели визита
  315.         SELECT (SELECT vp.ID
  316.                   FROM D_VISITPURPOSES vp
  317.                  WHERE vp.VERSION = nVER_VISITPURPOSES
  318.                    AND LOWER(vp.VP_CODE) = (SELECT LOWER(visat.MIS_CODE)
  319.                                               FROM IMP70_V_ISKUS_AMB_TALON visat
  320.                                              WHERE visat.SPR_CONFORM = 'VISITPURPOSES'
  321.                                                AND (visat.LPU IS NULL OR visat.LPU = pnLPU)
  322.                                                AND (LOWER(TRIM(both ' ' FROM visat.FILE_CODE)) = LOWER(TRIM(both ' ' FROM cr.VIS_PURPOSE))
  323.                                                     OR
  324.                                                     (visat.FILE_CODE IS NULL AND cr.VIS_PURPOSE IS NULL)
  325.                                                    )
  326.                                                AND ROWNUM = 1)
  327.                    AND COALESCE(cr.VISIT_DATE,TRUNC(SYSDATE)) BETWEEN vp.DATE_BEGIN AND COALESCE(vp.DATE_END,cr.VISIT_DATE,TRUNC(SYSDATE))
  328.                    AND ROWNUM = 1)
  329.           INTO nVIS_PURPOSE
  330.           FROM dual;
  331.  
  332.         IF nVIS_PURPOSE IS NULL THEN
  333.           lg('ERR_NDF_VIS_PURPOSE','Не определена цель визита для пациента: '||cr.FIO||' (строка №'||cr.NOMER_PP||')');
  334.           continue;
  335.         END IF;
  336.  
  337.  
  338.         --определение результата визита
  339.         IF cr.VIS_RESULT IS NOT NULL THEN
  340.           SELECT (SELECT vr.ID
  341.                     FROM D_VISITRESULTS vr
  342.                    WHERE vr.VERSION = nVER_VISITRESULTS
  343.                      AND LOWER(vr.VR_CODE) = (SELECT LOWER(visat.MIS_CODE)
  344.                                                 FROM IMP70_V_ISKUS_AMB_TALON visat
  345.                                                WHERE visat.SPR_CONFORM = 'VISITRESULTS'
  346.                                                  AND (visat.LPU IS NULL OR visat.LPU = pnLPU)
  347.                                                  AND (LOWER(TRIM(both ' ' FROM visat.FILE_CODE)) = LOWER(TRIM(both ' ' FROM cr.VIS_RESULT))
  348.                                                       OR
  349.                                                       (visat.FILE_CODE IS NULL AND cr.VIS_RESULT IS NULL)
  350.                                                      )
  351.                                                  AND ROWNUM = 1)
  352.                      AND COALESCE(cr.VISIT_DATE,TRUNC(SYSDATE)) BETWEEN vr.DATE_BEGIN AND COALESCE(vr.DATE_END,cr.VISIT_DATE,TRUNC(SYSDATE))
  353.                      AND ROWNUM = 1)
  354.             INTO nVIS_RESULT
  355.             FROM dual;
  356.  
  357.           IF nVIS_PURPOSE IS NULL THEN
  358.             lg('ERR_NDF_VIS_RESULT','Не определен результат обращения для пациента: '||cr.FIO||' (строка №'||cr.NOMER_PP||')');
  359.             continue;
  360.           END IF;
  361.         END IF;
  362.  
  363.  
  364.         --определение вида оплаты
  365.         SELECT (SELECT pk.ID
  366.                   FROM D_PAYMENT_KIND pk
  367.                  WHERE pk.VERSION = nVER_PAYMENT_KIND
  368.                    AND LOWER(pk.PK_CODE) = (SELECT LOWER(visat.MIS_CODE)
  369.                                               FROM IMP70_V_ISKUS_AMB_TALON visat
  370.                                              WHERE visat.SPR_CONFORM = 'PAYMENT_KIND'
  371.                                                AND (visat.LPU IS NULL OR visat.LPU = pnLPU)
  372.                                                AND (LOWER(TRIM(both ' ' FROM visat.FILE_CODE)) = LOWER(TRIM(both ' ' FROM cr.PAYMENT_KIND))
  373.                                                     OR
  374.                                                     (visat.FILE_CODE IS NULL AND cr.PAYMENT_KIND IS NULL)
  375.                                                    )
  376.                                                AND ROWNUM = 1)
  377.                    AND ROWNUM = 1)
  378.           INTO nPAYMENT_KIND
  379.           FROM dual;
  380.  
  381.         IF nPAYMENT_KIND IS NULL THEN
  382.           lg('ERR_NDF_PAYMENT_KIND','Не определен вид платежа для пациента: '||cr.FIO||' (строка №'||cr.NOMER_PP||')');
  383.           continue;
  384.         END IF;
  385.  
  386.  
  387.         --определение места обслуживания
  388.         IF cr.VIS_PLACE IS NOT NULL THEN
  389.           SELECT (SELECT vp.ID
  390.                     FROM D_VISITPLACES vp
  391.                    WHERE vp.VERSION = nVER_VISITPLACES
  392.                      AND LOWER(vp.VP_CODE) = (SELECT LOWER(visat.MIS_CODE)
  393.                                                 FROM IMP70_V_ISKUS_AMB_TALON visat
  394.                                                WHERE visat.SPR_CONFORM = 'VISITPLACES'
  395.                                                  AND (visat.LPU IS NULL OR visat.LPU = pnLPU)
  396.                                                  AND (LOWER(TRIM(both ' ' FROM visat.FILE_CODE)) = LOWER(TRIM(both ' ' FROM cr.VIS_PLACE))
  397.                                                       OR
  398.                                                       (visat.FILE_CODE IS NULL AND cr.VIS_PLACE IS NULL)
  399.                                                      )
  400.                                                  AND ROWNUM = 1)
  401.                      AND ROWNUM = 1)
  402.             INTO nVIS_PLACE
  403.             FROM dual;
  404.  
  405.           IF nVIS_PLACE IS NULL THEN
  406.             lg('ERR_NDF_VIS_PLACE','Не определено место обслуживания для пациента: '||cr.FIO||' (строка №'||cr.NOMER_PP||')');
  407.             continue;
  408.           END IF;
  409.         END IF;
  410.  
  411.         --определение признака закрытия случая
  412.         SELECT COALESCE((SELECT visat.MIS_CODE
  413.                            FROM IMP70_V_ISKUS_AMB_TALON visat
  414.                           WHERE visat.SPR_CONFORM = 'VIS_RESULTS_DC_IS_CLOSE'
  415.                             AND (visat.LPU IS NULL OR visat.LPU = pnLPU)
  416.                             AND LOWER(TRIM(both ' ' FROM visat.FILE_CODE)) = LOWER(TRIM(both ' ' FROM cr.VIS_RESULT))
  417.                             AND cr.VIS_RESULT IS NOT NULL
  418.                             AND ROWNUM = 1), '0')
  419.           INTO nDC_IS_CLOSE
  420.           FROM dual;
  421.  
  422.  
  423.         --определение оказываемой услуги
  424.         SELECT (SELECT s.ID
  425.                   FROM D_SERVICES s
  426.                  WHERE s.VERSION = nVER_SERVICES
  427.                    AND LOWER(s.SE_CODE) = (SELECT LOWER(visat.MIS_CODE)
  428.                                              FROM IMP70_V_ISKUS_AMB_TALON visat
  429.                                             WHERE visat.SPR_CONFORM = 'SERVICES'
  430.                                               AND (visat.LPU IS NULL OR visat.LPU = pnLPU)
  431.                                               AND (LOWER(TRIM(both ' ' FROM visat.FILE_CODE)) = LOWER(TRIM(both ' ' FROM cr.VIS_PURPOSE))
  432.                                                    OR
  433.                                                    (visat.FILE_CODE IS NULL AND cr.VIS_PURPOSE IS NULL)
  434.                                                   )
  435.                                               AND ROWNUM = 1)
  436.                    AND ROWNUM = 1)
  437.           INTO nSERVICE
  438.           FROM dual;
  439.  
  440.         IF nSERVICE IS NULL THEN
  441.           lg('ERR_NDF_SERVICES','Не определена оказываемая услуга для пациента: '||cr.FIO||' (строка №'||cr.NOMER_PP||')');
  442.           continue;
  443.         END IF;
  444.  
  445.  
  446.         --определение кода МКБ
  447.         SELECT (SELECT m.ID
  448.                   FROM D_MKB10 m
  449.                  WHERE m.VERSION = nVER_MKB
  450.                    AND UPPER(m.MKB_CODE) = UPPER(cr.MKB)
  451.                    AND ROWNUM = 1)
  452.           INTO nMKB
  453.           FROM dual;
  454.  
  455.         IF nMKB IS NULL THEN
  456.           lg('ERR_NDF_MKB10','Не определен код МКБ для пациента: '||cr.FIO||' (строка №'||cr.NOMER_PP||')');
  457.           continue;
  458.         END IF;
  459.  
  460.  
  461.         --определение шаблона приема
  462.         SELECT (SELECT vt.ID
  463.                   FROM D_VISIT_TEMPLATES vt
  464.                  WHERE vt.LPU = pnLPU
  465.                    AND LOWER(vt.VT_CODE) = LOWER(sVIS_TEMPL_CODE_FTIZ)
  466.                    AND ROWNUM = 1)
  467.           INTO nVISIT_TEMPLATE
  468.           FROM dual;
  469.        
  470.         IF nVISIT_TEMPLATE IS NULL THEN
  471.           lg('ERR_NDF_VISIT_TEMPLATE','Не определен шаблон приема для пациента: '||cr.FIO||' (строка №'||cr.NOMER_PP||')');
  472.           continue;
  473.         END IF;
  474.  
  475.  
  476.         --определение врача
  477.         BEGIN
  478.           SELECT e.ID
  479.             INTO nEMPLOYERS
  480.             FROM D_EMPLOYERS e
  481.                  join D_AGENTS a ON a.ID = e.AGENT
  482.            WHERE e.LPU = pnLPU
  483.              AND (LOWER(a.SURNAME) = LOWER(cr.EMPLOYER)
  484.                   OR
  485.                   LOWER(a.SURNAME) = TRIM(LOWER(SUBSTR(cr.EMPLOYER, INSTR(cr.EMPLOYER,'.')+1))) --на случай, если указано, например "фтиз. Маслянко"
  486.                   );
  487.         EXCEPTION
  488.           WHEN OTHERS THEN
  489.             SELECT (SELECT LOWER(visat.MIS_CODE)
  490.                       FROM IMP70_V_ISKUS_AMB_TALON visat
  491.                      WHERE visat.SPR_CONFORM = 'EMPLOYERS'
  492.                        AND (visat.LPU IS NULL OR visat.LPU = pnLPU)
  493.                        AND LOWER(TRIM(both ' ' FROM visat.FILE_CODE)) = LOWER(TRIM(both ' ' FROM SUBSTR(cr.EMPLOYER, INSTR(cr.EMPLOYER,'.')+1))) --на случай, если указано, например "фтиз. Маслянко"
  494.                        AND ROWNUM = 1)
  495.               INTO nEMPLOYERS
  496.               FROM dual;
  497.         END;
  498.        
  499.         IF nEMPLOYERS IS NULL THEN
  500.           lg('ERR_NDF_EMPLOYERS','Не определен врач оказываемой услуги для пациента: '||cr.FIO||' (строка №'||cr.NOMER_PP||')');
  501.           continue;
  502.         ELSE
  503.           set_context_employer(nEMPLOYERS);
  504.         END IF;
  505.  
  506.  
  507.        
  508.         ----------------------------------------
  509.         --5 блок обработки данных в разделе D_DISEASECASES
  510.         ----------------------------------------
  511.  
  512.         --Создаем случай только при смене пациента
  513.         IF (cr.fio <> cr.prev_fio OR cr.birthdate <> cr.prev_birthdate)
  514.            OR
  515.            (cr.prev_fio IS NULL AND cr.prev_birthdate IS NULL)
  516.            OR
  517.            nDISEASECASES_ID IS NULL THEN
  518.          
  519.           --проверим, может быть уже есть открытыя случай, созданный на прежних этапах импорта
  520.           BEGIN
  521.             SELECT dc.ID
  522.               INTO nDISEASECASES_ID
  523.               FROM D_DISEASECASES dc
  524.              WHERE dc.LPU = pnLPU
  525.                AND cr.VISIT_DATE BETWEEN dc.DC_OPENDATE AND COALESCE(dc.DC_CLOSEDATE,cr.VISIT_DATE)
  526.                AND dc.PATIENT   = nPERSMEDCARD_ID
  527.                AND dc.DC_TYPE   = nDISEAS_TYPES_POLIK
  528.                AND dc.DC_SOURCE = 0
  529.                AND dc.DC_OPENDATE = (SELECT MAX(dc2.DC_OPENDATE)
  530.                                        FROM D_DISEASECASES dc2
  531.                                       WHERE dc2.LPU = pnLPU
  532.                                         AND cr.VISIT_DATE BETWEEN dc2.DC_OPENDATE AND COALESCE(dc2.DC_CLOSEDATE,cr.VISIT_DATE)
  533.                                         AND dc2.PATIENT   = nPERSMEDCARD_ID
  534.                                         AND dc2.DC_TYPE   = nDISEAS_TYPES_POLIK
  535.                                         AND dc2.DC_SOURCE = 0)
  536.                AND ROWNUM = 1;
  537.           EXCEPTION
  538.             WHEN NO_DATA_FOUND THEN
  539.               --сгенерируем содержание для случая
  540.               SELECT (SELECT TO_CHAR(cr.VISIT_DATE,'dd.mm.yyyy')||' '||m.MKB_CODE||' '||m.MKB_NAME
  541.                         FROM D_MKB10 m
  542.                        WHERE m.ID = nMKB
  543.                          AND ROWNUM = 1)
  544.                 INTO sDC_CONTENT
  545.                 FROM dual;
  546.            
  547.               BEGIN
  548.                 D_PKG_DISEASECASES.ADD(pnD_INSERT_ID => nDISEASECASES_ID,
  549.                                        pnLPU         => pnLPU,
  550.                                        pnPATIENT     => nPERSMEDCARD_ID,
  551.                                        psDC_CONTENT  => sDC_CONTENT,
  552.                                        pdDC_OPENDATE => cr.VISIT_DATE,  --при сортировке цикла по таблице импорта (order by t.FIO, t.BIRTHDATE, t.VISIT_DATE, t.VIS_RESULT nulls first) это дата первого посещения
  553.                                        pnDC_TYPE     => nDISEAS_TYPES_POLIK,
  554.                                        pnDC_SOURCE   => 0);
  555.               EXCEPTION
  556.                 WHEN OTHERS THEN
  557.                   nDISEASECASES_ID := NULL;
  558.                   lg('ERR_ADD_DISEASECASES','Ошибка создания случая заболевания для пациента: '||cr.FIO||' (строка №'||cr.NOMER_PP||')', SQLERRM);
  559.                   ROLLBACK TO IMP70_P_ISKUS_PERSMEDCARD;
  560.                   continue;
  561.               END;
  562.           END;
  563.         END IF;
  564.  
  565.  
  566.         SAVEPOINT IMP70_P_ISKUS_DISEASECASES;  --точка сохранения для отката до случая
  567.  
  568.  
  569.         ----------------------------------------
  570.         --8 блок обработки данных в разделе D_AMB_TALONS
  571.         ----------------------------------------
  572.  
  573.         --Создаем амбулаторный талон только при смене пациента или если в рамках одно и того же пациента
  574.         --у предыдущей записи в таблице импорта был проставлен результат обращения
  575.         IF (cr.fio <> cr.prev_fio OR cr.birthdate <> cr.prev_birthdate)
  576.            OR
  577.            (cr.prev_fio IS NULL AND cr.prev_birthdate IS NULL)
  578.            OR
  579.            nAMB_TALONS_ID IS NULL
  580.            OR
  581.            (cr.fio = cr.prev_fio
  582.             AND cr.birthdate = cr.prev_birthdate
  583.             AND (cr.prev_vis_result IS NOT NULL OR nAMB_TALONS_ID IS NULL)
  584.            ) THEN
  585.  
  586.           --получим данные для вставки в таблицу
  587.           SELECT (SELECT visat.MIS_CODE
  588.                     FROM IMP70_V_ISKUS_AMB_TALON visat
  589.                    WHERE visat.SPR_CONFORM = 'AT_DC_TYPE'
  590.                      AND (visat.LPU IS NULL OR visat.LPU = pnLPU)
  591.                      AND (LOWER(TRIM(both ' ' FROM visat.FILE_CODE)) = LOWER(TRIM(both ' ' FROM cr.VIS_PURPOSE))
  592.                           OR
  593.                           (visat.FILE_CODE IS NULL AND cr.VIS_PURPOSE IS NULL)
  594.                          )
  595.                      AND ROWNUM = 1
  596.                  )
  597.             INTO nDC_TYPE
  598.             FROM dual;
  599.  
  600.           IF nDC_TYPE IS NULL THEN
  601.             nAMB_TALONS_ID := NULL;
  602.             lg('ERR_NDF_AT_DC_TYPE','Не определен тип случая для пациента: '||cr.FIO||' (строка №'||cr.NOMER_PP||')');
  603.             ROLLBACK TO IMP70_P_ISKUS_DISEASECASES;
  604.             continue;
  605.           END IF;
  606.          
  607.           --проверим нет ли открытого талона от прежнего импорта
  608.           BEGIN
  609.             SELECT AT.ID
  610.               INTO nAMB_TALONS_ID
  611.               FROM D_AMB_TALONS AT
  612.              WHERE AT.LPU = pnLPU
  613.                AND AT.PERSMEDCARD = nPERSMEDCARD_ID
  614.                AND AT.AT_TYPE = 2
  615.                AND AT.DISEASECASE = nDISEASECASES_ID
  616.                AND COALESCE(AT.END_DATE,cr.VISIT_DATE) >= cr.VISIT_DATE
  617.                AND ROWNUM = 1;
  618.           EXCEPTION
  619.             WHEN NO_DATA_FOUND THEN
  620.               BEGIN
  621.                 D_PKG_AMB_TALONS.ADD(pnD_INSERT_ID       => nAMB_TALONS_ID,
  622.                                      pnLPU               => pnLPU,
  623.                                      pnCID               => NULL,
  624.                                      pnPERSMEDCARD       => nPERSMEDCARD_ID,
  625.                                      pnAT_TYPE           => 2,
  626.                                      pnFIRST_REF_PURPOSE => nVIS_PURPOSE,
  627.                                      pnREF_KIND          => NULL,
  628.                                      pdDIRECT_DATE       => NULL,
  629.                                      psDIRECT_NUMB       => NULL,
  630.                                      pnDIRECT_LPU        => NULL,
  631.                                      pnDISEASECASE       => nDISEASECASES_ID,
  632.                                      pnHOSP_MKB          => NULL,
  633.                                      pnHOSP_KIND         => NULL,
  634.                                      pnREF_RESULT        => nVIS_RESULT,
  635.                                      pnD_GROUP           => NULL,
  636.                                      pdEND_DATE          => NULL, -- закроем в конце итерации цикла
  637.                                      pnAT_DC_TYPE        => nDC_TYPE,
  638.                                      pdDEATHDATE         => NULL,
  639.                                      pnDEATHDOCTYPE      => NULL,
  640.                                      pdDEATHDOCDATE      => NULL,
  641.                                      psDEATHDOCNUM       => NULL,
  642.                                      psDEATHCERTIFY_EMP  => NULL,
  643.                                      pnFD_PRVD_CONDIT    => nFD_PRVD_CONDITS_POLIK,
  644.                                      pnKSG               => NULL,
  645.                                      pnDC_IS_CLOSE       => 0,    --закроем в конце итерации цикла
  646.                                      pnIS_AUTO           => 1,
  647.                                      pnPC_TYPE           => NULL,
  648.                                      pnPC_STEP           => NULL,
  649.                                      pnHID               => NULL,
  650.                                      pnDC_DIAGNOSIS      => NULL,
  651.                                      pnDIRECT_SPECIALITY => NULL,
  652.                                      pnPC_RESULT         => NULL,
  653.                                      pnPC_CLOSE_REASON   => NULL,
  654.                                      pnSTATE_MEK         => NULL,
  655.                                      pnMOBILE_BRIG       => NULL,
  656.                                      pnOUTER_DIRECTION   => NULL,
  657.                                      pnDC_TYPE           => nDC_TYPE--,
  658.                                      --pdDATE_REPORT       => null
  659.                                      );
  660.               EXCEPTION
  661.                 WHEN OTHERS THEN
  662.                   nAMB_TALONS_ID := NULL;
  663.                   lg('ERR_ADD_AMB_TALONS','Ошибка создания амбулаторного талона для пациента: '||cr.FIO||' (строка №'||cr.NOMER_PP||')', SQLERRM);
  664.                   ROLLBACK TO IMP70_P_ISKUS_DISEASECASES;
  665.                   continue;
  666.               END;
  667.           END;
  668.         END IF;          
  669.          
  670.  
  671.         SAVEPOINT IMP70_P_ISKUS_AMB_TALONS;  --точка сохранения для отката до амб. талона
  672.  
  673.        
  674.        
  675.         ----------------------------------------
  676.         --3 блок обработки данных в разделе D_DIRECTIONS
  677.         ----------------------------------------
  678.         --проверим не была ли создана запись на прежних итерациях импорта
  679.         BEGIN
  680.           SELECT d.ID
  681.             INTO nDIRECTIONS_ID
  682.             FROM D_DIRECTIONS d
  683.            WHERE d.LPU = pnLPU
  684.              AND d.PATIENT = nPERSMEDCARD_ID
  685.              AND d.REG_DATE = cr.VISIT_DATE
  686.              AND d.REG_TYPE = 0
  687.              AND d.DIR_TYPE = 0
  688.              AND ROWNUM = 1;
  689.          
  690.           lg('WAR_DIRECTIONS','Напрвление с такой датой для пациента уже существует: '||cr.FIO||' (строка №'||cr.NOMER_PP||')');
  691.         EXCEPTION
  692.           WHEN NO_DATA_FOUND THEN
  693.             BEGIN
  694.               D_PKG_DIRECTIONS.ADD(pnD_INSERT_ID            => nDIRECTIONS_ID,
  695.                                    pnLPU                    => pnLPU,
  696.                                    pnOUTER_DIRECTION        => NULL,
  697.                                    pnLPU_TO                 => NULL,
  698.                                    psLPU_TO_HANDLE          => NULL,
  699.                                    pnPATIENT                => nPERSMEDCARD_ID,
  700.                                    pnREG_VISIT              => NULL,
  701.                                    psDIR_COMMENT            => NULL,
  702.                                    pnREG_TYPE               => 0,
  703.                                    pnDIR_TYPE               => 0,
  704.                                    pnHOSP_MKB               => NULL,
  705.                                    pnHOSP_KIND              => NULL,
  706.                                    psDIR_NUMB               => NULL,
  707.                                    pnSPECIALITY             => NULL,
  708.                                    pnEX_CAUSE_MKB           => NULL,
  709.                                    pnINJURE_KIND            => NULL,
  710.                                    pnINJURE_TIME            => NULL,
  711.                                    pnDIRECTION_KIND         => NULL,
  712.                                    pnHOSP_DEP               => NULL,
  713.                                    psDIR_PREF               => NULL,
  714.                                    pnHOSP_BED_TYPE          => NULL,
  715.                                    pnMES                    => NULL,
  716.                                    pnREG_HPKPJ              => NULL,
  717.                                    pnHOSP_REASON            => NULL,
  718.                                    pnREG_DIR_SERV           => NULL,
  719.                                    pdREG_DATE               => cr.VISIT_DATE,
  720.                                    pdHOSP_PLAN_DATE         => NULL,
  721.                                    pdDATE_TR                => NULL,
  722.                                    pnHOSP_DEPDICT           => NULL,
  723.                                    psDOC_COMMENT            => NULL,
  724.                                    pnHOSP_PALAN_KIND        => NULL,
  725.                                    pnHOSP_TYPE              => NULL,
  726.                                    pdTALON_VMP_DATE         => NULL,
  727.                                    pnHOSP_DIRECT_TYPE       => NULL,
  728.                                    pnHOSP_REASON_STREETKIDS => NULL,
  729.                                    pnTRANSPORTATION_KIND    => NULL,
  730.                                    pnHOSP_HOUR              => NULL,
  731.                                    pnREG_DEP                => NULL,
  732.                                    psHOSP_MKB_EXACT         => NULL,
  733.                                    pnREG_EMPLOYER           => NULL,
  734.                                    psTALON_VMP_NUM          => NULL--,
  735.                                    --pnIS_ONKO                => null
  736.                                    );
  737.             EXCEPTION
  738.               WHEN OTHERS THEN
  739.                 nDIRECTIONS_ID := NULL;
  740.                 lg('ERR_ADD_DIRECTIONS','Ошибка создания направления для пациента: '||cr.FIO||' (строка №'||cr.NOMER_PP||')', SQLERRM);
  741.                 ROLLBACK TO IMP70_P_ISKUS_AMB_TALONS;
  742.                 continue;
  743.             END;
  744.         END;
  745.  
  746.  
  747.         ----------------------------------------
  748.         --4 блок обработки данных в разделе D_DIRECTION_SERVICES
  749.         ----------------------------------------
  750.         --проверим не была ли создана запись на прежних итерациях импорта
  751.         BEGIN
  752.           SELECT ds.ID
  753.             INTO nDIRECTION_SERVICES_ID
  754.             FROM D_DIRECTION_SERVICES ds
  755.            WHERE ds.LPU = pnLPU
  756.              AND ds.PID = nDIRECTIONS_ID
  757.              AND ds.SERVICE = nSERVICE
  758.              AND ds.EMPLOYER_TO = nEMPLOYERS
  759.              AND ds.REC_DATE = cr.VISIT_DATE
  760.              AND ds.VISIT_PURPOSE = nVIS_PURPOSE
  761.              AND ds.DISEASECASE = nDISEASECASES_ID
  762.              AND ds.REG_TYPE = 0
  763.              AND ds.REC_TYPE = 0
  764.              AND ROWNUM = 1;
  765.          
  766.           lg('WAR_DIRECTION_SERVICES','Напрвление на данную услугу с такой датой для пациента уже существует: '||cr.FIO||' (строка №'||cr.NOMER_PP||')');
  767.         EXCEPTION
  768.           WHEN NO_DATA_FOUND THEN
  769.             BEGIN
  770.               -- не используем стандартную процедуру, так как грузим старые данные, которые не проходят проверки
  771.               --D_PKG_DIRECTION_SERVICES.ADD(pnD_INSERT_ID          => nDIRECTION_SERVICES_ID,
  772.               IMP70_P_ADD_DIRECTION_SERVICES(pnD_INSERT_ID          => nDIRECTION_SERVICES_ID,
  773.                                              pnLPU                  => pnLPU,
  774.                                              pnPID                  => nDIRECTIONS_ID,
  775.                                              pnHID                  => NULL,
  776.                                              pnIS_COMBINED_PAYMENT  => 0,
  777.                                              pnIS_NECESSARY         => 0,
  778.                                              pnSERVICE              => nSERVICE,
  779.                                              pnEMPLOYER_TO          => nEMPLOYERS,
  780.                                              pnCABLAB_TO            => NULL,
  781.                                              pdREC_DATE             => cr.VISIT_DATE,
  782.                                              pnVISIT_PURPOSE        => nVIS_PURPOSE,
  783.                                              pnREF_KIND             => NULL,
  784.                                              pnVISIT_KIND           => NULL,
  785.                                              pnDISEASECASE          => nDISEASECASES_ID,
  786.                                              pnREG_TYPE             => 0,
  787.                                              pnSERV_STATUS          => 0,
  788.                                              pnIS_PRIMARY           => 0,
  789.                                              psS_COMMNET            => NULL,
  790.                                              pnHH_DEP               => NULL,
  791.                                              pnADD_TYPE             => NULL,
  792.                                              pnREC_TYPE             => 0,
  793.                                              pnHAS_DIAGN            => NULL,
  794.                                              pnSER_COUNT            => 1,
  795.                                              pnMP_DESCRIBE          => NULL,
  796.                                              pnRPID                 => NULL,
  797.                                              pnIRID                 => NULL,
  798.                                              pnRESERVATION          => NULL,
  799.                                              pnDC_DIAGNOSIS         => NULL,
  800.                                              pnLPU_SERVICE          => NULL,
  801.                                              pnREC_DURATION         => NULL,
  802.                                              pnTICKET_N             => NULL,
  803.                                              psTICKET_S             => NULL,
  804.                                              pnEX_SYSTEM            => NULL,
  805.                                              pnPURCHASE_ORDER       => NULL,
  806.                                              pnIS_CONFIRMED         => 0,
  807.                                              pnNURSE_USER_TEMPLATES => NULL,
  808.                                              pdCONFIRM_DATE         => cr.VISIT_DATE);
  809.  
  810.               --так как процедура ADD не дает создать направление на услугу со статусов Оказана, простовим статус дополнительно
  811.               D_PKG_DIRECTION_SERVICES.SET_STATUS(pnID                 => nDIRECTION_SERVICES_ID,
  812.                                                   pnLPU                => pnLPU,
  813.                                                   pnSERV_STATUS        => 1,
  814.                                                   psSERV_STATUS_REASON => NULL);
  815.             EXCEPTION
  816.               WHEN OTHERS THEN
  817.                 nDIRECTION_SERVICES_ID := NULL;
  818.                 lg('ERR_ADD_DIRECTION_SERVICES','Ошибка создания направления на услугу для пациента: '||cr.FIO||' (строка №'||cr.NOMER_PP||')', SQLERRM);
  819.                 ROLLBACK TO IMP70_P_ISKUS_AMB_TALONS;
  820.                 continue;
  821.             END;
  822.         END;
  823.  
  824.  
  825.  
  826.         ----------------------------------------
  827.         --6 блок обработки данных в разделе D_VISITS
  828.         ----------------------------------------
  829.        
  830.         --получим данные для вставку в таблицу
  831.         WITH AT AS (SELECT AT_DATE
  832.                       FROM D_AMB_TALONS
  833.                      WHERE ID = nAMB_TALONS_ID)
  834.         SELECT (SELECT (CASE WHEN D_PKG_DAT_TOOLS.FULL_YEARS((SELECT AT_DATE FROM AT), cr.BIRTHDATE) < 18  THEN s.UET_DOCTOR_DET
  835.                              ELSE s.UET_DOCTOR
  836.                         END)
  837.                   FROM D_SERVICES s
  838.                  WHERE s.ID = nSERVICE)
  839.        
  840.           INTO nUET_COUNT
  841.           FROM dual;
  842.        
  843.        
  844.        
  845.         --проверим не была ли создана запись на прежних итерациях импорта
  846.         BEGIN
  847.           SELECT v.ID
  848.             INTO nVISITS_ID
  849.             FROM D_VISITS v
  850.            WHERE v.PID = nDIRECTION_SERVICES_ID
  851.              AND ROWNUM = 1;
  852.          
  853.           lg('WAR_VISITS','Посещение с такой датой для пациента уже существует: '||cr.FIO||' (строка №'||cr.NOMER_PP||')');
  854.         EXCEPTION
  855.           WHEN NO_DATA_FOUND THEN
  856.             BEGIN
  857.               -- не используем стандартную процедуру, так как грузим старые данные, которые не проходят проверки
  858.               --D_PKG_VISITS.ADD(pnD_INSERT_ID       => nVISITS_ID,
  859.               IMP70_P_ADD_VISITS(pnD_INSERT_ID       => nVISITS_ID,
  860.                                  pnLPU               => pnLPU,
  861.                                  pnPID               => nDIRECTION_SERVICES_ID,
  862.                                  pnEMPLOYER          => nEMPLOYERS,
  863.                                  pdVISIT_DATE        => cr.VISIT_DATE,
  864.                                  pnVISIT_PLACE       => nVIS_PLACE,
  865.                                  pnDGROUP            => NULL,
  866.                                  pnVISIT_RESULT      => nVIS_RESULT,
  867.                                  pnNURSE             => NULL,
  868.                                  pnHELPER            => NULL,
  869.                                  pnANESTHETIZATION   => NULL,
  870.                                  pnPROF_DISEASE      => NULL,
  871.                                  pnSER_COUNT         => 1,
  872.                                  pnSER_KOEFF         => 1,
  873.                                  pnUET_COUNT         => nUET_COUNT,
  874.                                  pnMINUTES           => NULL,
  875.                                  pnCABLAB            => NULL,
  876.                                  pnREF_RESULT        => NULL,
  877.                                  pnVISIT_TEMPLATE    => nVISIT_TEMPLATE,
  878.                                  pnCLOSE_DISEASECASE => NULL,
  879.                                  pnMED_CARE_KIND     => NULL,
  880.                                  pnAPP_KIND          => NULL,
  881.                                  pnANEST_KIND        => NULL,
  882.                                  pnANEST_INDICATIONS => NULL,
  883.                                  pnIS_EMERGENCY      => NULL);
  884.             EXCEPTION
  885.               WHEN OTHERS THEN
  886.                 nVISITS_ID := NULL;
  887.                 lg('ERR_ADD_VISITS','Ошибка создания посещения для пациента: '||cr.FIO||' (строка №'||cr.NOMER_PP||')', SQLERRM);
  888.                 ROLLBACK TO IMP70_P_ISKUS_AMB_TALONS;
  889.                 continue;
  890.             END;
  891.         END;
  892.  
  893.         ----------------------------------------
  894.         --7 блок обработки данных в разделе D_VIS_DIAGNOSISES
  895.         ----------------------------------------
  896.         --проверим не была ли создана запись на прежних итерациях импорта
  897.         BEGIN
  898.           SELECT vd.ID
  899.             INTO nVIS_DIAGNOSISES_ID
  900.             FROM D_VIS_DIAGNOSISES vd
  901.            WHERE vd.LPU = pnLPU
  902.              AND vd.PID = nVISITS_ID
  903.              AND vd.MKB = nMKB
  904.              AND vd.IS_MAIN = 1
  905.              AND ROWNUM = 1;
  906.          
  907.           lg('WAR_VIS_DIAGNOSISES','Такой диагноз данного посещения для пациента уже существует: '||cr.FIO||' (строка №'||cr.NOMER_PP||')');
  908.         EXCEPTION
  909.           WHEN NO_DATA_FOUND THEN
  910.             BEGIN
  911.               D_PKG_VIS_DIAGNOSISES.ADD(pnD_INSERT_ID        => nVIS_DIAGNOSISES_ID,
  912.                                         pnLPU                => pnLPU,
  913.                                         pnPID                => nVISITS_ID,
  914.                                         pnMKB                => nMKB,
  915.                                         pnDISEASECHARACTER   => NULL,
  916.                                         pnIS_MAIN            => 1,
  917.                                         psORGANIZATION       => NULL,
  918.                                         pnINJURE_KIND        => NULL,
  919.                                         pnEX_CAUSE_MKB       => NULL,
  920.                                         psNOTE               => NULL,
  921.                                         pnINJURETIME         => NULL,
  922.                                         pnORGANIZATION_AGENT => NULL,
  923.                                         pnDISEASE_STAGE      => NULL,
  924.                                         pnIS_ACTIVE          => NULL,
  925.                                         pnCL_OBSERV_CATEGORY => NULL,
  926.                                         pnDGROUP             => NULL,
  927.                                         pnSTAGE              => 1,
  928.                                         pdDATE_TR            => NULL,
  929.                                         pnIS_CONTROL_CARD    => 0,
  930.                                         pnCONTROL_CARD       => NULL,
  931.                                         pnLOCALIZATION       => NULL,
  932.                                         pnRISAR_STAGE        => NULL);
  933.             EXCEPTION
  934.               WHEN OTHERS THEN
  935.                 nVIS_DIAGNOSISES_ID := NULL;
  936.                 lg('ERR_ADD_VISITS','Ошибка создания посещения для пациента: '||cr.FIO||' (строка №'||cr.NOMER_PP||')', SQLERRM);
  937.                 ROLLBACK TO IMP70_P_ISKUS_AMB_TALONS;
  938.                 continue;
  939.             END;
  940.         END;
  941.  
  942.         ----------------------------------------
  943.         --9 блок обработки данных в разделе D_AMB_TALON_VISITS
  944.         ----------------------------------------
  945.         --проверим не была ли создана запись на прежних итерациях импорта
  946.         BEGIN
  947.           SELECT atv.ID
  948.             INTO nAMB_TALON_VISITS_ID
  949.             FROM D_AMB_TALON_VISITS atv
  950.            WHERE atv.VISIT = nVISITS_ID
  951.              AND ROWNUM = 1;
  952.          
  953.           lg('WAR_AMB_TALON_VISITS','Такое посещение по АТ для пациента уже существует: '||cr.FIO||' (строка №'||cr.NOMER_PP||')');
  954.         EXCEPTION
  955.           WHEN NO_DATA_FOUND THEN
  956.             BEGIN
  957.               D_PKG_AMB_TALON_VISITS.ADD(pnD_INSERT_ID      => nAMB_TALON_VISITS_ID,
  958.                                          pnLPU              => pnLPU,
  959.                                          pnPID              => nAMB_TALONS_ID,
  960.                                          pdVIS_DATE         => cr.VISIT_DATE,
  961.                                          pnVIS_EMPLOYER     => nEMPLOYERS,
  962.                                          pnVIS_PURPOSE      => nVIS_PURPOSE,
  963.                                          pnVIS_KIND         => NULL,
  964.                                          pnVIS_PLACE        => nVIS_PLACE,
  965.                                          pnVIS_IS_PRIMARY   => NULL,
  966.                                          pnVIS_PAYMENT_KIND => nPAYMENT_KIND,
  967.                                          pnSERVICE          => nSERVICE,
  968.                                          pnVIS_RESULT       => nVIS_RESULT,
  969.                                          pnDGROUP           => NULL,
  970.                                          pnVIS_PROF_DISEASE => NULL,
  971.                                          pnVISIT            => nVISITS_ID,
  972.                                          pnSER_COUNT        => 1,
  973.                                          pnSER_KOEFF        => 1,
  974.                                          pnUET_COUNT        => NVL(nUET_COUNT,0),
  975.                                          pnIS_AUTO          => 0,
  976.                                          pnROW_TYPE         => 1,
  977.                                          pnVIS_REF_RESULT   => NULL,
  978.                                          pnVIS_DEP          => NULL,
  979.                                          pnLPU_TO           => NULL,
  980.                                          pnDIR_PURPOSE      => NULL,
  981.                                          psNOTE             => NULL,
  982.                                          pnSMP_TEAM_PROFILE => NULL,
  983.                                          pnTYPE             => NULL,
  984.                                          pnRECOMMENDATION   => NULL,
  985.                                          pnPHYSICAL_GROUP   => NULL,
  986.                                          pnIS_EMERGENCY     => NULL,
  987.                                          pnMED_CARE_KIND    => NULL,
  988.                                          pnANEST_TYPE       => NULL,
  989.                                          pnAPP_KIND         => NULL,
  990.                                          pnPC_PAT           => NULL);
  991.             EXCEPTION
  992.               WHEN OTHERS THEN
  993.                 nAMB_TALON_VISITS_ID := NULL;
  994.                 lg('ERR_ADD_AMB_TALON_VISITS','Ошибка создания посещения амбулаторного талона для пациента: '||cr.FIO||' (строка №'||cr.NOMER_PP||')', SQLERRM);
  995.                 ROLLBACK TO IMP70_P_ISKUS_AMB_TALONS;
  996.                 continue;
  997.             END;
  998.         END;
  999.  
  1000.         ----------------------------------------
  1001.         --10 блок обработки данных в разделе D_AMB_TALON_MKBS
  1002.         ----------------------------------------
  1003.         --проверим не была ли создана запись на прежних итерациях импорта
  1004.         BEGIN
  1005.           SELECT atm.ID
  1006.             INTO nAMB_TALON_MKBS_ID
  1007.             FROM D_AMB_TALON_MKBS atm
  1008.            WHERE atm.LPU = pnLPU
  1009.              AND atm.PID = nAMB_TALONS_ID
  1010.              AND atm.EMPLOYER = nEMPLOYERS
  1011.              AND atm.MKB = nMKB
  1012.              AND atm.DIAGNOSIS = nVIS_DIAGNOSISES_ID
  1013.              AND atm.VISIT = nVISITS_ID
  1014.              AND atm.IS_MAIN = 0
  1015.              AND ROWNUM = 1;
  1016.          
  1017.           lg('WAR_AMB_TALON_MKBS','Данные заболевания по АТ для пациента уже существует: '||cr.FIO||' (строка №'||cr.NOMER_PP||')');
  1018.         EXCEPTION
  1019.           WHEN NO_DATA_FOUND THEN
  1020.             BEGIN
  1021.               D_PKG_AMB_TALON_MKBS.ADD(pnD_INSERT_ID        => nAMB_TALON_MKBS_ID,
  1022.                                        pnLPU                => pnLPU,
  1023.                                        pnPID                => nAMB_TALONS_ID,
  1024.                                        pnEMPLOYER           => nEMPLOYERS,
  1025.                                        pnIS_MAIN            => 0,
  1026.                                        pnMKB                => nMKB,
  1027.                                        pnDIS_CHARACTER      => NULL,
  1028.                                        pnIS_ACTIVE          => NULL,
  1029.                                        pnCL_OBSERV_CATEGORY => NULL,
  1030.                                        pnDGROUP             => NULL,
  1031.                                        pnINJURE_KIND        => NULL,
  1032.                                        pnEX_CAUSE_MKB       => NULL,
  1033.                                        pnINJURETIME         => NULL,
  1034.                                        pnDIAGNOSIS          => nVIS_DIAGNOSISES_ID,
  1035.                                        pnVISIT              => nVISITS_ID,
  1036.                                        pnIS_AUTO            => NULL,
  1037.                                        pnLOCALIZATION       => NULL,
  1038.                                        psNOTE               => NULL,
  1039.                                        pnVIS_PERIOD         => NULL,
  1040.                                        pdDATE_TR            => NULL);
  1041.             EXCEPTION
  1042.               WHEN OTHERS THEN
  1043.                 nAMB_TALON_MKBS_ID := NULL;
  1044.                 lg('ERR_ADD_AMB_TALON_MKBS','Ошибка создания данных заболевания амбулаторного талона для пациента: '||cr.FIO||' (строка №'||cr.NOMER_PP||')', SQLERRM);
  1045.                 ROLLBACK TO IMP70_P_ISKUS_AMB_TALONS;
  1046.                 continue;
  1047.             END;
  1048.         END;
  1049.  
  1050.  
  1051.         ----------------------------------------
  1052.         --8 блок закрытия амбулаторного талона в разделе D_AMB_TALONS
  1053.         ----------------------------------------
  1054.         IF cr.VIS_RESULT IS NOT NULL
  1055.            AND nAMB_TALONS_ID IS NOT NULL THEN
  1056.           BEGIN
  1057.             D_PKG_AMB_TALONS.SET_CLOSE(pnID         => nAMB_TALONS_ID,
  1058.                                        pnLPU        => pnLPU,
  1059.                                        pnIS_CLOSE   => 1,
  1060.                                        pdEND_DATE   => cr.VISIT_DATE,
  1061.                                        pnREF_RESULT => nVIS_RESULT);
  1062.          
  1063.             nAMB_TALONS_ID := NULL;
  1064.  
  1065.             --При необходимости укажем признак закрытия случая
  1066.             IF nDC_IS_CLOSE = 1 THEN
  1067.               D_PKG_AMB_TALONS.SET_DC_CLOSE(pnID       => nAMB_TALONS_ID,
  1068.                                             pnLPU      => pnLPU,
  1069.                                             pnIS_CLOSE => 1);
  1070.             END IF;
  1071.           EXCEPTION
  1072.             WHEN OTHERS THEN
  1073.               lg('ERR_CLOSE_AMB_TALONS','Ошибка закрытия амбулаторного талона для пациента: '||cr.FIO||' (строка №'||cr.NOMER_PP||')', SQLERRM);
  1074.               ROLLBACK TO IMP70_P_ISKUS_AMB_TALONS;
  1075.               continue;
  1076.           END;
  1077.         END IF;
  1078.            
  1079.  
  1080.        
  1081.         ----------------------------------------
  1082.         --5 блок закрытия случая в разделе D_DISEASECASES
  1083.         ----------------------------------------
  1084.         IF nDC_IS_CLOSE = 1 THEN
  1085.           BEGIN
  1086.             D_PKG_DISEASECASES.SET_CLOSE(pnID          => nDISEASECASES_ID,
  1087.                                          pnLPU         => pnLPU,
  1088.                                          pnIS_CLOSE    => 1,
  1089.                                          pdCLOSE_DATE  => cr.VISIT_DATE,
  1090.                                          pnVISIT_CLOSE => nVISITS_ID,
  1091.                                          pnHAND_CLOSE  => NULL);
  1092.          
  1093.             --Если случай закрыли, то обнулим его идентификатор (чтобы на следующих итерациях создавался новый)
  1094.             nDISEASECASES_ID := NULL;
  1095.             nAMB_TALONS_ID   := NULL;
  1096.          
  1097.           EXCEPTION
  1098.             WHEN OTHERS THEN
  1099.               lg('ERR_CLOSE_DISEASECASES','Ошибка закрытия случая для пациента: '||cr.FIO||' (строка №'||cr.NOMER_PP||')', SQLERRM);
  1100.               ROLLBACK TO IMP70_P_ISKUS_AMB_TALONS;
  1101.               continue;
  1102.           END;
  1103.         END IF;
  1104.  
  1105.       END IF;  -- конец условия if nAGENTS_ID is not null
  1106.     END LOOP;  -- конец цикла по таблице импорта
  1107.   END IF;      -- конец условия if nERROR = 0 or pnERR_IGNORE = 1
  1108.  
  1109.  
  1110.  
  1111.   --вернем контекстную переменную EMPLOYER, которая была до запуска импорта
  1112.   set_context_employer(sCONTEXT_EMPLOYER);
  1113.  
  1114.  
  1115.   lg('END_IMP','Завершение импорта в '||TO_CHAR(SYSDATE,'dd.mm.yyyy hh24:mi:ss'));
  1116.  
  1117. EXCEPTION
  1118.   WHEN OTHERS THEN
  1119.     lg('ERR_IMP','Ошибка на строке №'||nNOMER_PP||': '||SQLERRM);
  1120.     ROLLBACK;
  1121.     D_P_EXC('Ошибка процедуры IMP70_P_ISKUS_AMB_TALONS импорта данных из таблицы IMP70_ISKUS_AMB_TALONS: Ошибка - '||SQLERRM);
  1122. END IMP70_P_ISKUS_AMB_TALONS;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement