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); } } } }
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})); } }
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); } } }
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); } } }