public static void ClearColorMakers(IBackgroundContext context, LpuExecParams executorParams)
        {
            context.ProgressSeparator();
            context.ReportProgress(@"УДАЛЕНИЕ МАРКЕРОВ НЕДЕЙСТВИТЕЛЬНЫХ ПОЛИСОВ");
            context.ProgressSeparator();
            using (var dataContext = new VistaMedDataContext(context))
            {
                var invMarkerType = getInvMarkerType(dataContext);

                if(invMarkerType != null)
                {
                    context.ReportProgress(@"");
                    try
                    {
                        dataContext.VistaMed.ExecuteCommand(@"DELETE FROM Client_StatusObservation WHERE statusObservationType_id IS NULL");
                        dataContext.VistaMed.ExecuteCommand(@"DELETE FROM Client_StatusObservation WHERE statusObservationType_id = {0}", invMarkerType.Id);
                        dataContext.VistaMed.SubmitChanges();
                        context.ReportProgress(@"Удаление маркеров проведено");

                    }
                    catch (Exception exception)
                    {
                        context.ReportError(@"{0}", exception.Message);
                    }
                }
                else
                {
                    //context.ReportError(@"Тип маркера недействительного полиса не найден в БД ВистаМед");
                }
            }
            context.ProgressSeparator('-');
        }
Пример #2
0
        public static void CheckPersonal(IBackgroundContext context, DateParams checkPersonalParams)
        {
            if (context.CancellationPending) return;

            var onDate = checkPersonalParams.DateEnd.Date;

            context.ProgressSeparator();
            context.ReportProgress(@"ПРОВЕРКА СПРАВОЧНИКА СОТРУДНИКОВ ВистаМед на {0}", onDate.ToShortDateString());
            context.ReportProgress("");
            using (var dataContext = new PersonalCheckDataContext(context))
            {
                var dir = Properties.Settings.Default.DataDir;
                dataContext.Load(context, dir);

                var vistaPersonal =
                    (from p in dataContext.VistaMed.People
                     where p.RetireDate == null && p.RbSpeciality != null
                         && p.FederalCode != "000-000-000" select p).ToList();

                var notFoundPers =
                    (from p in vistaPersonal where !dataContext.DoctorList.Any(x => x.SNILS == p.FederalCode) select p);

                notFoundPers.ToList().ForEach(x => context.ReportError(@"сотрудник {0} не найден в списке ФРМР", x.ToLongString()));

                var nonCertPers = (from p in vistaPersonal
                                   from d in dataContext.DoctorList
                                   where  d.SNILS == p.FederalCode && !d.SpecCodes.Contains(p.RbSpeciality.FederalCode)
                                   select new {p, d});

                nonCertPers.ToList().ForEach(x => context.ReportError(@"сотрудник {0} не сертиф.по спец.""{1}"" (но имеет по ФРМР серт. {2})",
                    x.p.ToLongString(), x.p.RbSpeciality.FederalCode + " " + x.p.RbSpeciality.Name, x.d.CertNames));

                var expiredCert = (from p in vistaPersonal
                                   from d in dataContext.DoctorList
                                   from c in d.LastCertificates()
                                   where d.SNILS == p.FederalCode && p.RbSpeciality.FederalCode == c.SPEC_CODE
                                   && (onDate < c.CERT_DATE || onDate > c.CERT_DATE.AddYears(5))
                                   select new { p, c });

                expiredCert.ToList().ForEach(x => context.ReportError(@"сотрудник {0} имеет просроченный сертификат ""{1}""",
                    x.p.ToLongString(), x.c.ToString()));
            }
            context.ProgressSeparator('-');
        }
