Esempio n. 1
0
        /// <summary>МЕТОД 6. Расчет Параклиники/Гистологии</summary>
        private void MET_CalcPar()
        {
            // Проверка на связь двух таблиц
            try
            {
                // Связываем ReStrahReestr и RePar
                DataRow _RowParErr = PRI_RowReestr.GetChildRows("ReReestr_Par")[0];
            }
            catch
            {
                PRI_ErrorToExcel.PROP_ErrorCod  = "44";
                PRI_ErrorToExcel.PROP_ErrorName = "(вну) Не могу соединить исследование друг с другом (проверте код Врача в s_UsersDostup)";
                PRI_ErrorToExcel.MET_SaveError();
                PRI_ErrorRow = true;
                return;
            }

            // Связываем ReStrahReestr и RePar
            DataRow _RowPar = PRI_RowReestr.GetChildRows("ReReestr_Par")[0];

            // PLAT -> SMO (Код страховой компании)                               далее в  MET_CalcAll()
            PRI_StrahReestr.PLAT = m.MET_PoleStr("Scom", _RowPar);

            // LPU_1 (Подразделения МО)
            PRI_StrahReestr.LPU_1 = 55550900;                               // по умолчанию главный

            // ORDER (Направление на госпитализацию, 1 - плановая, 2 - экстренная (у нас нету), 0 - поликлиника)
            PRI_StrahReestr.ORDER = 0;

            // LPU_ST -> USL_OK (Условия оказания мед. помощи, справочник V006, 1 - кр. стационра, 2 - дн. стационар, 3 - поликлиника, для параклиники пусть будет 4 и 5, при выгрузке в XML поменяем на 3)
            PRI_StrahReestr.LPU_ST = (int)PRI_TipUsl;

            // VIDPOM (Вид помощи, справочник V008, у нас 13 - поликл/параклиники, 14 - телемедицина, 31 - стационар)
            PRI_StrahReestr.VIDPOM = m.MET_PoleInt("VIDPOM", _RowPar);            // основной 13, но для всякой экзотики там другой номер

            // PROFIL (Профиль, справочник V002)
            PRI_StrahReestr.PROFIL = m.MET_PoleDec("PROFIL", _RowPar);
            // Проверка
            PRI_ErrorToExcel.MET_VeryfError(PRI_StrahReestr.PROFIL == 0,
                                            "12", "(вну) Не найден профиль",
                                            ref PRI_ErrorRow);

            // DET (Детский профиль, если ребёнок то 1 иначе 0)      далее в  MET_CalcAll()
            PRI_Age = m.MET_PoleInt("Age", _RowPar);

            // PRVS (Специальность врача, справочник V004)
            PRI_StrahReestr.PRVS = m.MET_PoleStr("PRVS", _RowPar);

            // IDDOKT -> CODE_MD (Код врача, справочник врачей)
            PRI_StrahReestr.IDDOKT = m.MET_PoleStr("IDDOKT", _RowPar);

            // ARR_DATE -> DATE_IN (Дата начала)
            PRI_StrahReestr.ARR_DATE = m.MET_PoleDate("DP", PRI_RowReestr);

            // EX_DATE -> DATE_OUT (Дата окончания)
            PRI_StrahReestr.EX_DATE = PRI_StrahReestr.ARR_DATE;

            // PODR (Код отделения)
            if (PRI_StrahReestr.EX_DATE.Value.Year < 2022)
            {
                string _Prof = ((int)PRI_StrahReestr.PROFIL).ToString("D3");
                if (_Prof == "034")
                {
                    PRI_StrahReestr.PODR = m.MET_ParseDec($"3{_Prof}2{_Prof}");
                }
                else
                {
                    PRI_StrahReestr.PODR = m.MET_ParseDec($"3{_Prof}1{_Prof}");
                }
            }
            else
            {
                PRI_StrahReestr.PODR = m.MET_ParseDec("550900" + m.MET_PoleInt("Profil_K", _RowPar).ToString("D2"));
            }

            // DS1 (Диагноз)
            PRI_StrahReestr.DS1 = m.MET_PoleStr("D", PRI_RowReestr);
            // Проверка
            if (PRI_StrahReestr.DS1.Length < 3)
            {
                PRI_ErrorToExcel.PROP_ErrorCod  = "42";
                PRI_ErrorToExcel.PROP_ErrorName = "(вну) Что то не так с диагнозом";
                PRI_ErrorToExcel.MET_SaveError();
                PRI_ErrorRow = true;
                return;
            }

            //DS2 (Сопутствующий Диагноз - не заполняем)
            PRI_StrahReestr.DS2 = "";

            // PACIENTID -> NHISTORY (Номер истории Cod из kbolInfo)
            PRI_StrahReestr.PACIENTID = m.MET_PoleStr("Cod", PRI_RowReestr);

            // RES_G -> RSLT (Результат обращения/госпитализации, справочник V009)
            PRI_StrahReestr.RES_G = 301;

            // ISHOD (Исход заболевания, справочник V012)
            PRI_StrahReestr.ISHOD = 304;

            // KOL_USL (Койко дней)
            PRI_StrahReestr.KOL_USL = 1;

            // IDSP (Код способа оплаты, справочник V010: 28 - За медицинскую услугу)
            PRI_StrahReestr.IDSP = 28;

            // TARIF (Тариф)
            PRI_StrahReestr.TARIF = m.MET_PoleDec("Tarif", _RowPar);
            // Проверка
            if (PRI_StrahReestr.TARIF == 0)
            {
                PRI_ErrorToExcel.PROP_ErrorCod  = "26";
                PRI_ErrorToExcel.PROP_ErrorName = "(вну) Не найден тариф";
                PRI_ErrorToExcel.MET_SaveError();
                PRI_ErrorRow = true;
            }

            // SUM_LPU -> SUMV_USL (Сумма услуги)
            PRI_StrahReestr.SUM_LPU = PRI_StrahReestr.TARIF;

            // NUMBER -> NPOLIS (Номер полиса)  далее в  MET_CalcAll()
            PRI_NPolis = m.MET_PoleStr("SN", _RowPar);
            if (string.IsNullOrEmpty(PRI_NPolis))
            {
                PRI_ErrorToExcel.PROP_ErrorCod  = "61";
                PRI_ErrorToExcel.PROP_ErrorName = "(вну) Куда номер полиса дели то?";
                PRI_ErrorToExcel.MET_SaveError();
                PRI_ErrorRow = true;
                return;
            }

            // SERIA -> SPOLIS (Серия полиса)
            PRI_StrahReestr.SERIA = m.MET_PoleStr("SS", _RowPar).ToUpper();

            // DayN (Длительность лечения из Тарифов)
            PRI_StrahReestr.DayN = 1;

            // Цель посещения
            PRI_Sl.P_Cel = "1.0";

            PRI_CouUsl = 1;

            // Описываем услугу
            MyUSL _Usluga = new MyUSL();

            _Usluga.DatN     = PRI_StrahReestr.ARR_DATE.ToString().Remove(10);
            _Usluga.D        = PRI_StrahReestr.DS1;
            _Usluga.PRVS_Usl = PRI_StrahReestr.PRVS;

            _Usluga.MD = PRI_StrahReestr.IDDOKT;
            // Проверка на код врача
            if (_Usluga.MD.Length < 16)
            {
                PRI_ErrorToExcel.PROP_ErrorCod  = "44";
                PRI_ErrorToExcel.PROP_ErrorName = "(вну) Отсутствует код врача";
                PRI_ErrorToExcel.MET_SaveError();
                PRI_ErrorRow = true;
                return;
            }
            _Usluga.Code_Usl = m.MET_PoleStr("CODE_USL", _RowPar);
            _Usluga.Usl      = m.MET_PoleStr("VID_VME", _RowPar);
            PRI_Sl.USL.Add(_Usluga);

            // ЛПУ направления
            PRI_Sl.NPR_MO = 555509;
            PRI_Sl.NPR_MO = m.MET_PoleInt("NPR_MO", _RowPar);
            // Пациент может быть направлен от нас, только с другого ЛПУ
            if (PRI_Sl.NPR_MO == 555509 && m.MET_ParseInt(PRI_StrahReestr.PLAT) < 100) // Иногородним позволяем направление с нашим ЛПУ
            {
                PRI_ErrorToExcel.PROP_ErrorCod  = "46";
                PRI_ErrorToExcel.PROP_ErrorName = "(вну) ЛПУ направления NPR_MO не может быть наша (555509)";
                PRI_ErrorToExcel.MET_SaveError();
                PRI_ErrorRow = true;
                return;
            }

            // Дата направления
            PRI_Sl.NPR_DATE = _Usluga.DatN;

            // DS_ONK - Подозрение на ЗНО
            // PRI_Sl.DS_ONK = 1; -- убрал 30.08.2021 года

            // Если ЗНО
            if (PRI_StrahReestr.DS1.Substring(0, 1) == "C" || PRI_StrahReestr.DS1.Substring(0, 2) == "D0" || PRI_StrahReestr.DS1.Substring(0, 3) == "D70")
            {
                // Характер заболевания 1 - острое, 2 храническое впервые, 3 - хроническое повторно
                PRI_Sl.C_ZAB = 2;

                string _jTag = m.MET_PoleStr("jTag", _RowPar);

                // Проверка на наличия данных KbolInfo
                if (string.IsNullOrEmpty(_jTag))
                {
                    PRI_ErrorToExcel.PROP_ErrorCod  = "28";
                    PRI_ErrorToExcel.PROP_ErrorName = "(вну) Не найдена строка parObsledov в KbolInfo";
                    PRI_ErrorToExcel.MET_SaveError();
                    PRI_ErrorRow = true;
                    return;
                }

                JObject _Json;
                try
                {
                    _Json = JObject.Parse(_jTag);
                }
                catch
                {
                    PRI_ErrorToExcel.PROP_ErrorCod  = "30";
                    PRI_ErrorToExcel.PROP_ErrorName = "(вну) Неправильная структура тегов в KbolInfo";
                    PRI_ErrorToExcel.MET_SaveError();
                    PRI_ErrorRow = true;
                    return;
                }

                // Клиническая группа
                string _klin_gr = (string)_Json["Klin_gr"];
                // Проверка на наличия Клинической группы в KbolInfo, если нет, то подозрение
                if (string.IsNullOrEmpty(_klin_gr))
                {
                    _klin_gr = "Ia";
                }

                // DS_ONK - Если подозрение на ЗНО
                if (_klin_gr == "Ia" || _klin_gr == "Ib")
                {
                    PRI_Sl.DS_ONK = 1;
                }
                else
                {
                    PRI_Sl.DS_ONK = 0;
                }

                // ONK_UL - Блок лечения ЗНО
                if (PRI_Sl.DS_ONK == 0)
                {
                    PRI_Sl.ONK_SL = new MyONK_SL();

                    //DS1_T Повод обращения
                    PRI_Sl.ONK_SL.DS1_T = 5;
                }
            }
            PRI_StrahReestr.CODE_USL = _Usluga.Code_Usl;
            PRI_StrahReestr.VID_VME  = _Usluga.Usl;

            MET_CalcAll();

            // Формируем Случай MySL в json
            try
            {
                PRI_StrahReestr.NOM_USL = JsonConvert.SerializeObject(PRI_Sl,
                                                                      Formatting.Indented,
                                                                      new JsonSerializerSettings {
                    DefaultValueHandling = DefaultValueHandling.Ignore
                });
            }
            catch (Exception)
            {
                PRI_StrahReestr.NOM_USL = "Ошибка json";
            }
        }
