Beispiel #1
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);
                    }
                }
            }
        }
Beispiel #2
0
        private static void afterFill(IBackgroundContext context, ReestrDdParams args, VistaMedDataContext dataConext,
            Account smpBill, Workbook newDoc, List<ReestrTotals> totals, List<IGrouping<Event, AccountItem>> eventGroups, List<ErrorZeroSum> errors, List<string> zeroFioList)
        {
            var insurer = (from o in dataConext.VistaMed.Organisations
                where o.Id == smpBill.Contract.PayerId
                select o).FirstOrDefault();

            if (insurer != null)
            {
                string insurerName = "";
                if (insurer.MiacCode == "67002")
                    insurerName = "СОГАЗ";
                else if (insurer.MiacCode == "67003")
                    insurerName = "МАКС";
                else if (insurer.MiacCode == "67004")
                    insurerName = "РГС";
                else if (insurer.MiacCode == "67005")
                    insurerName = "СПВ";
                if (string.IsNullOrEmpty(insurerName))
                {
                    insurerName = new string(insurer.ShortName.ToArray()
                        .Except(Path.GetInvalidFileNameChars()).ToArray());
                }

                saveReport(context, args, insurerName, smpBill, newDoc);
                totals.Add(new ReestrTotals()
                {
                    AccountType = smpBill.AccountType,
                    InsurerName = insurerName,
                    Kol = eventGroups.Count
                });
                errors.AddRange(zeroFioList.Select(x =>
                    new ErrorZeroSum() {AccountType = smpBill.AccountType, Fio = x, Insurer = insurerName}));
            }
        }
Beispiel #3
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);
                    }
            }
        }
Beispiel #4
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);
                }
            }
        }