Пример #3
0
        public static void ExportLog(IBackgroundContext context, ExportLogParams args)
        {
            var logLines = args.LogText;
            if (logLines.Length == 0)
                context.ReportError(@"Протокол пуст");
            else
            {
                var word = new Application();
                word.Visible = true;
                var templateName = Utils.GetReportFileName(@"Log.doc");
                if (File.Exists(templateName))
                {
                    var newDoc = word.Documents.Add(templateName);
                    var table = newDoc.Tables[1];
                    foreach (var logLine in logLines.Where(x => !string.IsNullOrEmpty(x) && x.Length > 8))
                    {
                        var newRow = table.Rows.Add();
                        var recTime = logLine.Substring(0, 8);
                        var recText = logLine.Substring(9);
                        newRow.Cells[1].Range.Text = recTime;
                        newRow.Cells[2].Range.Text = recText;
                        if (recText.StartsWith("*"))
                            newRow.Cells[2].Range.Font.Color = WdColor.wdColorBlue;
                        else if (recText.StartsWith(">>"))
                            newRow.Cells[2].Range.Font.Color = WdColor.wdColorRed;
                        else if (recText.Trim().StartsWith("->") || recText.Trim().StartsWith("> "))
                            newRow.Cells[2].Range.Font.Color = WdColor.wdColorDarkRed;
                        else if (recText.StartsWith("-----"))
                            newRow.Cells[2].Range.Font.Color = WdColor.wdColorGreen;
                        else
                            newRow.Cells[2].Range.Font.Color = WdColor.wdColorAutomatic;
                    }
                }
                else
                {
                    context.ReportError(@"Файл шаблона отчета {0} не найден", templateName);
                }

            }
        }
        /// <summary>
        /// Заполнение формы контроля
        /// </summary>
        /// <param name="context"></param>
        /// <param name="args"></param>
        /// <param name="methodCaption"></param>
        /// <param name="fillAction"></param>
        private static void fillAccountCheckPlan(IBackgroundContext context,
            MonthParams args, string methodCaption,
            Action<PageType, Worksheet, MonthParams> fillAction)
        {
            context.ProgressSeparator();
            context.ReportProgress(methodCaption);
            context.ProgressSeparator();

            string templateName = Path.Combine(Path.GetFullPath(@".\"),
                string.Format(@"AccountCheckPlan{0}.xls", args.DateEnd.Year));

            if (File.Exists(templateName))
            {
                var excel = new Application();
                excel.Visible = true;
                Workbook newDoc = excel.Workbooks.Add(templateName);
                newDoc.Names.Item(@"Период").RefersToRange.Value2 = Utils.GetPeriodName(args.DateBegin, args.DateEnd);
                newDoc.Names.Item(@"КоличествоМесяцев").RefersToRange.Value2 = args.DateEnd.Month;
                excel.ScreenUpdating = false;
                using (var dataContext = new VistaMedDataContext(context))
                {
                    dataContext.VistaMed.Connection.Open();

                    try
                    {
                        List<PageType> pageTypes = (new PageType[]
                            {
                                new Polyclinic(context, dataContext),
                                new Stacionar(context, dataContext),
                                new Ambulance(context, dataContext)
                            }).ToList();

                        foreach (Worksheet ws in newDoc.Worksheets.Cast<Worksheet>())
                        {
                            pageTypes.ForEach(x => fillAction(x, ws, args));
                        }

                    }
                    finally
                    {
                        dataContext.VistaMed.Connection.Close();
                    }
                }
                excel.ScreenUpdating = true;
            }
            else
                context.ReportError(@"Не найден файл {0}", templateName);

            context.ProgressSeparator('-');
        }
Пример #5
0
        private static void checkDateInOut(IBackgroundContext context, BillsValidatorDataContext dataContext, BillData bill)
        {
            if (context.CancellationPending) return;

            var invalidUsl = (from u in bill.Reestr.USL where u.Kol_Usl == 1
                                 && u.Date_In != u.Date_Out
                                 && !(u.CODE_USL.StartsWith("0100") || u.CODE_USL.StartsWith("1000"))
                                 && !(u.IsFullStationar || u.IsDayStationar) select u).ToList();
            if(invalidUsl.Any())
            {
                context.ReportError(@"Даты начала и окончания услуги не равны при количестве = 1");
                invalidUsl.ForEach(x => context.ReportProgress(@"    -> {0}", x));
            }
        }
Пример #6
0
        private static void checkForCrossPeriods(IBackgroundContext context, BillsValidatorDataContext dataContext, BillData bill)
        {
            if (context.CancellationPending) return;

            var fullStationar = (from u in bill.Reestr.USL where u.IsFullStationar select u).ToList();
            foreach (var usl in fullStationar.TakeWhile(x => !context.CancellationPending))
            {
                var stacUsl = usl;
                var crossUsl = (from c in bill.Reestr.USL
                               where c != stacUsl && c.PacientRow.PersRow == stacUsl.PacientRow.PersRow
                               && (new DateRange(c.Date_In, c.Date_Out)).Intersects(new DateRange(stacUsl.Date_In, stacUsl.Date_Out))
                               select c).ToList();
                crossUsl = crossUsl.Where(x => !x.IsFullStationar).ToList();
                if (crossUsl.Count > 0)
                {
                    context.ReportError(@" Оказание услуг во время нахождения в кругл.стационаре {0}", stacUsl.PacientRow.ToString());
                    context.ReportProgress(@"    Стац. {0}", stacUsl.ToShortString());
                    crossUsl.ForEach(x => context.ReportProgress(@"    -> {0}", x.ToShortString()));
                }
            }
        }
Пример #7
0
        public static void BuildSvedReport(IBackgroundContext context, MonthAccountParams args)
        {
            var dateBegin = args.DateBegin;
            var dateEnd = args.DateEnd;
            var miacCode = args.LpuCode;
            using (var dataConext = new VistaMedDataContext(context))
            {
                var smpBills = (from b in dataConext.VistaMed.Accounts
                                where b.Date >= args.DateBegin.AddDays(15) && b.Date < args.NextMonthBegin.AddDays(15)
                                && b.Contract != null && b.Contract.RbFinance != null
                                && b.Contract.RbFinance.Name.ToLower() == "омс"
                                    && (from a in b.AccountItems
                                        from s in dataConext.VistaMed.RbServices
                                        where a.ServiceId == s.Id
                                        && s.Code.StartsWith("162")
                                        select a).Any()
                                select b).ToList();

                smpBills = smpBills.Where(x => x.AccountType == AccountType.Osm18).ToList();
                smpBills = smpBills.Where(x => args.IsValidAccountNumber(x.Number)).ToList();

                if (smpBills.Count == 0)
                    context.ReportError(@"Счета ДД за период с {0} по {1} не найдены", dateBegin, dateEnd);
                else
                {
                    var templateName = Utils.GetReportFileName(@"SvodSpravOsm18.xls");
                    if (File.Exists(templateName))
                    {
                        var excel = new Application();
                        excel.Visible = true;

                        foreach (var smpBill in smpBills)
                        {
                            var newDoc = excel.Workbooks.Add(templateName);
                            excel.ScreenUpdating = false;

                            var ws = ((Worksheet)newDoc.Worksheets[1]);
                            newDoc.Names.Item(@"ОтчетныйПериод").RefersToRange.Value2 =
                                Utils.GetPeriodName(smpBill.SettleDate.BeginOfMonth(), smpBill.SettleDate);

                            var lpu = dataConext.VistaMed.Organisations.FirstOrDefault(x => x.MiacCode == miacCode);
                            if (lpu != null)
                            {
                                newDoc.Names.Item("ЛПУ").RefersToRange.Value2 = lpu.FullName;
                                newDoc.Names.Item("ФИОРуководителя").RefersToRange.Value2 = lpu.Chief;
                                newDoc.Names.Item("ФИОГлавбуха").RefersToRange.Value2 = lpu.Accountant;
                            }

                            var smo =
                                (from payer in dataConext.VistaMed.Organisations
                                 where payer.Id == smpBill.PayerId
                                 select payer).FirstOrDefault();
                            if (smo != null)
                            {
                                newDoc.Names.Item("СМО").RefersToRange.Value2 = smo.FullName;
                            }

                            ReportData colData;

                            var eventList = (from a in smpBill.AccountItems
                                             where !a.Deleted && a.Event != null && a.Event.RbResult != null && a.Action != null && a.Action.ActionType != null
                                             group a by a.Event into e
                                             select e).ToList();

                            var profActionCodes = new[] { "162043", "162044", "162045", "162046", "162002",
                            "162003", "162005", "162006", "162007", "162008", "162009", "162010" };

                            var predActionCodes = new[] { "162040", "162041", "162042" };

                            var txtFileName = Utils.GetOptionsFileName(@"SvedOsm18Services.txt");
                            if (File.Exists(txtFileName))
                            {
                                var allLines = File.ReadAllLines(txtFileName, Encoding.GetEncoding(1251));
                                foreach (var currLine in allLines)
                                {
                                    if (currLine.StartsWith(@"Профилактика"))
                                    {
                                        var lines2 = currLine.Split('=');
                                        profActionCodes = lines2[1].Split(',');
                                    }
                                    if (currLine.StartsWith(@"Предварительные"))
                                    {
                                        var lines2 = currLine.Split('=');
                                        predActionCodes = lines2[1].Split(',');
                                    }
                                }
                            }

                            var profList = (from e in eventList
                                            where e.Any(a => profActionCodes.Any(x => a.Action.ActionType.Code == x))
                                            select e).ToList();

                            var predList = (from e in eventList
                                            where e.Any(a => predActionCodes.Any(x => a.Action.ActionType.Code == x))
                                            select e).ToList();

                            var periodList = eventList.Except(profList).Except(predList).ToList();

                            colData = new ReportData();
                            colData.Prof = profList.Count;
                            colData.Pred = predList.Count;
                            colData.Period = periodList.Count;

                            fillColumn(ws, colData, 2);

                            colData = new ReportData();
                            colData.Prof = (from e in profList from a in e select a).Sum(x => x.Sum);
                            colData.Pred = (from e in predList from a in e select a).Sum(x => x.Sum);
                            colData.Period = (from e in periodList from a in e select a).Sum(x => x.Sum);

                            fillColumn(ws, colData, 3);

                            excel.ScreenUpdating = true;
                            ws.Activate();

                        }
                    }
                }
            }
            context.ProgressSeparator('-');
        }
Пример #8
0
        public static void Build(IBackgroundContext context, DdActionListParams args)
        {
            using (var dataConext = new VistaMedDataContext(context))
            {
                var dateField = args.SelectByEventDate ? "e.execDate" : "a.endDate";

                var sqlInAccount = "";
                if (args.InAccount ^ args.NotInAccount)
                {
                    sqlInAccount = @"EXISTS(SELECT ai.id FROM Account_Item ai WHERE ai.deleted = 0 AND ai.action_id = a.id)";
                    if (args.NotInAccount)
                        sqlInAccount = "NOT " + sqlInAccount;
                    sqlInAccount = "AND " + sqlInAccount;
                }

                string gerderFilter = "1=1";
                if (args.IsMan ^ args.IsWoman)
                {
                    if (args.IsMan)
                        gerderFilter = "c.Sex = 1";
                    if (args.IsWoman)
                        gerderFilter = "c.Sex = 2";
                }

                var sqlText = string.Format(@"SELECT
                    CONCAT(c.lastName, ' ', c.firstName, ' ', c.patrName) AS ClientFio,
                    c.birthDate AS ClientBirthDate,
                    a.MKB AS Mkb,
                    a.endDate AS ActionDate,
                    aty.code AS ActionCode,
                    aty.name AS ActionName,
                    CONCAT(p.lastName, ' ', p.firstName, ' ', p.patrName) AS PersonFio,
                    p.code AS PersonCode,
                    et.code AS EventCode,
                    et.name AS EventName,
                    CONCAT_WS(' ', pc.lastName, pc.firstName, pc.patrName) AS OperFio
                    FROM Event e
                    JOIN Client c ON c.id = e.client_id
                    JOIN EventType et ON et.id = e.eventType_id AND et.deleted = 0 AND e.deleted = 0
                    JOIN Action a ON a.event_id = e.id AND a.deleted = 0
                    JOIN ActionType aty ON aty.id = a.actionType_id AND aty.deleted = 0
                    LEFT OUTER JOIN Person p ON p.id = a.person_id AND p.deleted = 0
                    LEFT OUTER JOIN rbSpeciality spec ON spec.id = p.speciality_id
                    LEFT OUTER JOIN Person pc ON pc.id = a.createPerson_id AND pc.deleted = 0
                    WHERE {7} >= '{0}' AND {7} < '{1}' {2} {3} {4} {5} {6} {8} {9} {10} {11}
                    AND {12} {13}
                    ORDER BY 1",
                               args.DateBegin.SqlStr(),
                               args.DateEnd.AddDays(1).SqlStr(),
                               dataConext.VistaMed.GetMaskSql("aty.code", args.ActionCodes),
                               dataConext.VistaMed.GetMaskSql("aty.name", args.ActionNames),
                               dataConext.VistaMed.GetMaskSql("et.code", args.EventCodes),
                               dataConext.VistaMed.GetMaskSql("et.name", args.EventNames),
                               dataConext.VistaMed.GetMaskSql("CONCAT(p.lastName, ' ', p.firstName, ' ', p.patrName)", args.ExecPersonFio),
                               dateField,
                               sqlInAccount,
                               dataConext.VistaMed.GetMaskSql("spec.federalCode", args.SpecCodes),
                               dataConext.VistaMed.GetMaskSql("spec.name", args.SpecNames),
                               dataConext.VistaMed.GetMaskSql("a.MKB", args.MkbCodes),
                               gerderFilter,
                               (string.IsNullOrEmpty(args.CreatorName) ? "" :
                               "AND CONCAT_WS(' ', pc.lastName, pc.firstName, pc.patrName) LIKE '" + args.CreatorName + "%'")
                               );

                var sourceData = dataConext.VistaMed.SelectSqlData<SourceData>(sqlText);

                if (sourceData.Count == 0)
                    context.ReportError(@"Даные за период с {0} по {1} не найдены", args.DateBegin, args.DateEnd);
                else
                {
                    var templateName = Utils.GetReportFileName(@"DdActionList.xls");
                    if (File.Exists(templateName))
                    {
                        var excel = new Application();
                        excel.Visible = true;

                        var newDoc = excel.Workbooks.Add(templateName);
                        excel.ScreenUpdating = false;

                        var ws = ((Worksheet)newDoc.Worksheets[1]);
                        newDoc.Names.Item(@"Период").RefersToRange.Value2 = Utils.GetPeriodName(args.DateBegin, args.DateEnd);

                        var lpu = dataConext.VistaMed.Organisations.FirstOrDefault(x => x.MiacCode == Properties.Settings.Default.LpuMiacCode);
                        if (lpu != null)
                        {
                            newDoc.Names.Item("ЛПУ").RefersToRange.Value2 = lpu.FullName;
                        }

                        var rowIndex = 6;
                        var npp = 1;
                        foreach (var data in sourceData)
                        {
                            var row = (Range) ws.Rows[rowIndex];
                            var colIndex = 1;
                            ((Range)row.Cells[1, colIndex++]).Value2 = npp;
                            ((Range)row.Cells[1, colIndex++]).Value2 = data.ClientFio;
                            ((Range)row.Cells[1, colIndex++]).Value2 = data.ClientBirthDate;
                            ((Range)row.Cells[1, colIndex++]).Value2 = data.Mkb;
                            ((Range)row.Cells[1, colIndex++]).Value2 = data.ActionDate;
                            ((Range)row.Cells[1, colIndex++]).Value2 = string.Concat(data.ActionCode , " " , data.ActionName);
                            ((Range)row.Cells[1, colIndex++]).Value2 = string.Concat(data.PersonFio, " (", data.PersonCode, ")");
                            ((Range)row.Cells[1, colIndex++]).Value2 = data.EventName;
                            ((Range)row.Cells[1, colIndex++]).Value2 = data.OperFio;
                            rowIndex++;
                            npp++;
                        }

                        excel.ScreenUpdating = true;
                        ws.Activate();
                    }
                }
            }
            context.ProgressSeparator('-');
        }
Пример #9
0
        private static void verifyStationarBedProfile(IBackgroundContext context, 
            List<Event> allEvents, 
            VistaMedDataContext dataContext, ActionType moveActType,
            ActionPropertyType bedPropType, string eventKindName)
        {
            var eventTypes = from c in dataContext.VistaMed.EventTypes
                             where c.RbMedicalAidType != null
                                   && c.RbMedicalAidType.Name == eventKindName
                             select c;

            var stationarEvents = from e in allEvents
                                  where eventTypes.Contains(e.EventType)
                                  select e;

            // мероприятия "Движение"
            var moveActions = from e in stationarEvents
                              from c in e.Actions
                              where !c.Deleted && c.ActionType == moveActType
                              select new {Event = e, Action = c};

            // выборка свойств "койка"
            var actProp = from c in moveActions
                          from p in c.Action.ActionProperties
                          where p.ActionPropertyType == bedPropType && !p.Deleted
                          select new { Event = c.Event, Action = c.Action, BedProp = p };

            // выборка значений "койка"
            var actBed = (from c in actProp
                          join bedTypedProp in dataContext.VistaMed.ActionPropertyHospitalBeds on c.BedProp.Id equals bedTypedProp.Id
                          select new { c.Event, c.Action, Bed = bedTypedProp.OrgStructureHospitalBed }).ToList();

            Func<RbHospitalBedProfile, bool> comparator;
            if(eventKindName.Contains("Дневной"))
                comparator = x => x.Name.Contains(" ДС");
            else
                comparator = x => !x.Name.Contains(" ДС");

            var wrongBeds = from c in actBed
                           where c.Bed.RbHospitalBedProfile != null && !comparator(c.Bed.RbHospitalBedProfile)
                           select c;

            var errors = new List<string>();

            foreach (var wrongBed in wrongBeds)
            {
                errors.Add(string.Format(@"{0}. Неверный тип койки {1}", wrongBed.Event,
                    wrongBed.Bed.RbHospitalBedProfile.Name));
            }

            if (errors.Count > 0)
            {
                context.ReportError(@"""{0}""", eventKindName);
                errors.ForEach(x => context.ReportProgress(@"    -> {0}", x));
            }
        }
Пример #10
0
        private static void analyzeErrorsDataSet(IBackgroundContext context, ErrorsAnalyzerDataContext dataContext, SmoErrorDataSet errorDataSet)
        {
            context.ProgressSeparator();
            context.ReportProgress("РЕВЬЮ {0}", errorDataSet.FileName);

            var bill =
                dataContext.Bills.FirstOrDefault(
                    x => x.LFileName == errorDataSet.SourceFileName || x.HFileName == errorDataSet.SourceFileName);

            if (bill == null)
            {
                context.ReportProgress(@"Не найден файл счета {0}", errorDataSet.SourceFileName);
                return;
            }

            if (errorDataSet.PR.Rows.Count == 0)
            {
                context.ReportProgress(@"Ошибки не обнаружены", errorDataSet.FileName);
                return;
            }

            if (errorDataSet.SourceFileName.StartsWith("L"))
            {
                /* ошибки по списку персон */
                foreach (var prRow in errorDataSet.PR)
                {
                    context.ReportError(@"{0}", prRow);
                    if(prRow.N_ZAP != "")
                    {
                        var pers = bill.Persons.PERS.FirstOrDefault(x => x.ID_PAC == prRow.N_ZAP);
                        if(pers != null)
                            context.ReportProgress(@"    -> {0}", pers);
                    }
                }
            }
            else
            {
                /* ошибки по услугам */
                foreach (var prRow in errorDataSet.PR)
                {
                    context.ReportError(@"{0}", prRow);

                    if(prRow.OSHIB == "904")
                    {
                        var doc =
                            dataContext.DoctorList.FirstOrDefault(
                                x => x.SNILS == prRow.COMMENT.Substring(prRow.COMMENT.Length - 11));
                        if(doc != null)
                            context.ReportProgress(@"    Доктор {0}", doc.ToString());
                    }

                    if (prRow.N_ZAP != "")
                    {
                        var zap = bill.Reestr.ZAP.FirstOrDefault(x => x.N_ZAP == prRow.N_ZAP);
                        if (zap != null)
                        {
                            foreach (var sluchRow in zap.GetSLUCHRows())
                            {
                                context.ReportProgress(@"    -> {0}", sluchRow.ToString());
                            }
                        }
                    }
                }
            }
        }
Пример #11
0
        private static void assignBillNumbers(IBackgroundContext context, VistaMedDataContext dataContext,
            List<AccountData> billData)
        {
            if (billData.Any())
            {
                var fileName = Path.GetFullPath(Settings.Default.BillsListFileName);
                var excel = new Application();
                excel.Visible = true;
                var wb = excel.Workbooks.Open(fileName);
                try
                {
                    var groupKey = "";
                    var billIndexInGroup = 1;
                    foreach (var bill in billData)
                    {
                        if (groupKey != bill.Name)
                        {
                            groupKey = bill.Name;
                            billIndexInGroup = 1;
                        }
                        var billKey = bill.Name + " " + billIndexInGroup;

                        var year = bill.BillDate.ToString("yyyy");
                        var ws = wb.Worksheets.Cast<Worksheet>().FirstOrDefault(x => x.Name == year);
                        if (ws != null)
                        {

                            Range keyColumnRange = ws.UsedRange.Columns[6];
                            Range foundCell = keyColumnRange.Find(billKey);
                            if (foundCell == null)
                            {
                                int lastNum = 0;
                                Range numColumn = ws.UsedRange.Columns[1];
                                for (int i = numColumn.Cells.Count; i >=1 ; i--)
                                {
                                    var numCell = numColumn.Cells[i, 1];
                                    var numVal = numCell.Value2;
                                    if (numVal != null)
                                       if ( int.TryParse(numVal.ToString(), out lastNum))
                                           break;
                                }
                                lastNum++;

                                var newRowIndex = ws.UsedRange.Rows.Count + 1;
                                var colIndex = 1;
                                ws.Cells.SetCellValue(newRowIndex, colIndex++, lastNum);
                                ws.Cells.SetCellValue(newRowIndex, colIndex++, bill.CreateDate);
                                ws.Cells.SetCellValue(newRowIndex, colIndex++, bill.Name
                                    + (billIndexInGroup == 1 ? "" : " #" + billIndexInGroup));
                                ws.Cells.SetCellValue(newRowIndex, colIndex++, bill.Amount);
                                ws.Cells.SetCellValue(newRowIndex, colIndex++, bill.Summa);
                                ws.Cells.SetCellValue(newRowIndex, colIndex++, billKey);

                                dataContext.VistaMed.ExecuteSql(
                                    string.Format(@"UPDATE Account SET number = '{0}' WHERE id = {1}",
                                    lastNum, bill.Id));
                            }

                        }
                        else
                            context.ReportError(@"Не найден лист {0}", year);

                        billIndexInGroup++;
                    }
                    wb.Save();
                }
                finally
                {
                    dataContext.VistaMed.SubmitChanges();
                    excel.Quit();
                }
            }
            else
            {
                context.ReportError(@"Счета не найдены");
            }
        }
Пример #12
0
        private static void verifyContracts(IBackgroundContext context, PrevalidatorParams prevalidatorParams, VistaMedDataContext dataContext)
        {
            if (context.CancellationPending) return;

            var errors = (from a in dataContext.VistaMed.Actions
                          let e = a.Event
                          where e.ExecDate != null && e.Contract != null
                                && e.ExecDate >= prevalidatorParams.DateBegin
                                && e.ExecDate <= prevalidatorParams.DateEnd
                                && !dataContext.VistaMed.AccountItems.Any(x => x.EventId == e.Id)
                                && a.Contract != null && a.Contract != e.Contract
                          select new {Event = e, Action = a}).ToList();

            var invalidGroups = (from s in errors group s by s.Event into g select g).ToList();
            if (invalidGroups.Any())
            {
                context.ReportError(@"Несовпадение договора в талоне и услугах");
                foreach (var invalidGroup in invalidGroups)
                {
                    context.ReportProgress(@"    > {0}", invalidGroup.Key);
                    context.ReportProgress(@"    > договор события {0}",
                                           invalidGroup.Key.Contract.GetFullName(dataContext.VistaMed));

                    foreach (var action in invalidGroup.Select(x => x.Action))
                    {
                        var actionStr = (action.ActionType == null ? "" : action.ActionType.Code);
                        context.ReportProgress(@"    > договор мероприятия {0} {1}",
                                               actionStr, action.Contract.GetFullName(dataContext.VistaMed));
                    }
                }
            }
        }
Пример #13
0
        //private static void verifyNotInBill(IBackgroundContext context, List<Event> allEvents, List<Action> allActions, VistaMedDataContext dataContext)
        //{
        //    var omsEvents = allEvents.Where(x => x.EventType.FinanceId == 2);
        //    if(dataContext.VistaMed.Accounts.Any(x => x.SettleDate == context.))
        //}
        private static void verify1013(IBackgroundContext context, List<Event> allEvents)
        {
            context.ReportProgress(@"*** ПРОВЕРКА ТАЛОНОВ ф025-12/у (с 01/10/2013) ***");

            // лечебно - диагностические ОМС с 01-10-2013
            var ldEvents =
                (from e in allEvents where (e.EventType.Form == "125" || e.EventType.Form == "225")
                     && e.ExecDate >= new DateTime(2013, 10, 1)
                     && e.Contract != null && e.Contract.RbFinance.Name == "ОМС"
                     orderby e.CreatePersonId
                 select e).ToList();

            var errors = new List<string>();

            foreach (var ldEvent in ldEvents)
            {
                errors.Clear();

                var visits = (from v in ldEvent.Visits where !v.Deleted select v).ToList();

                if(visits.Count == 0)
                    errors.Add(@"Обращение не содержит ни одного посещения");

                // проверка посещений
                var visitEmptyMkb = from v in visits where string.IsNullOrEmpty(v.MKB) select v;
                errors.AddRange(visitEmptyMkb.Select(x => string.Format(@"посещение {0} не заполнен МКБ",
                    x.Date.ToShortDateString())));

                var newServiceRegEx = new Regex(@"(1000\d\d)|(0100\d\d)");
                var visitWrongService = from v in visits where v.RbService != null
                                            && newServiceRegEx.IsMatch(v.RbService.Code) select v;
                errors.AddRange(visitWrongService
                    .Select(x => string.Format(@"посещение {0} указана услуга законченного случая (исправьте на старую)",
                        x.Date.ToShortDateString())));

                var lastVisit = visits.OrderBy(x => x.Date).LastOrDefault();
                if (lastVisit != null)
                {
                    var lastVisitDate = lastVisit.Date;
                    var lastDoctors = visits.Where(x => x.Date == lastVisitDate).Select(y => y.PersonId).ToList();
                    if (!lastDoctors.Contains(ldEvent.ExecPersonId.Value))
                    {
                        errors.Add(string.Format(@"посещение {0} указан неверный врач", lastVisit.Date.ToShortDateString()));
                    }
                }

                var visitEmptyFinanceType = from v in visits where v.RbFinance == null  select v;
                errors.AddRange(visitEmptyFinanceType
                    .Select(x => string.Format(@"посещение {0} не указан тип финансирования",
                        x.Date.ToShortDateString())));

                var visitWrongFinanceType = from v in visits where v.RbFinance != null && v.RbFinance.Name != "ОМС" select v;
                errors.AddRange(visitWrongFinanceType
                    .Select(x => string.Format(@"посещение {0} указан неверный тип финансирования {1}",
                        x.Date.ToShortDateString(), x.RbFinance.Name)));

                if(visits.Count > 0)
                {
                    var minVisitDate = (from v in visits select v.Date).Min();
                    var maxVisitDate = (from v in visits select v.Date).Max();

                    if(minVisitDate.Date != ldEvent.SetDate.Date)
                        errors.Add(string.Format(@"дата первого посещения {0} <> даты начала талона {1}",
                            minVisitDate.ToShortDateString(),
                            ldEvent.SetDate.ToShortDateString()));

                    if (maxVisitDate.Date != ldEvent.ExecDate.Value.Date)
                        errors.Add(string.Format(@"дата последнего посещения {0} <> даты закрытия талона {1}",
                            maxVisitDate.ToShortDateString(),
                            ldEvent.ExecDate.Value.ToShortDateString()));
                }

                if (visits.Count > 1)
                {
                    var visitEmptyServiceN = from v in visits where v.RbService == null select v;
                    errors.AddRange(visitEmptyServiceN
                        .Select(x => string.Format(@"более одной явки {0} и не указана услуга (укажите 0102XX)",
                            x.Date.ToShortDateString())));

                    var visitErrCode = from v in visits where v.RbService != null
                                           && !v.RbService.Code.StartsWith("0102")
                                           && !v.RbService.Code.StartsWith("1002") select v;
                    errors.AddRange(visitErrCode
                        .Select(x => string.Format(@"более одной явки {0} и неверная услуга (укажите 0102XX)",
                            x.Date.ToShortDateString())));

                }
                else
                {
                    var visitEmptyService1 = from v in visits where v.RbService != null select v;
                    errors.AddRange(visitEmptyService1
                        .Select(x => string.Format(@"одна явка {0} и указана услуга (не должна)",
                            x.Date.ToShortDateString())));
                }

                var visitInvalidDate1 = from v in visits where v.Date.Date < ldEvent.SetDate.Date select v;
                errors.AddRange(visitInvalidDate1
                    .Select(x => string.Format(@"посещение {0} имеет неверную дату (меньше даты начала талона {1})",
                        x.Date.ToShortDateString(), ldEvent.SetDate.ToShortDateString())));

                var visitInvalidDate2 = from v in visits where v.Date.Date > ldEvent.ExecDate.Value.Date select v;
                errors.AddRange(visitInvalidDate2
                    .Select(x => string.Format(@"посещение {0} имеет неверную дату (больше даты закрытия талона {1})",
                        x.Date.ToShortDateString(), ldEvent.ExecDate.Value.ToShortDateString())));

                var diagList = (from d in ldEvent.Diagnostics where !d.Deleted select d).ToList();

                if(diagList.Count > 0)
                {
                    var diagOsn = (from d in diagList where d.DiagnosisTypeId == 1 select d).ToList();

                    if(diagOsn.Count == 0)
                        errors.Add(@"нет строки основного диагноза");

                    var diagEmptyMkb = (from d in diagList
                                       where string.IsNullOrEmpty(d.Diagnosis.MKB)
                                       select d).ToList();

                    if(diagEmptyMkb.Count > 0)
                        errors.Add(string.Format(@"найдено {0} диагноз(ов) с пустым МКБ", diagEmptyMkb.Count()));

                    var diagEmptyResult = from d in diagList where d.RbDiagnosticResult == null select d;
                    errors.AddRange(diagEmptyResult.Select(x => string.Format(@"диагноз {0} - не заполнен итог лечения",
                        x.Diagnosis.MKB)));
                }
                else
                    errors.Add(@"не введено ни одной строки диагноза");

                var actList = (from a in ldEvent.Actions where !a.Deleted select a).ToList();

                if(actList.Count == 0)
                {
                    errors.Add(string.Format(@"не введено мероприятие (добавьте в талон через F9)"));
                }
                else
                {
                    var theAction = actList[0];
                    if(theAction.ActionType != null)
                    {
                        if(visits.Count > 1)
                        {
                            if(!theAction.ActionType.Name.Contains("приемами"))
                                errors.Add(string.Format(@"неверный код мероприятия {0} для нескольких посещений",
                                    theAction.ActionType.Code));
                        }
                        else
                        {
                            if (theAction.ActionType.Name.Contains("приемами"))
                                errors.Add(string.Format(@"неверный код мероприятия {0} для одного посещения",
                                    theAction.ActionType.Code));
                        }

                        if (string.IsNullOrEmpty(theAction.MKB))
                            errors.Add(string.Format(@"в мероприятии {0} не указан МКБ",
                                theAction.ActionType.Code));

                        if(theAction.Person_PersonId == null)
                            errors.Add(string.Format(@"в мероприятии {0} не указан исполнитель",
                                theAction.ActionType.Code));
                        else if (theAction.Person_PersonId != ldEvent.Person_ExecPersonId)
                            errors.Add(string.Format(@"в мероприятии {0} указан неверный исполнитель",
                                theAction.ActionType.Code));

                        if(!newServiceRegEx.IsMatch(theAction.ActionType.Code))
                            errors.Add(string.Format(@"в мероприятии {0} указана старая услуга (не услуга законченного случая)",
                                theAction.ActionType.Code));

                        if (!theAction.EndDate.HasValue)
                            errors.Add(string.Format(@"в мероприятии {0} не указана дата исполнения",
                                theAction.ActionType.Code));

                        var actionInvalidDate1 = from v in actList
                                                 where v.EndDate.HasValue
                                                 && v.EndDate.Value.Date < ldEvent.SetDate.Date
                                                 && v.ActionType != null
                                                 select v;

                        errors.AddRange(actionInvalidDate1
                            .Select(x => string.Format(@"мероприятие {0} имеет неверную дату исполнения {1} (меньше даты начала талона {2})",
                                x.ActionType.Code,
                                x.EndDate.Value.ToShortDateString(),
                                ldEvent.SetDate.ToShortDateString())));

                        var actionInvalidDate2 = from v in actList
                                                 where v.EndDate.HasValue && ldEvent.ExecDate.HasValue
                                                 && v.EndDate.Value.Date > ldEvent.ExecDate.Value.Date
                                                 && v.ActionType != null
                                                 select v;

                        errors.AddRange(actionInvalidDate2
                            .Select(x => string.Format(@"мероприятие {0} имеет неверную дату исполнения {1} (больше даты закрытия талона {2})",
                                x.ActionType.Code,
                                x.EndDate.Value.ToShortDateString(),
                                ldEvent.ExecDate.Value.ToShortDateString())));

                        if(visits.Count > 1)
                        {
                            var noInterval = from a in actList
                                             where a.EndDate.HasValue && a.BegDate.HasValue
                                                 && a.BegDate.Value.Date > a.EndDate.Value.Date
                                             select a;

                            errors.AddRange(noInterval
                            .Select(x => string.Format(@"мероприятие {0} имеет дату исполнения {1} < даты начала {2} (визитов {3})",
                                x.ActionType.Code,
                                x.EndDate.Value.ToShortDateString(),
                                x.BegDate.Value.ToShortDateString(),
                                visits.Count)));
                        }

                        if (visits.Count == 1)
                        {
                            var noInterval = from a in actList
                                             where a.EndDate.HasValue && a.BegDate.HasValue
                                                 && a.BegDate.Value.Date != a.EndDate.Value.Date
                                             select a;

                            errors.AddRange(noInterval
                            .Select(x => string.Format(@"мероприятие {0} имеет дату исполнения {1} <> даты начала {2} (визитов {3})",
                                x.ActionType.Code,
                                x.EndDate.Value.ToShortDateString(),
                                x.BegDate.Value.ToShortDateString(),
                                visits.Count)));
                        }
                    }
                }

                if (errors.Count > 0)
                {
                    context.ReportError(@" {0} {1}", ldEvent.EventType.Name, ldEvent);
                    context.ReportProgress(@"  -> ввел талон: {0}", ldEvent.Person_CreatePersonId);
                    errors.ForEach(x => context.ReportProgress(@"    -> {0}", x));
                }
            }
        }
Пример #14
0
        private static void verifyViolet(IBackgroundContext context, IList<Event> allEvents)
        {
            var violetEvents = (from e in allEvents where e.Client.ClientStatusObservations.Any(x =>
                                    x.RbStatusObservationClientType != null
                                    && x.RbStatusObservationClientType.Code == ColorMakerManager.InvalidPolicyMarkerCode)
                                  && e.Contract != null
                                  && e.Contract.RbFinance != null
                                  && e.Contract.RbFinance.Name.ToLower() == @"омс"
                            select e).ToList();

            if(violetEvents.Any())
            {
                context.ReportError(@"ТАЛОНЫ РАЗНЕСЕННЫЕ НА НЕДЕЙСТВИТЕЛЬНЫЕ ПОЛИСЫ");
                foreach (var violetEvent in violetEvents)
                {
                    var policy = violetEvent.Client.ClientPolicies.Last();
                    context.ReportProgress(@"  > {0} {1} {2} {3}",
                        violetEvent, policy.BegDate.ToShortDateString(),
            #if NOPERSONALDATA
                        policy.Serial.OfChar('N') + " " + policy.Number.OfChar('N'),
            #else
                        policy.Serial + " " + policy.Number,
            #endif
                        violetEvent.Person_CreatePersonId.ToLongString());
                }
            }
        }
Пример #15
0
        private static void verifyStationarPeriods(IBackgroundContext context, List<Event> allEvents, VistaMedDataContext dataContext, ActionType moveActType)
        {
            var stationarEvents = from e in allEvents
                                  where e.EventType.RbMedicalAidType != null
                                  && e.EventType.RbMedicalAidType.Name != null
                                  && e.EventType.RbMedicalAidType.Name.ToLower().Contains("стационар")
                                  && !e.EventType.RbMedicalAidType.Name.ToLower().Contains("дневной")
                                  select e;

            var moveActions = from e in stationarEvents
                              from c in e.Actions
                              where !c.Deleted && c.ActionType == moveActType
                              select c;

            var errors = new List<string>();

            foreach (var moveAction in moveActions.TakeWhile(x => !context.CancellationPending))
            {
                var dateRange = new DateRange(moveAction.BegDate, moveAction.EndDate);

                var client = moveAction.Event.Client;
                var clientActions = (from e in allEvents where e.Client == client && e != moveAction.Event select e).ToList();

                var theEvents = (from a in clientActions let dr = new DateRange(a.SetDate, a.ExecDate)
                                   where dr.Intersects(dateRange)
                                   && (dr.EndDate != dateRange.StartDate)
                                   && (dr.EndDate != dateRange.EndDate)
                                   select a).ToList();

                if (theEvents.Any())
                {
                    errors.Add(string.Format(@"СТАЦИОНАР.ТАЛОН '{0}'", moveAction.Event));
                    errors.Add(string.Format(@"  ДВИЖЕНИЕ '{0}'", moveAction));
                    foreach (var theEvent in theEvents)
                    {
                        errors.Add(string.Format(@"    Пересечение периодов '{0}'", theEvent));
                    }
                }
            }

            if (errors.Count > 0 && !context.CancellationPending)
            {
                context.ReportError(@"""{0}""", "ПЕРЕСЕЧЕНИЕ ПЕРИОДОВ");
                errors.ForEach(x => context.ReportProgress(@"    -> {0}", x));
            }
        }
Пример #16
0
        private static void verifyStationarMovePerson(IBackgroundContext context, List<Action> allActions, 
            VistaMedDataContext dataContext, ActionType moveActType)
        {
            var badMoveActions = (from c in allActions
                                  where c.ActionType == moveActType
                                        && c.Person_SetPersonId != c.Event.Person_ExecPersonId
                                  select c).ToList();

            var errors = new List<string>();

            foreach (var badAction in badMoveActions)
            {
                errors.Add(string.Format(@"{0}. Исполнитель в мероприятии ""{1}"" а в талоне ""{2}""", badAction.Event,
                    badAction.Person_PersonId == null ? "не задан" : badAction.Person_PersonId.FIO,
                    badAction.Event.Person_ExecPersonId == null ? "не задан" : badAction.Event.Person_ExecPersonId.FIO));
            }

            if (errors.Count > 0)
            {
                context.ReportError(@"СТАЦИОНАР: МЕРОПРИЯТИЯ ДВИЖЕНИЯ С НЕВЕРНЫМ ИСПОЛНИТЕЛЕМ");
                errors.ForEach(x => context.ReportProgress(@"    -> {0}", x));
            }
        }
Пример #17
0
        private static void verifyStationarLittleStrangerFlag(IBackgroundContext context, List<Event> allEvents, VistaMedDataContext dataContext)
        {
            var littleStrangerEvents = (from e in allEvents where e.LittleStrangerId != null select e).ToList();

            var errorEvents = from e in littleStrangerEvents
                              from d in e.Diagnostics
                              where d.Diagnosis != null && d.Diagnosis.MKB.StartsWith("O")
                              select new { Event = e, Mkb = d.Diagnosis.MKB};

            var errors = new List<string>();

            foreach (var badItem in errorEvents)
            {
                errors.Add(string.Format(@"{0}. Диагноз {1} для новорожденного. Уберите флаг новорожденного в талоне.",
                    badItem.Event, badItem.Mkb));
            }

            if (errors.Count > 0)
            {
                context.ReportError(@"СТАЦИОНАР: Недопустимые диагнозы для новорожденных");
                errors.ForEach(x => context.ReportProgress(@"    -> {0}", x));
            }
        }
Пример #18
0
        public static void BuildSvedReport(IBackgroundContext context, MonthAccountParams args)
        {
            var dateBegin = args.DateBegin;
            var dateEnd = args.DateEnd;
            var miacCode = args.LpuCode;
            using (var dataConext = new VistaMedDataContext(context))
            {
                var smpBills = (from b in dataConext.VistaMed.Accounts
                                where b.Date >= args.DateBegin.AddDays(15) && b.Date < args.NextMonthBegin.AddDays(15)
                                && b.Contract != null && b.Contract.RbFinance != null
                                && b.Contract.RbFinance.Name.ToLower() == "омс"
                                    && (from a in b.AccountItems
                                        from s in dataConext.VistaMed.RbServices
                                        where a.ServiceId == s.Id
                                        && (s.Code.StartsWith("161") || s.Code.StartsWith("162"))
                                        select a).Any()
                                select b).ToList();

                smpBills = smpBills.Where(x => x.AccountType == AccountType.Osm18
                    && args.IsValidAccountNumber(x.Number)
                    && !x.Number.StartsWith(PlanExecution.ReserveAccountName)).ToList();

                if (smpBills.Count == 0)
                    context.ReportError(@"Счета ДД за период с {0} по {1} не найдены", dateBegin, dateEnd);
                else
                {
                    var templateName = Utils.GetReportFileName(@"SvedOsm18.xls");
                    if (File.Exists(templateName))
                    {
                        var excel = new Application();
                        excel.Visible = true;

                        var planDataList = loadPlan(excel);

                        var newDoc = excel.Workbooks.Add(templateName);
                        excel.ScreenUpdating = false;

                        var ws = ((Worksheet)newDoc.Worksheets[1]);
                        newDoc.Names.Item(@"ДатаНачала").RefersToRange.Value2 = dateBegin;
                        newDoc.Names.Item(@"ДатаКонца").RefersToRange.Value2 = dateEnd;
                        newDoc.Names.Item(@"ДатаОтчета").RefersToRange.Value2 = DateTime.Today;
                        newDoc.Names.Item(@"ОтчетныйПериод").RefersToRange.Value2 = Utils.GetPeriodName(dateBegin, dateEnd);

                        var lpu = dataConext.VistaMed.Organisations.FirstOrDefault(x => x.MiacCode == miacCode);
                        if (lpu != null)
                        {
                            newDoc.Names.Item("ЛПУ").RefersToRange.Value2 = lpu.FullName;
                            newDoc.Names.Item("ФИОРуководителя").RefersToRange.Value2 = lpu.Chief;
                            newDoc.Names.Item("ФИОГлавбуха").RefersToRange.Value2 = lpu.Accountant;
                        }

                        ReportData colData;

                        colData = new ReportData();
                        colData.Prof = planDataList.Sum(x => x.Prof);
                        colData.Pred = null;
                        colData.Period = planDataList.Sum(x => x.Period); ;
                        fillColumn(ws, colData, 3);

                        colData = new ReportData();
                        colData.Prof = planDataList.Where(y => y.Month <= dateEnd.Month).Sum(x => x.Prof);
                        colData.Pred = null;
                        colData.Period = planDataList.Where(y => y.Month <= dateEnd.Month).Sum(x => x.Period); ;
                        fillColumn(ws, colData, 4);

                        var eventList = (from b in smpBills
                                         from a in b.AccountItems
                                         where !a.Deleted && a.Event != null && a.Event.RbResult != null && a.Action != null && a.Action.ActionType != null
                                         group a by a.Event into e select e).ToList();

                        var profActionCodes = new[] { "162043", "162044", "162045", "162046", "162002",
                            "162003", "162005", "162006", "162007", "162008", "162009", "162010" };

                        var predActionCodes = new[] { "162040", "162041", "162042" };

                        var perActionsCodes = new[] { "162060", "162061", "162062"};

                        var txtFileName = Utils.GetOptionsFileName(@"SvedOsm18Services.txt");
                        if (File.Exists(txtFileName))
                        {
                            var allLines = File.ReadAllLines(txtFileName, Encoding.GetEncoding(1251));
                            foreach (var currLine in allLines)
                            {
                                if (currLine.StartsWith(@"Профилактика"))
                                {
                                    var lines2 = currLine.Split('=');
                                    profActionCodes = lines2[1].Split(',');
                                }
                                if (currLine.StartsWith(@"Предварительные"))
                                {
                                    var lines2 = currLine.Split('=');
                                    predActionCodes = lines2[1].Split(',');
                                }
                                if (currLine.StartsWith(@"Периодические"))
                                {
                                    var lines2 = currLine.Split('=');
                                    perActionsCodes = lines2[1].Split(',');
                                }
                            }
                        }

                        var profList = (from e in eventList
                            where e.Any(a => profActionCodes.Any(x => a.Action.ActionType.Code == x))
                            select e).ToList();

                        var predList = (from e in eventList
                            where e.Any(a => predActionCodes.Any(x => a.Action.ActionType.Code == x))
                            select e).ToList();

                        var periodList = eventList.Except(profList).Except(predList).ToList();

                        colData = new ReportData();
                        colData.Prof = (from e in profList from a in e select a).Sum(x => x.Sum) / 1000;
                        colData.Pred = (from e in predList from a in e select a).Sum(x => x.Sum) / 1000;
                        colData.Period = (from e in periodList from a in e select a).Sum(x => x.Sum) / 1000;
                        fillColumn(ws, colData, 5);

                        colData = new ReportData();
                        colData.Prof = profList.Count;
                        colData.Pred = predList.Count;
                        colData.Period = periodList.Count;

                        fillColumn(ws, colData, 6);

                        string grName = "";
                        int grColIndex = 0;

                        grColIndex = 15;

                        grName = @" I группа";
                        grZd(profList, grName, predList, ws, grColIndex++);
                        grName = @" II группа";
                        grZd(profList, grName, predList, ws, grColIndex++);
                        grName = @" III группа";
                        grZd(profList, grName, predList, ws, grColIndex++);
                        grName = @" IV группа";
                        grZd(profList, grName, predList, ws, grColIndex++);
                        grName = @" V группа";
                        grZd(profList, grName, predList, ws, grColIndex++);

                        excel.ScreenUpdating = true;
                        ws.Activate();
                    }
                }
            }
            context.ProgressSeparator('-');
        }
        /// <summary>
        /// Провести автоматическую коррекцию реестров (устранить пере(недо)выполнение) по результатам проверки
        /// </summary>
        /// <param name="context"></param>
        /// <param name="args"></param>
        public static void AutoCorrectAccounts(IBackgroundContext context, AccountCorrectParams args)
        {
            context.ProgressSeparator();
            context.ReportProgress(@"АВТОМАТИЧЕСКАЯ КОРРЕКТИРОВКА РЕЕСТРОВ В СООТВЕТСТВИИ С ПЛАНАМИ");
            context.ProgressSeparator();

            // книга планов
            var excelFileName = args.AccountCheckPlanFileName;
            if (File.Exists(excelFileName))
            {
                var excel = new Application();
                excel.Visible = true;

                Workbook newDoc;
                try
                {
                    context.ReportProgress(@"Открываем файл {0} ...", excelFileName);
                    newDoc = excel.Workbooks.Open(excelFileName);
                }
                catch (Exception exception)
                {
                    newDoc = null;
                    context.ReportError(@"Ошибка открытия файла {0} : {1}", excelFileName, exception.Message);
                }

                if (newDoc != null)
                {
                    // ищем имя КоличествоМесяцев
                    var kolMonthExists = false;
                    for (int i = 1; i <= newDoc.Names.Count; i++)
                    {
                        if (newDoc.Names.Item(i).Name == @"КоличествоМесяцев")
                        {
                            kolMonthExists = true;
                            break;
                        }
                    }

                    if (kolMonthExists)
                    {
                        // сравниваем КоличествоМесяцев из книги с отчетным периодом
                        int kolMonth = (int) newDoc.Names.Item(@"КоличествоМесяцев").RefersToRange.Value2;

                        if (args.DateEnd.Month == kolMonth)
                        {
                            excel.ScreenUpdating = false;
                            using (var dataContext = new VistaMedDataContext(context))
                            {
                                dataContext.VistaMed.Connection.Open();

                                // новая транзакция для обеспечения атомарности всех изменений БД для текущего метода
                                dataContext.VistaMed.ActiveTransaction = dataContext.VistaMed.Connection
                                    .BeginTransaction(IsolationLevel.ReadCommitted);

                                try
                                {
                                    // массив с объектами - типами листов книги
                                    List<PageType> pageTypes = (new PageType[]
                                    {
                                        new Polyclinic(context, dataContext),
                                        new Stacionar(context, dataContext),
                                        new Ambulance(context, dataContext)
                                    }).ToList();

                                    // сканируем все листы
                                    foreach (Worksheet ws in newDoc.Worksheets.Cast<Worksheet>())
                                    {
                                        // попытка обработать текущий лист для всех типов листов
                                        // фактическая работа делается в этих объектах
                                        pageTypes.ForEach(x => x.AutoCorrectAccounts(ws, args));
                                    }

                                    try
                                    {
                                        dataContext.VistaMed.ActiveTransaction.Commit();
                                        context.ReportProgress(@"Изменения записаны в БД");
                                    }
                                    catch (Exception exception)
                                    {
                                        dataContext.VistaMed.ActiveTransaction.Rollback();
                                        context.ReportProgress(@"Ошибка записи изменений в БД: {0}", exception.Message);
                                    }
                                }
                                finally
                                {
                                    dataContext.VistaMed.ActiveTransaction.Dispose();
                                    dataContext.VistaMed.ActiveTransaction = null;
                                    dataContext.VistaMed.Connection.Close();
                                }
                            }
                            excel.ScreenUpdating = true;

                        }
                        else
                            context.ReportError(@"КоличествоМесяцев в файле не соответствует выбранному Вами периоду");
                    }
                    else
                        context.ReportError(@"Имя ячейки ""КоличествоМесяцев"" не найдено в файле {0}", excelFileName);

                    newDoc.Close(false);
                }
            }
            else
                context.ReportError(@"Файл {0} не найден", excelFileName);

            context.ProgressSeparator('-');
        }
Пример #20
0
        private static void verifyDispanDd14(IBackgroundContext context, PrevalidatorParams args, 
            IEnumerable<Event> allEvents)
        {
            if (context.CancellationPending) return;

            context.ReportProgress(@"Проверка диспансеризации детей 14 летних");

            if (dsServices == null)
            {
                loadDdServices();
            }

            var eventCodes = new[] { "ДД14лет" };
            var actionComplexPrefix = @"Комплексная услуга на";
            var regExAgeList = new Regex(@"\(.*\)");

            var ddsEvents = from e in allEvents
                            where eventCodes.Contains(e.EventType.Code)
                            select e;

            var errors = new List<string>();
            foreach (var ddsEvent in ddsEvents)
            {
                errors.Clear();
                var actComplex = (from a in ddsEvent.Actions where a.ActionType != null
                                      && a.ActionType.Name.StartsWith(actionComplexPrefix)
                                  select a).ToList();
                Action complexService = null;

                if (!actComplex.Any())
                {
                    errors.Add(string.Format(@"Не найдена ""{0}""", actionComplexPrefix));
                }
                else
                {
                    if (actComplex.Count() > 1)
                        errors.Add(@"Определено более одной комплексной услуги");
                    else
                    {
                        complexService = actComplex.First();

                        var emptyIspoln = (from a in ddsEvent.Actions
                                           where a.ActionType != null && a.Person_PersonId == null
                                           select a).ToList();
                        errors.AddRange(emptyIspoln.Select(action =>
                            string.Format(@"Не задан исполнитель услуги {0}", action.ActionType.Code)));

                        var emptySpec = (from a in ddsEvent.Actions
                                         where
                                             a.ActionType != null && a.Person_PersonId != null &&
                                             a.Person_PersonId.RbSpeciality == null
                                         select a).ToList();
                        errors.AddRange(emptySpec.Select(action =>
                            string.Format(@"Не задана специальность исполнителя услуги {0}", action.ActionType.Code)));

                        if (complexService.Person_PersonId != null && complexService.Person_PersonId.RbSpeciality != null)
                        {

                            var specCode = complexService.Person_PersonId.RbSpeciality.FederalCode;
                            var validSpecCodes = new List<string> { "1134" };

                            if (!validSpecCodes.Contains(specCode))
                                errors.Add(
                                    string.Format(@"Неверная специальность исполнителя комплексной услуги {0} {1}",
                                                  specCode, complexService.Person_PersonId.FIO));

                        }

                        var serviceName = complexService.ActionType.Name;
                        if (ddsEvent.ExecDate.HasValue)
                        {

                            if (regExAgeList.IsMatch(serviceName))
                            {
                                var ddYear = ddsEvent.ExecDate.Value.Year - 14;

                                if (ddsEvent.Client.BirthDate.Year != ddYear)
                                {
                                    errors.Add(string.Format(@"Год рождения пациента {0} не равен {1}",
                                        ddsEvent.Client.BirthDate.Year, ddYear));
                                }
                            }

                            var longServices = from a in ddsEvent.Actions where a.EndDate != a.BegDate select a;
                            errors.AddRange(longServices.Select(longService =>
                                string.Format(@"Услуга {0} имеет дату окончания не равную дате начала",
                                longService.ActionType.Code)));

                            var oldServices = (from a in ddsEvent.Actions where a.BegDate < args.DateBegin select a).ToList();

                            foreach (var oldService in oldServices)
                            {
                                var maxServiceAgeMonth = oldService.ActionType.Code.EndsWith("61021") ? 12 : 1;
                                if (oldService.BegDate != null && oldService.BegDate.Value < ddsEvent.SetDate.AddMonths(-maxServiceAgeMonth))
                                {
                                    errors.Add(string.Format(@"Анализ просрочен {0}", oldService.ActionType.Code));
                                }
                            }

                            var dupActions = (from a in ddsEvent.Actions
                                              group a by a.ActionType
                                                  into g
                                                  where g.Count() > 1
                                                  select g);

                            foreach (var dupAction in dupActions)
                            {
                                errors.Add(string.Format(@"Найдено более одного ({0}) мероприятия с кодом {1}",
                                    dupAction.Count(), dupAction.Key.Code));
                            }

                            /* объемы */
                            var ddrServiceIfo =
                                (from d in dsServices
                                 where d.EventCode == ddsEvent.EventType.Code && d.Gender == ddsEvent.Client.Sex
                                 select d).FirstOrDefault();

                            if (ddrServiceIfo != null)
                            {
                                var ageServices = (from c in ddrServiceIfo.AgeServicesList
                                                   from s in c.ServiceCodes
                                                   where 14 >= c.AgeBegin && 14 <= c.AgeEnd
                                                   select s).Distinct().ToList();

                                if (ageServices.Count > 0)
                                {
                                    var minCount = ageServices.Count;

                                    var effectiveActions = (from a in ddsEvent.Actions
                                                            where ageServices.Contains(a.ActionType.Code)
                                                            select a).ToList();
                                    if (effectiveActions.Count < minCount)
                                    {
                                        var candidates = string.Join(",",
                                            ageServices.Except(effectiveActions.Select(x => x.ActionType.Code)));

                                        errors.Add(string.Format(@"Недостаточный объем услуг {0} из {1}. Можно добавить {2}",
                                            effectiveActions.Count, minCount, candidates));
                                    }

                                    var unavailActions = (from a in ddsEvent.Actions
                                                          where !ageServices.Contains(a.ActionType.Code) && a != complexService
                                                          select a).ToList();
                                    if (unavailActions.Count > 0)
                                    {
                                        errors.Add(string.Format(@"Недопустимые(ое) мероприятия(e) {0} нужно удалить",
                                            string.Join(",", unavailActions.Select(x => x.ActionType.Code))));
                                    }
                                }
                            }

                        }
                    }
                }
                if (errors.Count > 0)
                {
                    context.ReportError(@" {0} {1}", ddsEvent.EventType.Code, ddsEvent);
                    if (complexService != null)
                        context.ReportProgress(@"  > {0}", complexService);
                    errors.ForEach(x => context.ReportProgress(@"    -> {0}", x));
                }
            }
        }
Пример #21
0
        public static void BuildSvedReport(IBackgroundContext context, MonthAccountParams args)
        {
            var dateBegin = args.DateBegin;
            var dateEnd = args.DateEnd;
            var miacCode = args.LpuCode;
            using (var dataConext = new VistaMedDataContext(context))
            {
                var smpBills = (from b in dataConext.VistaMed.Accounts
                                where b.Date >= args.DateBegin.AddDays(15) && b.Date < args.NextMonthBegin.AddDays(15)
                                && b.Contract != null && b.Contract.RbFinance != null
                                && b.Contract.RbFinance.Name.ToLower() == "омс"
                                    && (from a in b.AccountItems
                                        from s in dataConext.VistaMed.RbServices
                                        where a.ServiceId == s.Id
                                        && s.Code.StartsWith("062")
                                        select a).Any()
                                select b).ToList();

                smpBills = smpBills.Where(x => x.AccountType == AccountType.ProfOsm).ToList();
                smpBills = smpBills.Where(x => args.IsValidAccountNumber(x.Number)).ToList();

                if (smpBills.Count == 0)
                    context.ReportError(@"Счета ДД за период с {0} по {1} не найдены", dateBegin, dateEnd);
                else
                {
                    var templateName = Utils.GetReportFileName(@"SvodSpravProf.xls");
                    if (File.Exists(templateName))
                    {
                        var excel = new Application();
                        excel.Visible = true;

                        foreach (var smpBill in smpBills)
                        {
                            var newDoc = excel.Workbooks.Add(templateName);
                            excel.ScreenUpdating = false;

                            var ws = ((Worksheet)newDoc.Worksheets[1]);
                            newDoc.Names.Item(@"ОтчетныйПериод").RefersToRange.Value2 =
                                Utils.GetPeriodName(smpBill.SettleDate.BeginOfMonth(), smpBill.SettleDate);

                            var lpu = dataConext.VistaMed.Organisations.FirstOrDefault(x => x.MiacCode == miacCode);
                            if (lpu != null)
                            {
                                newDoc.Names.Item("ЛПУ").RefersToRange.Value2 = lpu.FullName;
                                newDoc.Names.Item("ФИОРуководителя").RefersToRange.Value2 = lpu.Chief;
                                newDoc.Names.Item("ФИОГлавбуха").RefersToRange.Value2 = lpu.Accountant;
                            }

                            var smo =
                                (from payer in dataConext.VistaMed.Organisations
                                 where payer.Id == smpBill.PayerId
                                 select payer).FirstOrDefault();
                            if (smo != null)
                            {
                                newDoc.Names.Item("СМО").RefersToRange.Value2 = smo.FullName;
                            }

                            ReportData colData;

                            var eventList = (from a in smpBill.AccountItems
                                             where !a.Deleted && a.Event != null && a.Event.RbResult != null && a.Action != null && a.Action.ActionType != null
                                             group a by a.Event into e
                                             select e).ToList();

                            colData = new ReportData();
                            colData.Prof = eventList.Count;

                            fillColumn(ws, colData, 2);

                            colData = new ReportData();
                            colData.Prof = (from e in eventList from a in e select a).Sum(x => x.Sum);

                            fillColumn(ws, colData, 3);

                            excel.ScreenUpdating = true;
                            ws.Activate();

                        }
                    }
                }
            }
            context.ProgressSeparator('-');
        }
Пример #22
0
        private static void verifyDispanDdr1(IBackgroundContext context, PrevalidatorParams args, 
            IList<Event> allEvents)
        {
            if (context.CancellationPending) return;

            context.ReportProgress(@"Проверка диспансеризации работающих 2013 (1 этап)");

            if(ddServices == null)
            {
                loadDdServices();
            }

            var eventCodes = new[] {"dd2013_1"};
            const string actionComplexPrefix = @"Комплексная услуга на";
            var regExGender = new Regex(@"(мужчины|женщины)");
            var regExAgeList = new Regex(@"\(.*\)");

            var ddrEvents = from e in allEvents
                            where eventCodes.Contains(e.EventType.Code)
                            select e;

            var errors = new List<string>();

            foreach (var ddrEvent in ddrEvents)
            {
                errors.Clear();

                var actComplex = (from a in ddrEvent.Actions
                                 where a.ActionType != null && a.ActionType.Name.StartsWith(actionComplexPrefix)
                                 select a).ToList();

                var isDdr2014 = ddrEvent.SetDate < new DateTime(2015, 4, 1);

                Action complexService = null;

                if (!actComplex.Any())
                {
                    errors.Add(string.Format(@"Не найдена ""{0}""", actionComplexPrefix));
                }
                else
                {
                    if(actComplex.Count() > 1)
                        errors.Add(@"Определено более одной комплексной услуги");
                    else
                    {
                        complexService = actComplex.FirstOrDefault();

                        var emptyIspoln = (from a in ddrEvent.Actions
                                           where a.ActionType != null && a.Person_PersonId == null
                                           select a).ToList();
                        errors.AddRange(emptyIspoln.Select(action =>
                            string.Format(@"Не задан исполнитель услуги {0}", action.ActionType.Code)));

                        var emptySpec = (from a in ddrEvent.Actions
                                         where
                                             a.ActionType != null && a.Person_PersonId != null &&
                                             a.Person_PersonId.RbSpeciality == null
                                         select a).ToList();
                        errors.AddRange(emptySpec.Select(action =>
                            string.Format(@"Не задана специальность исполнителя услуги {0}", action.ActionType.Code)));

                        var specCode = "???";
                        if (complexService != null)
                        {
                            if (complexService.Person_PersonId != null)
                                specCode = complexService.Person_PersonId.RbSpeciality.FederalCode;
                            var validSpecCodes = new List<string> {"27", "16"};

                            if (!validSpecCodes.Contains(specCode))
                                errors.Add(
                                    string.Format(@"Неверная специальность исполнителя комплексной услуги {0} {1}",
                                        specCode,
                                        (complexService.Person_PersonId == null
                                            ? "???"
                                            : complexService.Person_PersonId.FIO)));
                        }

                        var serviceName = complexService == null ? "" : complexService.ActionType.Name;
                        var isNewComplex = regExGender.IsMatch(serviceName);
                        if(string.IsNullOrEmpty(serviceName) || isNewComplex || ddrEvent.ExecDate < new DateTime(2013, 5, 1))
                        {
                            int gender = ddrEvent.Client.Sex;
                            if (!string.IsNullOrEmpty(serviceName))
                            {
                                if (isNewComplex)
                                {
                                    gender = regExGender.Match(serviceName).Value == @"мужчины" ? 1 : 2;
                                }
                                if (gender > 0 && ddrEvent.Client.Sex != gender)
                                    errors.Add(@"Неверный пол пациента");

                                if (regExAgeList.IsMatch(serviceName))
                                {
                                    var strList = regExAgeList.Match(serviceName).Value;
                                    strList = strList.Replace("для возрастов - ", "");
                                    strList = strList.Replace("для возрастов ", "");
                                    strList = strList.Replace(" лет", "");
                                    strList = strList.Substring(1, strList.Length - 2);
                                    var clientYear = ddrEvent.Client.BirthDate.Year;

                                    if (strList.Contains(","))
                                    {

                                        var ageList = strList.Split(',').Select(x => int.Parse(x.Trim())).ToList();

                                        var yearList = ageList.Select(x => complexService.EndDate != null
                                            ? complexService.EndDate.Value.Year - x
                                            : 0).ToList();

                                        if (!yearList.Contains(clientYear))
                                        {
                                            errors.Add(
                                                string.Format(@"Год рождения пациента {0} не соответствует допустимым"
                                                              + @" годам для услуги {1} - {2}", clientYear,
                                                    complexService.ActionType.Code,
                                                    string.Join(",", yearList.Select(x => x.ToString()))
                                                    ));
                                        }
                                    }
                                    else if (strList.Contains("-"))
                                    {
                                         // 061050 - 061051
                                        strList = strList.Replace(" ", "");
                                        var ageBounds = strList.Split('-').Select(x => int.Parse(x.Trim())).ToList();
                                        for (int i = 0; i < ageBounds.Count; i++)
                                        {
                                            ageBounds[i] = args.DateEnd.Year - ageBounds[i];
                                        }
                                        if (clientYear > ageBounds[0] || clientYear < ageBounds[1])
                                        {
                                            errors.Add(
                                                string.Format(@"Год рождения пациента {0} не соответствует допустимым"
                                                              + @" возрастам для услуги {1} - {2}", clientYear,
                                                    complexService.ActionType.Code,
                                                    "от " + ageBounds[0] + " до " + ageBounds[1]));
                                        }
                                    }
                                }
                            }

                            var longServices = from a in ddrEvent.Actions
                                               where a.EndDate != a.BegDate && a.ActionType.Code.IsInt()
                                               select a;

                            foreach (var longService in longServices)
                            {
                                errors.Add(string.Format(@"Услуга {0} имеет дату окончания не равную дате начала", longService.ActionType.Code));
                            }

                            var oldServices = (from a in ddrEvent.Actions
                                              where a.BegDate < args.DateBegin
                                              select a).ToList();

                            var dupActions = (from a in ddrEvent.Actions group a by a.ActionType
                                                  into g where g.Count() > 1 select g);

                            foreach (var dupAction in dupActions)
                            {
                                errors.Add(string.Format(@"Найдено более одного ({0}) мероприятия с кодом {1}",
                                    dupAction.Count(), dupAction.Key.Code));
                            }

                            /* объемы */
                            var theEvent = ddrEvent;

                            var ddrServiceIfo =
                                (from d in (isDdr2014 ? ddServices2014 : ddServices)
                                 where d.EventCode == theEvent.EventType.Code && d.Gender == gender
                                 select d).FirstOrDefault();

                            if(ddrServiceIfo != null)
                            {
                                if (theEvent.ExecDate != null)
                                {
                                    var age = theEvent.ExecDate.Value.Year - ddrEvent.Client.BirthDate.Year;
                                    var ageSrv = ddrServiceIfo.AgeServicesList.FirstOrDefault(x => x.Age == age);
                                    if(ageSrv != null)
                                    {
                                        var minCount = ageSrv.ServiceCodes.Count * 0.85;

                                        if ((int)minCount < minCount)
                                            minCount = ((int)minCount) + 1;

                                        if (ageSrv.MinServicesCount > 0)
                                            minCount = ageSrv.MinServicesCount;

                                        var effectiveActions = (from a in ddrEvent.Actions
                                                                where ageSrv.ServiceCodes.Contains(a.ActionType.Code)
                                                                select a).ToList();

                                        if(effectiveActions.Count < minCount)
                                        {
                                            var candidates = string.Join(",",
                                                                         ageSrv.ServiceCodes.Except(
                                                                             effectiveActions.Select(x => x.ActionType.Code)));

                                            errors.Add(string.Format(@"Недостаточный объем услуг {0} из {1}. Можно добавить {2}",
                                                                     effectiveActions.Count, minCount, candidates));
                                        }

                                        var unavailActions = (from a in ddrEvent.Actions
                                                              where !ageSrv.ServiceCodes.Contains(a.ActionType.Code)
                                                                    && !(!a.ActionType.Code.IsInt() || a == complexService)
                                                              select a).ToList();
                                        if(unavailActions.Count > 0)
                                        {
                                            errors.Add(string.Format(@"Недопустимые(ое) мероприятия(e) {0} нужно удалить",
                                                                     string.Join(",", unavailActions.Select(x => x.ActionType.Code))));
                                        }
                                    }
                                }
                            }

                        }
                        else
                            errors.Add(string.Format(@"Комплексная услуга {0} более не используется", complexService.ActionType.Code));
                    }
                }

                var reexRes = new Regex(@"(рисвоена|пределена) .* гр.*здоровья");
                if(ddrEvent.RbResult == null)
                    errors.Add("Не определен результат обращения");
                else if(!reexRes.IsMatch(ddrEvent.RbResult.Name))
                    errors.Add("Недопустимый результат обращения (в результате нет группы здоровья)");

                if(errors.Count>0)
                {
                    context.ReportError(@" dd2013 {0}", ddrEvent);
                    if(complexService != null)
                        context.ReportProgress(@"  > {0}", complexService);
                    errors.ForEach(x => context.ReportProgress(@"    -> {0}", x));
                }
            }
        }
Пример #23
0
        public static void BuildSvedProf(IBackgroundContext context, MonthAccountParams args)
        {
            var dateBegin = args.DateBegin;
            var dateEnd = args.DateEnd;
            var miacCode = args.LpuCode;
            using (var dataConext = new VistaMedDataContext(context))
            {
                var smpBills = (from b in dataConext.VistaMed.Accounts
                                where b.Date >= args.DateBegin.AddDays(15) && b.Date < args.NextMonthBegin.AddDays(15)
                                && b.Contract != null && b.Contract.RbFinance != null
                                && b.Contract.RbFinance.Name.ToLower() == "омс"
                                    && (from a in b.AccountItems
                                        from s in dataConext.VistaMed.RbServices
                                        where a.ServiceId == s.Id
                                        && s.Code.StartsWith("062")
                                        select a).Any()
                                select b).ToList();

                smpBills = smpBills.Where(x => args.IsValidAccountNumber(x.Number)
                    && !x.Number.StartsWith(PlanExecution.ReserveAccountName)).ToList();

               if (smpBills.Count == 0)
                    context.ReportError(@"Счета ДД за период с {0} по {1} не найдены", dateBegin, dateEnd);
                else
                {
                    var excel = new Application();
                    excel.Visible = true;

                    var plans = loadPlans(excel);
                    var templateName = Utils.GetReportFileName(@"SvedProf.xls");

                    if (File.Exists(templateName))
                    {
                        var newDoc = excel.Workbooks.Add(templateName);
                        excel.ScreenUpdating = false;

                        var ws = ((Worksheet) newDoc.Worksheets[1]);
                        newDoc.Names.Item(@"ДатаНачала").RefersToRange.Value2 = dateBegin;
                        newDoc.Names.Item(@"ДатаКонца").RefersToRange.Value2 = dateEnd;
                        newDoc.Names.Item(@"ДатаОтчета").RefersToRange.Value2 = DateTime.Today;
                        newDoc.Names.Item(@"ОтчетныйПериод").RefersToRange.Value2 = Utils.GetPeriodName(dateBegin, dateEnd);

                        var lpu = dataConext.VistaMed.Organisations.FirstOrDefault(x => x.MiacCode == miacCode);
                        if (lpu != null)
                        {
                            newDoc.Names.Item("ЛПУ").RefersToRange.Value2 = lpu.FullName;
                            newDoc.Names.Item("ФИОРуководителя").RefersToRange.Value2 = lpu.Chief;
                            newDoc.Names.Item("ФИОГлавбуха").RefersToRange.Value2 = lpu.Accountant;
                        }

                        var reportColumn = new ReportColumn();
                        reportColumn.Man = plans.Sum(x => x.Man);
                        reportColumn.Woman = plans.Sum(x => x.Woman);
                        fillReportColumn(ws, reportColumn, 3);

                        reportColumn = new ReportColumn();
                        reportColumn.Man = plans.Where(y => y.Month == dateEnd.Month).Sum(x => x.Man);
                        reportColumn.Woman = plans.Where(y => y.Month == dateEnd.Month).Sum(x => x.Woman);
                        fillReportColumn(ws, reportColumn, 7);

                        var allevents = (from b in smpBills
                            from a in b.AccountItems
                            where !a.Deleted && a.Event != null && a.Event.Client != null
                            group a by a.Event
                            into e
                            select new {Event = e.Key, Client = e.Key.Client, Summa = e.Sum(x => x.Sum)}).ToList();

                        var man = (from e in allevents where e.Client.Sex == 1 select e).ToList();
                        var woman = (from e in allevents where e.Client.Sex == 2 select e).ToList();

                        reportColumn = new ReportColumn();
                        reportColumn.Man = man.Sum(x => x.Summa);
                        reportColumn.Woman = woman.Sum(x => x.Summa);
                        fillReportColumn(ws, reportColumn, 8);

                        reportColumn = new ReportColumn();
                        reportColumn.Man = man.Count();
                        reportColumn.Woman = woman.Count();
                        fillReportColumn(ws, reportColumn, 9);

                        excel.ScreenUpdating = true;
                        ws.Activate();
                    }
                }
            }
        }
Пример #24
0
        private static void generateTotals(Application excel, List<ReestrTotals> totals, 
                List<ErrorZeroSum> errors, ReestrDdParams args, IBackgroundContext context)
        {
            var templateName =  Utils.GetReportFileName(@"ReestrDdTotals.xls");

            if (!File.Exists(templateName))
                return;

            var newDoc = excel.Workbooks.Add(templateName);
            var ws = newDoc.Worksheets[1];
            var allInsurers = (from c in totals select c.InsurerName).Distinct().ToList();
            var accountTypes = (from c in totals select c.AccountType).Distinct().ToList();

            var headerColIndex = 2;
            var firstRow = (Range)ws.Rows[1];
            foreach (var accountType in accountTypes)
            {
                ((Range) firstRow.Cells[1, headerColIndex]).Value2 = Enum.GetName(typeof (AccountType), accountType);
                headerColIndex++;
            }

            var rowIndex = 2;
            foreach (var insurer in allInsurers)
            {
                var row = (Range) ws.Rows[rowIndex];
                ((Range) row.Cells[1, 1]).Value2 = insurer;
                var colIndex = 2;
                foreach (var accountType in accountTypes)
                {
                    ((Range)row.Cells[1, colIndex]).Value2 = totals
                        .Where(x => x.AccountType == accountType && x.InsurerName == insurer).Sum(y => y.Kol);
                    colIndex++;
                }
                rowIndex++;
            }

            var rowItog = (Range)ws.Rows[rowIndex];
            ((Range)rowItog.Cells[1, 1]).Value2 = "ИТОГО";
            var colIndexItog = 2;
            foreach (var accountType in accountTypes)
            {
                ((Range)rowItog.Cells[1, colIndexItog]).Value2 = totals
                    .Where(x => x.AccountType == accountType).Sum(y => y.Kol);
                colIndexItog++;
            }
            rowIndex += 2;

            foreach (var error in errors)
            {
                var row = (Range)ws.Rows[rowIndex];
                ((Range)row.Cells[1, 1]).Value2 = error.Insurer + " "
                    + Enum.GetName(typeof(AccountType), error.AccountType)
                    + " " + error.Fio;

                rowIndex++;
            }

            if (!string.IsNullOrEmpty(args.DirName) && Directory.Exists(args.DirName))
            {
                var fileName = Path.Combine(args.DirName,
                        "Итоги диспансеризации");
                    try
                    {
                        if (File.Exists(fileName))
                            File.Delete(fileName);
                        newDoc.SaveAs(fileName);
                    }
                    catch (Exception e)
                    {
                        context.ReportError("Ошибка сохранения файла {0}: {1}", fileName, e.Message);
                    }
            }
        }
Пример #25
0
        public static void BuildReestrDd(IBackgroundContext context, ReestrDdParams args)
        {
            var dateBegin = args.DateBegin;
            var dateEnd = args.DateEnd;
            var miacCode = args.LpuCode;
            var billNum = args.AccountNumbers;
            using (var dataConext = new VistaMedDataContext(context))
            {
                var smpBills = (from b in dataConext.VistaMed.Accounts
                                where b.SettleDate >= dateBegin && b.SettleDate <= dateEnd && b.Date == args.CreateDate
                                && b.Contract != null && b.Contract.RbFinance != null
                                && b.Contract.RbFinance.Name.ToLower() == "омс"
                                    && (from a in b.AccountItems
                                        from s in dataConext.VistaMed.RbServices
                                        where a.ServiceId == s.Id
                                        && (s.Code.StartsWith("061") || s.Code.StartsWith("161")
                                        || s.Code.StartsWith("062") || s.Code.StartsWith("162"))
                                        select a).Any()
                                select b).ToList();

                if (!string.IsNullOrEmpty(billNum))
                {
                    var billNumList = billNum.Split(',');
                    smpBills = smpBills.Where(x => billNumList.Contains(x.Number)).ToList();
                }

                if (smpBills.Count == 0)
                    context.ReportError(@"Счета ДД за период с {0} по {1} не найдены", dateBegin, dateEnd);
                else
                {
                    var excel = new Application();
                    excel.Visible = true;

                    var totals = new List<ReestrTotals>();
                    var errors = new List<ErrorZeroSum>();

                    foreach (var smpBill in smpBills)
                    {
                        var templateFileName = @"ReestrDd.xls";
                        if (smpBill.AccountType == AccountType.DDR2)
                            templateFileName = @"ReestrDd2.xls";

                        var templateName = Utils.GetReportFileName(templateFileName);
                        var zeroFioList = new List<string>();

                        if (!File.Exists(templateName))
                            continue;

                        var newDoc = excel.Workbooks.Add(templateName);
                        excel.ScreenUpdating = false;

                        var ws = ((Worksheet)newDoc.Worksheets[1]);
                        newDoc.Names.Item(@"ДатаНачала").RefersToRange.Value2 = dateBegin;
                        newDoc.Names.Item(@"ДатаКонца").RefersToRange.Value2 = dateEnd;
                        newDoc.Names.Item(@"ДатаОтчета").RefersToRange.Value2 = DateTime.Today;

                        var lpu = dataConext.VistaMed.Organisations.FirstOrDefault(x => x.MiacCode == miacCode);
                        if (lpu != null)
                        {
                            newDoc.Names.Item("ЛПУ").RefersToRange.Value2 = lpu.FullName + " ОГРН " + lpu.OGRN ?? "";
                            newDoc.Names.Item("ФИОРуководителя").RefersToRange.Value2 = lpu.Chief;
                            newDoc.Names.Item("ФИОГлавбуха").RefersToRange.Value2 = lpu.Accountant;
                        }

                        var smo =
                            (from payer in dataConext.VistaMed.Organisations
                             where payer.Id == smpBill.PayerId
                             select payer).FirstOrDefault();
                        if (smo != null)
                        {
                            newDoc.Names.Item("СМО").RefersToRange.Value2 = smo.FullName;
                        }

                        newDoc.Names.Item("НомерСчета").RefersToRange.Value2 = smpBill.Number;
                        newDoc.Names.Item("ДатаСчета").RefersToRange.Value2 = smpBill.SettleDate;

                        string ddName = null;
                        string tarifHeader = null;
                        string header13 = null;

                        switch (smpBill.AccountType)
                        {
                            case AccountType.DdVet:
                                ddName = "в рамках первого этапа диспансеризации ветеранов ВОВ и инвалидов";
                                tarifHeader =
                                    "Тариф на плату первого этапа диспансеризации, проведенной застрахованному лицу";
                                header13 = "Первый этап диспансеризации в объеме, утвержденном Минздравом России, " +
                                           "специальность медицинского работника, проводящего диспансеризацию (код)";
                                break;
                            case AccountType.DDR1:
                                ddName = "в рамках первого этапа диспансеризации определенных групп взрослого населения";
                                tarifHeader =
                                    "Тариф на плату первого этапа диспансеризации, проведенной застрахованному лицу";
                                header13 = "Первый этап диспансеризации в объеме, утвержденном Минздравом России, " +
                                           "специальность медицинского работника, проводящего диспансеризацию (код)";
                                break;
                            case AccountType.DDR2:
                                ddName = "в рамках второго этапа диспансеризации определенных групп взрослого населения";
                                tarifHeader =
                                    "Стоимость второго этапа диспансеризации, проведенной застрахованному лицу";
                                header13 = "Второй этап диспансеризации в объеме, утвержденном Минздравом России, " +
                                           "специальность медицинского работника, проводящего диспансеризацию (код), " +
                                           "тариф на оплату второго этапа диспансеризации, проведенной застрахованному лицу";
                                break;
                            case AccountType.DDOrhan:
                                ddName =
                                    "в рамках  диспансеризации детей-сирот и детей, оставшихся без попечения родителей, " +
                                    "в том числе усыновленных (удочеренных), принятых под опеку (попечительство), " +
                                    "в приемную или патронатную семью";
                                header13 = "Диспансеризация в объеме утвержденном Минздравом России, " +
                                           "специальность медицинского работника, проводящего диспансеризацию (код)";
                                tarifHeader = "Тариф на оплату диспансеризации проведенной застрахованному лицу";
                                break;
                            case AccountType.DDHardLive:
                                ddName =
                                    "в рамках  диспансеризации детей сирот, пребывающих в стационарных учреждениях и детей, " +
                                    "находящихся в трудной жизненной ситуации";
                                header13 = "Диспансеризация в объеме утвержденном Минздравом России, " +
                                           "специальность медицинского работника, проводящего диспансеризацию (код)";
                                tarifHeader = "Тариф на оплату диспансеризации проведенной застрахованному лицу";
                                break;
                            case AccountType.DD14:
                                break;
                            case AccountType.Osm18:
                                ddName = "в рамках медицинских осмотров несовершеннолетних";
                                header13 =
                                    "Медицинские осмотры несовершеннолетних в объеме, утвержденном Минздравом России, " +
                                    "специальность медицинского работника, проводящего медицинские осмотры (код)";
                                tarifHeader = "Тариф на оплату медицинского осмотра проведенного застрахованному лицу";
                                break;
                            case AccountType.ProfOsm:
                                ddName = "за проведенные профилактические медицинские осмотры взрослого населения";
                                header13 = "Медицинские осмотры в объеме, утвержденном Минздравом России, " +
                                           "специальность медицинского работника, проводящего профилактический " +
                                           "медицинский осмотр (код)";
                                tarifHeader = "Тариф на оплату профилактических медицинских осмотров, " +
                                              "проведенных застрахованному лицу";
                                break;
                            default:
                                break;
                        }

                        if (!string.IsNullOrEmpty(ddName))
                            newDoc.Names.Item("НазваниеДД").RefersToRange.Value2 = ddName;
                        if (!string.IsNullOrEmpty(tarifHeader))
                            newDoc.Names.Item("ЗаголовокТарифа").RefersToRange.Value2 = tarifHeader;
                        if (!string.IsNullOrEmpty(header13))
                            newDoc.Names.Item("Кол13").RefersToRange.Value2 = header13;

                        var eventGroups = (from accItem in smpBill.AccountItems
                                           group accItem by accItem.Event
                                               into g
                                               orderby g.Key.Client.Fio
                                               select g).ToList();

                        foreach (var eventGroup in eventGroups)
                        {
                            ((Range)ws.Rows[14]).Insert();
                            ((Range)ws.Rows[15]).Copy(Destination: ((Range)ws.Rows[14]));
                        }

                        var rowIndex = 1;

                        foreach (var eventGroup in eventGroups)
                        {
                            var client = eventGroup.Key.Client;
                            if (client != null)
                            {
                                var newRow = ((Range)ws.Rows[rowIndex + 13]);

                                ((Range)newRow.Cells[1, 1]).Value2 = rowIndex;
                                ((Range)newRow.Cells[1, 2]).Value2 = client.Fio;

                                ((Range)newRow.Cells[1, 3]).Value2 = client.Sex == 1 ? "М" : "Ж";
                                ((Range)newRow.Cells[1, 4]).Value2 = client.BirthDate;

                                var clientDocId = dataConext.VistaMed.GetClientDocumentId(client.Id);
                                var clientDoc =
                                    (from c in dataConext.VistaMed.ClientDocuments
                                     where c.Id == clientDocId
                                     select c).FirstOrDefault();

                                if (clientDoc != null)
                                    ((Range)newRow.Cells[1, 6]).Value2 = clientDoc.Serial + " " + clientDoc.Number;

                                ((Range)newRow.Cells[1, 7]).Value2 = dataConext.VistaMed.GetClientLocAddress(client.Id);

                                var clientPolicyId = dataConext.VistaMed.GetClientPolicyId(client.Id, 1);
                                var clientPolicy =
                                    dataConext.VistaMed.ClientPolicies.FirstOrDefault(x => x.Id == clientPolicyId);

                                ((Range)newRow.Cells[1, 9]).Value2 = client.GetSnilsFormatted();

                                if (clientPolicy != null)
                                    ((Range)newRow.Cells[1, 10]).Value2 =
                                        (clientPolicy.Serial + " " + clientPolicy.Number).Trim();

                                ((Range)newRow.Cells[1, 11]).Value2 = "1";
                                var diagnosisId = dataConext.VistaMed.GetEventDiagnosis(eventGroup.Key.Id);
                                var mkb =
                                    (from d in dataConext.VistaMed.Diagnoses where d.Id == diagnosisId select d.MKB)
                                        .FirstOrDefault();
                                ((Range)newRow.Cells[1, 12]).Value2 = mkb ?? "";

                                var prnActions = (from item in eventGroup
                                                  where item.Action != null
                                                        &&
                                                        (item.Action.ActionType.Name.StartsWith(@"Комплексная услуга")
                                                        || item.Action.ActionType.Name.StartsWith(@"Комп. услуга")
                                                         || item.Action.ActionType.Name.StartsWith(@"Осмотр врача"))
                                                  select item).ToList();

                                ((Range)newRow.Cells[1, 13]).Value2 = string.Join(" ",
                                    prnActions.Select(x => x.Action.ActionType.Code));
                                ((Range)newRow.Cells[1, 14]).Value2 = string.Join(" ",
                                    prnActions.Select(x => x.Action.BegDate.Value.ToShortDateString()));
                                ((Range)newRow.Cells[1, 15]).Value2 = string.Join(" ",
                                    prnActions.Select(x => x.Action.EndDate.Value.ToShortDateString()));
                                ((Range)newRow.Cells[1, 16]).Value2 = string.Join(" ",
                                    prnActions.Select(
                                        x =>
                                            x.Action.Person_PersonId == null
                                                ? ""
                                                : x.Action.Person_PersonId.RbSpeciality.FederalCode.PadRight(15)));
                                var colIndex = 17;
                                if (smpBill.AccountType == AccountType.DDR2)
                                {
                                    ((Range)newRow.Cells[1, colIndex++]).Value2 = string.Join(" ",
                                        prnActions.Select(x => x.Sum.ToString(@"F2")));
                                }

                                var summa = eventGroup.Sum(x => x.Sum);

                                ((Range) newRow.Cells[1, colIndex++]).Value2 = summa;
                                ((Range)newRow.Cells[1, colIndex++]).Value2 = eventGroup.Key.RbResult.FederalCode;

                                if (Math.Abs(summa) < 0.01)
                                {
                                    zeroFioList.Add(eventGroup.Key.Client.Fio + " " + eventGroup.Key.Client.BirthDate.ToShortDateString());
                                }

                                rowIndex++;
                            }
                        }

                        var totalRow = ((Range)ws.Rows[rowIndex + 13]);
                        ((Range)totalRow.Cells[1, 2]).Value2 = @"ИТОГО";
                        ((Range)totalRow.Cells[1, 17 + (smpBill.AccountType == AccountType.DDR2 ? 1 : 0)]).Value2 = smpBill.Sum;

                        excel.ScreenUpdating = true;
                        ws.Activate();

                        afterFill(context, args, dataConext, smpBill, newDoc, totals, eventGroups, errors, zeroFioList);
                    }

                    generateTotals(excel, totals, errors, args, context);
                }
            }
        }
        private static List<FomsReportRowData> getFomsReportData(IBackgroundContext context, AccountCorrectParams args, string excelFileName,
            Application excel)
        {
            var result = new List<FomsReportRowData>();

            Workbook newDoc;
            try
            {
                context.ReportProgress(@"Открываем файл {0} ...", excelFileName);
                newDoc = excel.Workbooks.Open(excelFileName);
            }
            catch (Exception exception)
            {
                newDoc = null;
                context.ReportError(@"Ошибка открытия файла {0} : {1}", excelFileName, exception.Message);
            }

            if (newDoc != null)
            {
                // ищем имя КоличествоМесяцев
                var kolMonthExists = false;
                for (int i = 1; i <= newDoc.Names.Count; i++)
                {
                    if (newDoc.Names.Item(i).Name == @"КоличествоМесяцев")
                    {
                        kolMonthExists = true;
                        break;
                    }
                }

                if (kolMonthExists)
                {
                    // сравниваем КоличествоМесяцев из книги с отчетным периодом
                    int kolMonth = (int)newDoc.Names.Item(@"КоличествоМесяцев").RefersToRange.Value2;

                    if (args.DateEnd.Month == kolMonth)
                    {
                        excel.ScreenUpdating = false;
                        using (var dataContext = new VistaMedDataContext(context))
                        {
                            dataContext.VistaMed.Connection.Open();

                            try
                            {
                                // массив с объектами - типами листов книги
                                List<PageType> pageTypes = (new PageType[]
                                {
                                    new Polyclinic(context, dataContext),
                                    new Stacionar(context, dataContext),
                                    new Ambulance(context, dataContext)
                                }).ToList();

                                // сканируем все листы
                                foreach (Worksheet ws in newDoc.Worksheets.Cast<Worksheet>())
                                {
                                    // попытка обработать текущий лист для всех типов листов
                                    // фактическая работа делается в этих объектах
                                    pageTypes.ForEach(x => x.SelectFomsReportData(ws, args, result));
                                }
                            }
                            finally
                            {
                                dataContext.VistaMed.Connection.Close();
                            }
                        }
                        excel.ScreenUpdating = true;
                    }
                    else
                        context.ReportError(@"КоличествоМесяцев в файле не соответствует выбранному Вами периоду");
                }
                else
                    context.ReportError(@"Имя ячейки ""КоличествоМесяцев"" не найдено в файле {0}", excelFileName);

                newDoc.Close(false);
            }

            return result;
        }
Пример #27
0
        private static void saveReport(IBackgroundContext context, ReestrDdParams args, string insurerName, Account smpBill,
            Workbook newDoc)
        {
            if (!string.IsNullOrEmpty(args.DirName) && Directory.Exists(args.DirName))
            {
                if (!string.IsNullOrEmpty(insurerName))
                {
                    var dirName = Path.Combine(args.DirName, insurerName);
                    if (!Directory.Exists(dirName))
                    {
                        Directory.CreateDirectory(dirName);
                    }

                    var fileName = Path.Combine(dirName,
                        "Реестр " + Enum.GetName(typeof (AccountType), smpBill.AccountType) +
                        " к счету №" + smpBill.Number + " от " +
                        smpBill.SettleDate.ToString("ddMMyy") +
                        " " + insurerName);
                    try
                    {
                        if (File.Exists(fileName))
                            File.Delete(fileName);
                        newDoc.SaveAs(fileName);
                    }
                    catch (Exception e)
                    {
                        context.ReportError("Ошибка сохранения файла {0}: {1}", fileName, e.Message);
                    }
                }
            }
        }
Пример #28
0
        public static void Build(IBackgroundContext context, DdSpecReportParams args)
        {
            using (var dataConext = new VistaMedDataContext(context))
            {
                var sqlText = string.Format(@"SELECT
                    et.code AS EventCode,
                    aty.code AS ActionCode,
                    et.name AS EventName,
                    aty.name AS ActionName,
                    COUNT(DISTINCT a.id) AS Kol
                    FROM Event e
                    JOIN Client c ON c.id = e.client_id AND c.deleted = 0
                    JOIN EventType et ON et.id = e.eventType_id AND et.deleted = 0 AND e.deleted = 0
                    JOIN Action a ON a.event_id = e.id AND a.deleted = 0
                    JOIN ActionType aty ON aty.id = a.actionType_id AND aty.deleted = 0
                    LEFT OUTER JOIN Person p ON p.id = e.execPerson_id AND p.deleted = 0
                    LEFT OUTER JOIN rbSpeciality s ON s.id = p.speciality_id
                    WHERE e.execDate >= '{0}' AND e.execDate < '{1}' {2} {3} {4} {5} {6} {7} {8} {9} {10}
                    GROUP BY 1,2
                    ORDER BY 1,2",
                               (args.FromBeginOfYear ? args.DateBegin.BeginOfYear() : args.DateBegin).SqlStr(),
                               args.DateEnd.AddDays(1).SqlStr(),
                               dataConext.VistaMed.GetMaskSql("aty.code", args.ActionCodesSpec),
                               dataConext.VistaMed.GetMaskSql("aty.name", args.ActionNamesSpec),
                               dataConext.VistaMed.GetMaskSql("et.code", args.EventCodesSpec),
                               dataConext.VistaMed.GetMaskSql("et.name", args.EventNamesSpec),
                               dataConext.VistaMed.GetMaskSql("s.name", args.SpecNames),
                               dataConext.VistaMed.GetMaskSql("aty.code", args.ExcludeActionCodes, true),
                               dataConext.VistaMed.GetMaskSql("aty.name", args.ExcludeActionNames, true),
                               (args.ExcludeZeroAmount ? " AND a.amount > 0": ""),
                               (args.UseOnlyInAccount ? " AND EXISTS(SELECT ai.id FROM Account_Item ai WHERE ai.event_id = e.id AND ai.deleted=0)" : "")
                               );

                var sourceData = dataConext.VistaMed.SelectSqlData<SourceData>(sqlText);

                if (sourceData.Count == 0)
                    context.ReportError(@"Даные за период с {0} по {1} не найдены", args.DateBegin, args.DateEnd);
                else
                {
                    var templateName = Utils.GetReportFileName(@"DdSpecReport.xls");
                    if (File.Exists(templateName))
                    {
                        var excel = new Application();
                        excel.Visible = true;

                        var groups = from c in sourceData group c by c.EventName into g select g;

                        foreach (var eventGroup in groups)
                        {
                            var newDoc = excel.Workbooks.Add(templateName);
                            excel.ScreenUpdating = false;

                            var ws = ((Worksheet) newDoc.Worksheets[1]);
                            newDoc.Names.Item(@"Период").RefersToRange.Value2 = Utils.GetPeriodName(args.DateBegin,
                                args.DateEnd);
                            newDoc.Names.Item(@"ТипСобытия").RefersToRange.Value2 = eventGroup.Key;

                            var lpu =
                                dataConext.VistaMed.Organisations.FirstOrDefault(
                                    x => x.MiacCode == Properties.Settings.Default.LpuMiacCode);
                            if (lpu != null)
                            {
                                newDoc.Names.Item("ЛПУ").RefersToRange.Value2 = lpu.FullName;
                            }

                            var rowIndex = 6;
                            var npp = 1;

                            foreach (var data in eventGroup) //.Where(x => !x.ActionName.Contains(@"врача-терапевт"))
                            {
                                var row = (Range) ws.Rows[rowIndex];
                                var colIndex = 1;
                                ((Range) row.Cells[1, colIndex++]).Value2 = npp;
                                ((Range) row.Cells[1, colIndex++]).Value2 =
                                    string.Concat(data.ActionCode, " ", data.ActionName);
                                ((Range) row.Cells[1, colIndex++]).Value2 = "";
                                ((Range) row.Cells[1, colIndex++]).Value2 = data.Kol;
                                rowIndex++;
                                npp++;
                            }

                            excel.ScreenUpdating = true;
                            ws.Activate();
                        }
                    }
                }
            }
            context.ProgressSeparator('-');
        }
        /// <summary>
        /// Заполняем сведения о выполнении заказ-задания
        /// </summary>
        /// <param name="context"></param>
        /// <param name="args"></param>
        public static void FillFomsReport(IBackgroundContext context, AccountCorrectParams args)
        {
            context.ProgressSeparator();
            context.ReportProgress(@"ФОРМИРОВАНИЕ СВЕДЕНИЙ О ВЫПОЛНЕНИИ ЗАКАЗ-ЗАДАНИЯ");
            context.ProgressSeparator();

            // книга планов
            var excelFileName = args.AccountCheckPlanFileName;
            if (File.Exists(excelFileName))
            {
                var excel = new Application();
                excel.Visible = true;

                var reportData = getFomsReportData(context, args, excelFileName, excel);

                if (reportData.Count > 0)
                {

                    excel.ScreenUpdating = false;
                    using (var dataContext = new VistaMedDataContext(context))
                    {
                        dataContext.VistaMed.Connection.Open();

                        var templateName = Path.Combine(Path.GetFullPath(@".\"), @"AccountFomsReport.xls");

                        Workbook newDoc = excel.Workbooks.Add(templateName);
                        newDoc.Names.Item(@"Период").RefersToRange.Value2 =
                            Utils.GetPeriodName(args.DateBegin, args.DateEnd);

                        var lpu = dataContext.VistaMed.Organisations.FirstOrDefault(x => x.MiacCode == args.LpuCode);
                        if (lpu != null)
                        {
                            newDoc.Names.Item("ЛПУ").RefersToRange.Value2 = lpu.FullName;
                            newDoc.Names.Item("ФИОРуководителя").RefersToRange.Value2 = lpu.Chief;
                            //newDoc.Names.Item("ФИОГлавбуха").RefersToRange.Value2 = lpu.Accountant;
                        }

                        try
                        {
                            var ws = (Worksheet)newDoc.Worksheets[1];
                            for (int rowIndex = 8; rowIndex < 19; rowIndex++)
                            {
                                var row = (Range)ws.Rows[rowIndex];
                                var rowName = row.GetCellValue<string>(1, 1);
                                var smoCode = row.GetCellValue<string>(1, 8);
                                if (!string.IsNullOrEmpty(smoCode))
                                {
                                    var rowDataType = (rowName.StartsWith("Плановое")
                                        ? FomsReportRowType.Plan
                                        : FomsReportRowType.Fact);

                                    var rowData = reportData.FirstOrDefault(x => x.SmoCode == smoCode
                                                                                 && x.RowType == rowDataType);

                                    if (rowData != null)
                                    {
                                        var colIndex = 2;
                                        row.SetCellValue(1, colIndex++, rowData.StacFullCount + rowData.StacApuCount);
                                        row.SetCellValue(1, colIndex++, rowData.StacDayCount);
                                        row.SetCellValue(1, colIndex++, rowData.EmergencyCount);
                                        row.SetCellValue(1, colIndex++, rowData.TreatmentCount);
                                        row.SetCellValue(1, colIndex++, rowData.VisitCount + rowData.ProfilacticCount);
                                        row.SetCellValue(1, colIndex++, rowData.AmbulanceCount);
                                    }

                                }
                            }
                        }
                        finally
                        {
                            dataContext.VistaMed.Connection.Close();
                        }
                    }
                    excel.ScreenUpdating = true;
                }
            }
            else
                context.ReportError(@"Файл {0} не найден", excelFileName);

            context.ProgressSeparator('-');
        }
Пример #30
0
        public static void UpdateClientAttaches(IBackgroundContext context, LpuExecParams args)
        {
            if (context.CancellationPending) return;
            context.ProgressSeparator();
            context.ReportProgress(@"ОБНОВЛЕНИЕ СВЕДЕНИЙ О ПРИКРЕПЛЕНИИ ЗАСТРАХОВАННЫХ ЛИЦ К ЛПУ");
            context.ReportProgress("");
            using (var dataContext = new AttacherDataContext(context))
            {
                var dupMiac = (from org in dataContext.VistaMed.Organisations
                               where !string.IsNullOrEmpty(org.MiacCode)
                               group org by org.MiacCode
                               into g select g).Where(x => x.Count() > 1);

                if (dupMiac.Any())
                {
                    foreach (var dupGroup in dupMiac)
                    {
                        context.ReportError(@"В справочнике организаций найдено {0} записей с кодом МИАЦ = {1}", dupGroup.Count(), dupGroup.Key);
                    }
                    context.ReportProgress(@"Пожалуйста устраните указанные ошибки");
                }
                else
                {

                    dataContext.Load(context, Properties.Settings.Default.DataDir);

                    // словарь организаций по коду МИАЦ
                    var lpuDict =
                        (from lpu in dataContext.VistaMed.Organisations
                         where !lpu.Deleted && !string.IsNullOrEmpty(lpu.MiacCode)
                         select lpu).ToDictionary(x => x.MiacCode);

                    var idOrgDict = (from lpu in dataContext.VistaMed.Organisations
                         where !lpu.Deleted
                         select lpu).ToDictionary(x => x.Id);

                    var errorMiacCodes = new HashSet<string>();

                    var updateStatements = new List<string>();
                    var insertStatements = new List<string>();

                    foreach (var smoData in dataContext.SmoPacients)
                    {
                        context.ReportProgress(@"Обрабатываем СМО {0} - {1} застрахованных лиц ...",
                                               smoData.Key, smoData.Value.Count);

                        int smoClientIndex = 0;

                        foreach (var smoPacient in smoData.Value.Where(x => !string.IsNullOrEmpty(x.MCOD)))
                        {
                            if (context.CancellationPending) break;

                            if (lpuDict.ContainsKey(smoPacient.MCOD))
                            {
                                // выбираем ЛПУ по колу МИАЦ
                                var lpu = lpuDict[smoPacient.MCOD];

                                // по ДР
                                var clients = dataContext.VistaMed.Clients.Where(x => x.BirthDate == smoPacient.DR).ToList();

                                // клиенты по фио
                                clients = clients.Where(
                                        x => x.LastName.ToUpper() == smoPacient.FAM.ToUpper()
                                             &&
                                             x.FirstName.ToUpper() == smoPacient.IM.ToUpper()
                                             &&
                                             x.PatrName.ToUpper() == smoPacient.OT.ToUpper())
                                        .ToList();

                                // по ключу
                                clients = clients.Where(x => x.GetKey(dataContext.VistaMed) == smoPacient.Key).ToList();

                                foreach (var client in clients)
                                {
                                    var attachInfo = new AttachInfo(smoPacient, dataContext.VistaMed, lpu);

                                    // крайняя по дате запись о прикреплении
                                    var attachRec =
                                        client.ClientAttaches.OrderByDescending(x => x.BegDate).FirstOrDefault();

                                    // создаем новую запись о прикреплении когда
                                    var shouldCreateNew = attachRec == null
                                      /* битый ID организации ЛПУ */
                                      || !idOrgDict.ContainsKey(attachRec.LPUId)
                                      /* не то ЛПУ и код миац не пустой (при пустом коде миац корректируем последнюю запись о привязке) */
                                      || ((attachInfo.Lpu.Id != attachRec.LPUId) && !string.IsNullOrEmpty(idOrgDict[attachRec.LPUId].MiacCode));

                                    if (shouldCreateNew)
                                        attachInfo.CreateAttachRecord(client, insertStatements);
                                    else
                                        attachInfo.UpdateAttachRecord(attachRec, updateStatements);
                                }
                            }
                            else
                            {
                                if (!errorMiacCodes.Contains(smoPacient.MCOD))
                                {
                                    context.ReportError(
                                        @"Код МИАЦ {0} для ЛПУ не найден в справочнике организаций Виста-Мед. Привязка к этому ЛПУ не проводится",
                                        smoPacient.MCOD);
                                    errorMiacCodes.Add(smoPacient.MCOD);
                                }
                            }

                            smoClientIndex++;
                            if(smoClientIndex%50000 == 0)
                                context.ReportProgress(@"Обработано {0} записей", smoClientIndex);
                        }

                        if (context.CancellationPending)
                            break;
                        else
                        {
                            context.ReportProgress("Записываем изменения в БД ...");
                            execInsertStatements(insertStatements, dataContext, context);
                            execUpdateStatements(updateStatements, dataContext, context);
                            insertStatements.Clear();
                            updateStatements.Clear();
                        }
                        context.ProgressSeparator();
                    }

                }
            }
            context.ProgressSeparator('-');
        }