Esempio n. 2
0
        /// <summary>МЕТОД 5. Расчет Поликлиники</summary>
        private void MET_CalcPol()
        {
            // Связываем ReStrahReestr и ReApac
            DataRow _RowApac = PRI_RowReestr.GetChildRows("ReReestr_Apac")[0];

            // Версия редакции 3.2 (январь 2020)
            // Имя поля в таблице StrahReestr (Описание)
            // PLAT (Код страховой компании)                               далее в  MET_CalcAll()
            PRI_StrahReestr.PLAT = m.MET_PoleStr("Scom", _RowApac);

            // LPU_1 (Подразделения МО)
            int _Podrazd = m.MET_PoleInt("Podrazd", _RowApac);

            PRI_StrahReestr.LPU_1 = _Podrazd == 3 ? 55550900 : 55550901;                // главный/филиал

            // ORDER (Направление на госпитализацию, 1 - плановая, 2 - экстренная (у нас нету), 0 - поликлиника)
            PRI_StrahReestr.ORDER = 0;

            // LPU_ST (Условия оказания мед. помощи, справочник V006, 1 - кр. стационра, 2 - дн. стационар, 3 - поликлиника)
            PRI_StrahReestr.LPU_ST = 3;

            // VIDPOM Вид помощи, справочник V008: 11 - поликл. медсестра, 13 - поликл врач/диагностика/дневной стационар, 14 - телемедицина, 31 - стационар, 32 - ВМП
            PRI_StrahReestr.VIDPOM = m.MET_PoleInt("VIDPOM", _RowApac);

            // PROFIL (Профиль, справочник V002)
            PRI_StrahReestr.PROFIL = m.MET_PoleDec("PROFIL", _RowApac);
            // Проверка
            PRI_ErrorToExcel.MET_VeryfError(PRI_StrahReestr.PROFIL == 0,
                                            "12", "(вну) Не найден профиль",
                                            ref PRI_ErrorRow);

            // DET (Детский профиль, если ребёнок то 1 иначе 0)   далее в  MET_CalcAll()

            PRI_Age = m.MET_PoleInt("Age", _RowApac);

            // PRVS (Специальность врача, справочник V004)
            PRI_StrahReestr.PRVS = m.MET_PoleStr("PRVS", _RowApac);

            // IDDOKT (Код врача, справочник врачей)
            PRI_StrahReestr.IDDOKT = m.MET_PoleStr("IDDOKT", _RowApac);

            // ARR_DATE -> DATE_1 -> DATE_IN (Дата начала)
            PRI_StrahReestr.ARR_DATE = m.MET_PoleDate("DN", _RowApac);

            // EX_DATE -> DATE_2 -> DATE_OUT (Дата окончания)
            PRI_StrahReestr.EX_DATE = m.MET_PoleDate("DK", _RowApac);

            // PODR (Код отделения)
            // Все что до 2022 ггода закоментировал, так как
            // Корешкова сказала случаи 2021 года, закрытые в 2022 году
            // подавать с новым кодом отделения.
            //if (PRI_StrahReestr.EX_DATE.Value.Year < 2022)
            //{
            //    string _Prof = ((int)PRI_StrahReestr.PROFIL).ToString("D3");
            //    PRI_StrahReestr.PODR = m.MET_ParseDec($"3{_Prof}2{_Prof}");
            //}
            //else
            PRI_StrahReestr.PODR = _Podrazd == 3 ? 55090026m : 55090109m;

            // DS1 -> DS (Диагноз)
            PRI_StrahReestr.DS1 = m.MET_PoleStr("D", PRI_RowReestr);
            // Проверка
            if (PRI_StrahReestr.DS1.Length < 3)
            {
                PRI_ErrorToExcel.PROP_ErrorCod  = "42";
                PRI_ErrorToExcel.PROP_ErrorName = "(вну) Что то не так с диагнозом";
                PRI_ErrorToExcel.MET_SaveError();
                PRI_ErrorRow = true;
                return;
            }

            // DS2 (Сопутствующий Диагноз - не заполняем)
            PRI_StrahReestr.DS2 = "";

            // PACIENTID -> NHISTORY (Номер истории болезни/талона)
            PRI_StrahReestr.PACIENTID = m.MET_PoleStr("Cod", PRI_RowReestr);

            // RES_G -> RSLT(Результат обращения/госпитализации, справочник V009)
            int[] _RES_G  = { 0, 301, 301, 304, 305, 306, 307, 308, 309, 311, 311, 306 };
            int   _Rezobr = m.MET_PoleInt("REZOBR", _RowApac);

            // Если месяц сдачи совпадает с месяцем посещения или исправленный, то смотрим какой результат проставили врачи
            if (PRI_StrahReestr.EX_DATE.Value.Month == PRI_StrahFile.MONTH || PRI_StrahFile.pParent > 0)
            {
                PRI_StrahReestr.RES_G = _RES_G[_Rezobr];
            }
            else
            {
                // если месяц не совпадает, то ставим результат обращения 302 - прерван по инициативе пациента (ну типо больше не пришел)
                PRI_StrahReestr.RES_G = 302;
            }

            //// Для посещений прошлого месяца, ставим результат обращения (Лечение прервано по инициативе пациента)
            //if (PRI_StrahReestr.EX_DATE.Value.Month < PROP_DateN.Month)
            //    PRI_StrahReestr.RES_G = 302;

            // ISHOD (Исход заболевания, справочник V012)
            int[] _ISHOD = { 0, 301, 303, 302, 304, 304, 304, 304, 304, 304, 304, 304 };
            PRI_StrahReestr.ISHOD = _ISHOD[_Rezobr];

            // KOL_USL (Койко дней)
            PRI_StrahReestr.KOL_USL = m.MET_PoleInt("uet3", _RowApac);

            // IDSP (Код способа оплаты, справочник V010: 29 - разовые посещения, 30 по заболеванию)
            PRI_StrahReestr.IDSP = PRI_StrahReestr.KOL_USL == 1 ? 29 : 30;

            // TARIF (Тариф)
            PRI_StrahReestr.TARIF = m.MET_PoleDec("Tarif", _RowApac);
            // Проверка
            if (PRI_StrahReestr.TARIF == 0)
            {
                PRI_ErrorToExcel.PROP_ErrorCod  = "26";
                PRI_ErrorToExcel.PROP_ErrorName = "(вну) Не найден тариф";
                PRI_ErrorToExcel.MET_SaveError();
                PRI_ErrorRow = true;
            }

            // SUM_LPU (Сумма услуги)
            PRI_StrahReestr.SUM_LPU = PRI_StrahReestr.TARIF;

            // VPOLIS (Тип полиса 1 - старый, 2 - временный, 3 - новый)   далее в  MET_CalcAll()
            PRI_NPolis = m.MET_PoleStr("SN", _RowApac);

            // SERIA -> SPOLIS (Серия полиса)
            PRI_StrahReestr.SERIA = m.MET_PoleStr("SS", _RowApac).ToUpper();

            // DayN (Длительность лечения из Тарифов)
            PRI_StrahReestr.DayN = 1;

            // C_ZAB Характер заболевания 1 - острое, 2 храническое впервые, 3 - хроническое повторно
            // Только для поликлиники (не Z) или для стационара (с диагнозом С..D09)
            if (PRI_StrahReestr.DS1.Substring(0, 1) != "Z")
            {
                PRI_Sl.C_ZAB = m.MET_PoleInt("C_Zab", _RowApac);
            }

            // Цель посещения (дальше будет уточнение)
            PRI_Sl.P_Cel = m.MET_PoleStr("P_Cel", _RowApac);
            // Проверка
            if ((PRI_StrahReestr.IDSP == 30 && PRI_Sl.P_Cel != "3.0") || (PRI_StrahReestr.IDSP != 30 && PRI_Sl.P_Cel == "3.0"))
            {
                PRI_ErrorToExcel.PROP_ErrorCod  = "35";
                PRI_ErrorToExcel.PROP_ErrorName = $"(вну) Не совпадает IDSP {PRI_StrahReestr.IDSP} с целью посещения {PRI_Sl.P_Cel}";
                PRI_ErrorToExcel.MET_SaveError();
                PRI_ErrorRow = true;
            }

            PRI_CouUsl = 0;

            // Связываем ReApac и RePol
            foreach (DataRow _PolRow in _RowApac.GetChildRows("ReApac_Pol"))
            {
                PRI_CouUsl++;

                var _Usluga = new MyUSL
                {
                    //    Nom = m.MET_PoleInt("Num", _PolRow),
                    DatN     = m.MET_PoleStr("DP", _PolRow),
                    D        = m.MET_PoleStr("D", _PolRow),
                    PRVS_Usl = m.MET_PoleStr("PRVS_Usl", _PolRow),
                    MD       = m.MET_PoleStr("CODE_MD", _PolRow),
                    Code_Usl = "AMB.1.99", // m.MET_PoleStr("CODE_USL", _PolRow),
                    Usl      = m.MET_PoleStr("VID_VME", _PolRow)
                };
                _Usluga.DatN = _Usluga.DatN == "" ? null : _Usluga.DatN.Remove(10);
                PRI_Sl.USL.Add(_Usluga);

                // Берем из первого случая
                if (PRI_CouUsl == 1)
                {
                    // ЛПУ направления
                    PRI_Sl.NPR_MO = m.MET_PoleInt("NPR_MO", _PolRow);

                    if (PRI_ErrorRow)
                    {
                        return;               // Критическая ошибка - выходим
                    }
                    // Дата направления
                    PRI_Sl.NPR_DATE = m.MET_PoleStr("NPR_DATE", _PolRow).Substring(0, 10);
                    // Дата направления должна быть не пустой и меньше = сегодняшнего дня
                    if (string.IsNullOrEmpty(PRI_Sl.NPR_DATE))
                    {
                        PRI_ErrorToExcel.PROP_ErrorCod  = "59";
                        PRI_ErrorToExcel.PROP_ErrorName = $"(вну) Отсутствует дата направления NPR_DATE в поликлинике";
                        PRI_ErrorToExcel.MET_SaveError();
                        PRI_ErrorRow = true;
                    }
                    else
                    {
                        MET_VerifDate(PRI_Sl.NPR_DATE, "направления в поликлинику", true, false, false, true);
                    }
                }

                // Только для ЗНО
                if ((PRI_StrahReestr.DS1.Substring(0, 1) == "C" || PRI_StrahReestr.DS1.Substring(0, 2) == "D0") &&
                    PRI_StrahReestr.EX_DATE >= new DateTime(2019, 12, 1))
                {
                    string _jTag = m.MET_PoleStr("jTag", _PolRow);

                    // Проверка на наличия данных KbolInfo
                    if (string.IsNullOrEmpty(_jTag))
                    {
                        PRI_ErrorToExcel.PROP_ErrorCod  = "28";
                        PRI_ErrorToExcel.PROP_ErrorName = "(вну) Не найдена строка APAC в KbolInfo";
                        PRI_ErrorToExcel.MET_SaveError();
                        PRI_ErrorRow = true;
                        continue;
                    }

                    JObject _Json;
                    try
                    {
                        _Json = JObject.Parse(_jTag);
                    }
                    catch
                    {
                        PRI_ErrorToExcel.PROP_ErrorCod  = "30";
                        PRI_ErrorToExcel.PROP_ErrorName = "(вну) Неправильная структура тегов в KbolInfo";
                        PRI_ErrorToExcel.MET_SaveError();
                        PRI_ErrorRow = true;
                        return;
                    }

                    // УБРАЛ направления 28/07/2020 из за штрафов Капитала по превышению 7го срока и отсутствия точной даты направления
                    //// Направления на исследования
                    //IList<JToken> _Results = _Json["NAPR"]?.Children().ToList();
                    //if (_Results != null)
                    //{
                    //    PRI_Sl.NAPR = new List<MyNAPR>();
                    //    foreach (JToken _result in _Results)
                    //    {
                    //        MyNAPR _Napr = _result.ToObject<MyNAPR>();
                    //        _Napr.NAPR_V = 3;
                    //        _Napr.NAPR_DATE = PRI_StrahReestr.ARR_DATE.Value.ToString("dd.MM.yyyy");  // !!! Пока берем не из направления, а начальную дату случая
                    //        PRI_Sl.NAPR.Add(_Napr);
                    //    }
                    //}

                    // Только из последнего посещения
                    if (PRI_CouUsl == PRI_StrahReestr.KOL_USL)
                    {
                        // Цель посещения 3.0 - обращение, 1.0 - посещение разовое, 1.3 - диспансерное наблюдение (в базисе 4.0)
                        if (PRI_Sl.P_Cel == "1.0")
                        {
                            try
                            {
                                double _Cel = (double)_Json["Cel"];
                                // Цель посещения - диспансерное наблюдение - Состоит
                                // 20.05.2022 если случай совпадает с отчетным месяцем то оставляем диспансерное наблюдение
                                // иначе разовое посещение, так как диспансерное наблюдение подается в отчетный месяц
                                if (_Cel == 4.0 && PRI_StrahReestr.EX_DATE.Value.Month == PRI_StrahFile.MONTH)
                                {
                                    PRI_Sl.P_Cel = "1.3";
                                    //  PRI_Sl.DN = 1;
                                }
                            }
                            catch
                            {
                                PRI_ErrorToExcel.PROP_ErrorCod  = "41";
                                PRI_ErrorToExcel.PROP_ErrorName = "(вну) Тег Cel (Цель посещения) в KbolInfo имеет некоректное значение";
                                PRI_ErrorToExcel.MET_SaveError();
                                PRI_ErrorRow = true;
                                return;
                            }
                        }

                        // Клиническая группа
                        string _klin_gr = (string)_Json["Klin_gr"];
                        // Проверка на наличия Клинической группы в KbolInfo
                        if (string.IsNullOrEmpty(_klin_gr))
                        {
                            PRI_ErrorToExcel.PROP_ErrorCod  = "29";
                            PRI_ErrorToExcel.PROP_ErrorName = "(вну) Не найден тег Klin_gr (Клиническая группа) в KbolInfo";
                            PRI_ErrorToExcel.MET_SaveError();
                            PRI_ErrorRow = true;
                            return;
                        }

                        // DS_ONK - Если подозрение на ЗНО
                        if (_klin_gr == "Ia" || _klin_gr == "Ib")
                        {
                            PRI_Sl.DS_ONK = 1;
                        }
                        else
                        {
                            PRI_Sl.DS_ONK = 0;
                            // Если 3 клиническая группа то ставим состоит на учете 02.04.2022
                            if (PRI_Sl.P_Cel == "1.3")
                            {
                                PRI_Sl.DN    = 1;               // у кого не первая клиническая группа ставим - состоит на диспансерном учете 29.06.2029
                                PRI_Sl.C_ZAB = 3;               // Характер заболевания 2 повторно хронически
                            }
                            else
                            {
                                // Если диагноз впервые то взят на учет 02.04.2022 (Рубановская Е.С.)
                                // иначе если острое или зарег ранее то состоит на учете
                                if (PRI_Sl.C_ZAB == 2)
                                {
                                    PRI_Sl.DN = 2;              // взят на учет
                                }
                                else
                                {
                                    PRI_Sl.DN = 1;              // состоит на учете
                                }
                            }
                        }

                        // ONK_UL - Блок лечения ЗНО
                        if (PRI_Sl.DS_ONK == 0)
                        {
                            // Диагноз
                            string _D5 = PRI_StrahReestr.DS1;
                            string _D3 = _D5.Substring(0, 3);

                            PRI_Sl.ONK_SL = new MyONK_SL();

                            // DS1_T - Повод обращения (N018)
                            // 0 - первичное лечение
                            // 1 - рецедив с метастазами, 2 - прогресирование с метастазами, 21, 22 - то-же но без метастаз)
                            // 3 - динамическое наблюдение
                            // 4 - диспансерное наблюдение
                            // 5 - диагностика
                            // 6 - симптоматическое лечение
                            PRI_Sl.ONK_SL.DS1_T = (int?)_Json["DS1_T"] ?? 0;
                            if (PRI_Sl.ONK_SL.DS1_T == 1 || PRI_Sl.ONK_SL.DS1_T == 2)
                            {
                                // MTSTZ - Отдаленные метастазы
                                PRI_Sl.ONK_SL.MTSTZ = 1;
                            }
                            if (PRI_Sl.ONK_SL.DS1_T == 21 || PRI_Sl.ONK_SL.DS1_T == 22)
                            {
                                PRI_Sl.ONK_SL.DS1_T = PRI_Sl.ONK_SL.DS1_T - 20;
                            }
                            if (PRI_Sl.P_Cel == "1.3")
                            {
                                PRI_Sl.ONK_SL.DS1_T = 4;
                            }

                            // STAD - Стадия (только для DS1_T < 5)
                            if (PRI_Sl.ONK_SL.DS1_T < 5)
                            {
                                string _stadia = (string)_Json["Stadia"];
                                var    _N002   = PRI_N002.Where(e => e.Kod1 == _D5).ToList();
                                // Сначала пытаемся найти по полному диагнозу
                                if (!_N002.Any())
                                {
                                    _N002 = PRI_N002.Where(e => e.Kod1 == _D3).ToList();
                                }
                                // Иначе ищем по 3м сиволам диагноза
                                if (!_N002.Any())
                                {
                                    _N002 = PRI_N002.Where(e => e.Kod1 == "").ToList(); // Если не нашли, то без диагноза
                                }
                                int?_stadiaNumber = _N002.FirstOrDefault(e => e.Kod3.Contains($"\"{_stadia}\""))?.Number ??
                                                    _N002.First()?.Number;
                                PRI_Sl.ONK_SL.STAD = _stadiaNumber ?? 145;
                            }

                            // DET (Детский профиль, если ребёнок то 1 иначе 0)
                            PRI_StrahReestr.DET = PRI_Age < 18 ? 1 : 0;

                            // TNM (заполняем только для взрослых и первичном лечении)
                            if (PRI_StrahReestr.DET == 0 && PRI_Sl.ONK_SL.DS1_T == 0)
                            {
                                // ONK_T - T
                                string _T    = (string)_Json["T"];
                                var    _N003 = PRI_N003.Where(e => e.Kod1 == _D5).ToList();
                                // Сначала пытаемся найти по полному диагнозу
                                if (!_N003.Any())
                                {
                                    _N003 = PRI_N003.Where(e => e.Kod1 == _D3).ToList();
                                }
                                // Иначе ищем по 3м сиволам диагноза
                                if (!_N003.Any())
                                {
                                    _N003 = PRI_N003.Where(e => e.Kod1 == "").ToList(); // Если не нашли, то без диагноза
                                }
                                int?_TNumber = _N003.FirstOrDefault(e => e.Kod3.Contains($"\"{_T}\""))?.Number ??
                                               _N003.First()?.Number;
                                PRI_Sl.ONK_SL.ONK_T = _TNumber ?? 182;

                                // ONK_N - N
                                string _N    = (string)_Json["N"];
                                var    _N004 = PRI_N004.Where(e => e.Kod1 == _D5).ToList();
                                // Сначала пытаемся найти по полному диагнозу
                                if (!_N004.Any())
                                {
                                    _N004 = PRI_N004.Where(e => e.Kod1 == _D3).ToList();
                                }
                                // Иначе ищем по 3м сиволам диагноза
                                if (!_N004.Any())
                                {
                                    _N004 = PRI_N004.Where(e => e.Kod1 == "").ToList(); // Если не нашли, то без диагноза
                                }
                                int?_NNumber = _N004.FirstOrDefault(e => e.Kod3.Contains($"\"{_N}\""))?.Number ??
                                               _N004.First()?.Number;
                                PRI_Sl.ONK_SL.ONK_N = _NNumber ?? 99;

                                // ONK_M - M
                                string _M    = (string)_Json["M"];
                                var    _N005 = PRI_N005.Where(e => e.Kod1 == _D5).ToList();
                                // Сначала пытаемся найти по полному диагнозу
                                if (!_N005.Any())
                                {
                                    _N005 = PRI_N005.Where(e => e.Kod1 == _D3).ToList();
                                }
                                // Иначе ищем по 3м сиволам диагноза
                                if (!_N005.Any())
                                {
                                    _N005 = PRI_N005.Where(e => e.Kod1 == "").ToList(); // Если не нашли, то без диагноза
                                }
                                int?_MNumber = _N005.FirstOrDefault(e => e.Kod3.Contains($"\"{_M}\""))?.Number ??
                                               _N005.First()?.Number;
                                PRI_Sl.ONK_SL.ONK_M = _MNumber ?? 56;
                            }

                            // CONS Блок о проведении консилиума
                            // Связываем ReApac и RePolCons
                            foreach (DataRow _PolRowCons in _RowApac.GetChildRows("ReApac_PolCons"))
                            {
                                switch (m.MET_PoleInt("PR_CONS", _PolRowCons))
                                {
                                case 1:
                                    PRI_Sl.Taktika_1 = MET_VerifDate(m.MET_PoleStr("DT_CONS", _PolRowCons), $"консилиума", true, false);
                                    if (PRI_ErrorRow)
                                    {
                                        return;                   // Критическая ошибка - выходим
                                    }
                                    break;

                                case 2:
                                    PRI_Sl.Taktika_2 = MET_VerifDate(m.MET_PoleStr("DT_CONS", _PolRowCons), $"консилиума", true, false);
                                    if (PRI_ErrorRow)
                                    {
                                        return;                   // Критическая ошибка - выходим
                                    }
                                    break;

                                case 3:
                                    PRI_Sl.Taktika_3 = MET_VerifDate(m.MET_PoleStr("DT_CONS", _PolRowCons), $"консилиума", true, false);
                                    if (PRI_ErrorRow)
                                    {
                                        return;                   // Критическая ошибка - выходим
                                    }
                                    break;
                                }
                            }

                            // B_PROT Блок об имеющихся противопоказаниях и отказах
                            PRI_Sl.PrOt_1 = MET_VerifDate((string)_Json["PrOt_1"], "PrOt_1", true);
                            if (PRI_ErrorRow)
                            {
                                return;               // Критическая ошибка - выходим
                            }
                            PRI_Sl.PrOt_2 = MET_VerifDate((string)_Json["PrOt_2"], "PrOt_2", true);
                            if (PRI_ErrorRow)
                            {
                                return;               // Критическая ошибка - выходим
                            }
                            PRI_Sl.PrOt_3 = MET_VerifDate((string)_Json["PrOt_3"], "PrOt_3", true);
                            if (PRI_ErrorRow)
                            {
                                return;               // Критическая ошибка - выходим
                            }
                            PRI_Sl.PrOt_4 = MET_VerifDate((string)_Json["PrOt_4"], "PrOt_4", true);
                            if (PRI_ErrorRow)
                            {
                                return;               // Критическая ошибка - выходим
                            }
                            PRI_Sl.PrOt_5 = MET_VerifDate((string)_Json["PrOt_5"], "PrOt_5", true);
                            if (PRI_ErrorRow)
                            {
                                return;               // Критическая ошибка - выходим
                            }
                            PRI_Sl.PrOt_6 = MET_VerifDate((string)_Json["PrOt_6"], "PrOt_6", true);
                            if (PRI_ErrorRow)
                            {
                                return;               // Критическая ошибка - выходим
                            }
                        }
                    }

                    // Телемедицина. Берем из первого случая.
                    if (PRI_CouUsl == 1)
                    {
                        // Есть ли тег телемедицины
                        int?_TMK = (int?)_Json["TMK"];
                        if (_TMK != null)
                        {
                            // Телемедицина в режими отложенной консультации
                            if (_TMK == 2)
                            {
                                PRI_Sl.USL[PRI_CouUsl - 1].Code_Usl = "TM.2";
                            }
                            // Телемедицина консилиум
                            else if (_TMK == 3)
                            {
                                PRI_Sl.USL[PRI_CouUsl - 1].Code_Usl = "TM.3";
                            }
                            else
                            {
                                PRI_ErrorToExcel.PROP_ErrorCod  = "47";
                                PRI_ErrorToExcel.PROP_ErrorName = $"(вну) Неизвестный код телемедицины TMK:{_TMK}";
                                PRI_ErrorToExcel.MET_SaveError();
                                PRI_ErrorRow = true;
                                return;
                            }

                            var _Sv = PRI_StrahStacSv.FirstOrDefault(e => e.Flag == 12 && e.CODE_USL == PRI_Sl.USL[PRI_CouUsl - 1].Code_Usl &&
                                                                     PRI_StrahReestr.ARR_DATE >= e.DateN && PRI_StrahReestr.ARR_DATE <= e.DateK);

                            // Тарифы
                            PRI_StrahReestr.SUM_LPU = _Sv.Tarif;
                            PRI_StrahReestr.TARIF   = PRI_StrahReestr.SUM_LPU;

                            // Вид помощи 14
                            PRI_StrahReestr.VIDPOM = _Sv.VidPom;

                            // Цель посещения для телемедицины (Справочник V025: 2.6 - Посещение по другим обстоятельствам)
                            PRI_Sl.P_Cel = "2.6";

                            // Проверка на нахождения тарифа
                            if (PRI_StrahReestr.TARIF == null)
                            {
                                PRI_ErrorToExcel.PROP_ErrorCod  = "47";
                                PRI_ErrorToExcel.PROP_ErrorName = "(вну) Не найден тариф";
                                PRI_ErrorToExcel.MET_SaveError();
                                PRI_ErrorRow = true;
                                return;
                            }

                            // Пациент НЕ может быть направлен от нас, только с другого ЛПУ
                            if (PRI_Sl.NPR_MO == 555509)
                            {
                                PRI_ErrorToExcel.PROP_ErrorCod  = "46";
                                PRI_ErrorToExcel.PROP_ErrorName = "(вну) В телемедицине ЛПУ направления NPR_MO не может быть наша (555509)";
                                PRI_ErrorToExcel.MET_SaveError();
                                PRI_ErrorRow = true;
                                return;
                            }
                        }
                    }
                }

                PRI_StrahReestr.CODE_USL = PRI_Sl.USL[PRI_CouUsl - 1].Code_Usl;
                PRI_StrahReestr.VID_VME  = PRI_Sl.USL[PRI_CouUsl - 1].Usl;

                try
                {
                    PRI_StrahReestr.NOM_USL = JsonConvert.SerializeObject(PRI_Sl,
                                                                          Formatting.Indented,
                                                                          new JsonSerializerSettings {
                        DefaultValueHandling = DefaultValueHandling.Ignore
                    });
                }
                catch (Exception)
                {
                    PRI_StrahReestr.NOM_USL = "Ошибка json";
                }
            }
            MET_CalcAll();
        }