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('-');
        }
 public static void AnalyzeErrors(IBackgroundContext context, LpuExecParams executorParams)
 {
     if (context.CancellationPending) return;
     context.ProgressSeparator();
     context.ReportProgress(@"АНАЛИЗ ОШИБОК");
     context.ReportProgress("");
     using (var dataContext = new ErrorsAnalyzerDataContext())
     {
         var dir = Settings.Default.DataDir;
         dataContext.Load(context, dir, dir, dir);
         if (context.CancellationPending) return;
         foreach (var errorDataSet in dataContext.Errors.TakeWhile(x => !context.CancellationPending))
         {
             analyzeErrorsDataSet(context, dataContext, errorDataSet);
         }
     }
     context.ProgressSeparator('-');
 }
        public static void ValidateBills(IBackgroundContext context, LpuExecParams executorParams)
        {
            if (context.CancellationPending) return;

            context.ProgressSeparator();
            context.ReportProgress(@"ПРОВЕРКА СЧЕТОВ");
            context.ReportProgress("");
            using (var dataContext = new BillsValidatorDataContext())
            {
                var dir = Properties.Settings.Default.DataDir;
                dataContext.Load(context, dir, dir, dir);
                if (context.CancellationPending) return;
                foreach (var bill in dataContext.Bills.TakeWhile(x => !context.CancellationPending))
                {
                    validateBill(context, dataContext, bill);
                }
            }
            context.ProgressSeparator('-');
        }
        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('-');
        }
        public static void LoadAddressAndSnils(IBackgroundContext context, LpuExecParams executorParams)
        {
            context.ProgressSeparator();
            context.ReportProgress(@"ÇÀÃÐÓÇÊÀ ÀÄÐÅÑÎÂ È ÑÍÈËÑ");
            context.ProgressSeparator();
            using (var dataContext = new VistaMedDataContext(context))
            {
                var dir = Properties.Settings.Default.DataDir;
                dataContext.LoadSmoPacients(context, dir);
                var npp = 0;
                foreach (var pacientList in dataContext.SmoPacients.Values)
                {
                    if (context.CancellationPending) break;

                    foreach (var smoPacient in pacientList.Where(x => x.MCOD == executorParams.LpuCode))
                    {
                        if (context.CancellationPending) break;

                        var policyList = dataContext.VistaMed.ClientPolicies.Where(x => x.Number == smoPacient.N_POL && x.Serial == smoPacient.S_POL && !x.Deleted);

                        if (policyList.Count() == 1)
                        {
                            var client = policyList.First().Client;

                            if (client.LastName.ToLower() == smoPacient.FAM.ToLower()
                                && client.FirstName.ToLower() == smoPacient.IM.ToLower()
                                && client.PatrName.ToLower() == smoPacient.OT.ToLower()
                                && client.BirthDate == smoPacient.DR)
                            {
                                npp++;

                                var address = string.Join(", ",
                                                          (new[]
                                                              {
                                                                  smoPacient.RNNAME, smoPacient.NPNAME, smoPacient.UL,
                                                                  string.IsNullOrEmpty(smoPacient.DOM) ? "" : "ä." + smoPacient.DOM,
                                                                  string.IsNullOrEmpty(smoPacient.KV) ? "" : "êâ." + smoPacient.KV
                                                              }).Where(x => !string.IsNullOrEmpty(x)));

                                var snils = smoPacient.SNILS;
                                var phone = smoPacient.TEL;

                                if (!string.IsNullOrEmpty(address))
                                {
                                    var ulCode = smoPacient.ULCODE;
                                    if (ulCode == "0") ulCode = "";
                                    var adrReg = client.ClientAddresses.LastOrDefault(x => x.Type == 0);
                                    setAddress(adrReg, address, ulCode);
                                    var adrFact = client.ClientAddresses.LastOrDefault(x => x.Type == 1);
                                    setAddress(adrFact, address, ulCode);
                                }

                                if (!string.IsNullOrEmpty(snils))
                                    client.SNILS = snils;

                                if (npp % 10000 == 0)
                                {
                                    dataContext.VistaMed.SubmitChanges();
                                    context.ReportProgress(@"{0} çàïèñåé", npp);
                                }
                            }
                        }
                    }
                }
            }
        }
        public static void SetColorMakers(IBackgroundContext context, LpuExecParams executorParams)
        {
            ClearColorMakers(context, null);

            context.ProgressSeparator();
            context.ReportProgress(@"УСТАНОВКА МАРКЕРОВ НЕДЕЙСТВИТЕЛЬНЫХ ПОЛИСОВ");
            context.ProgressSeparator();
            using (var dataContext = new SetColorMakersDataContext(context))
            {
                dataContext.Load(context);
                var invMarkerType = getInvMarkerType(dataContext);
                if (invMarkerType == null)
                {
                    invMarkerType = new RbStatusObservationClientType();
                    invMarkerType.Code = InvalidPolicyMarkerCode;
                    invMarkerType.Color = InvalidPolicyMarkerColor;
                    invMarkerType.Name = InvalidPolicyMarkerName;
                    dataContext.VistaMed.SubmitChanges();
                }
                invMarkerType = getInvMarkerType(dataContext);

                if (invMarkerType != null)
                {
                    context.ReportProgress(@"");
                    foreach (var smoPacient in dataContext.SmoPacients.TakeWhile(x => !context.CancellationPending))
                    {
                        var smoCode = smoPacient.Key;
                        var smoPolicyNumbers = new HashSet<string>();
                        // smoPacient.Value.Select(x => x.SerialNum).Distinct().ToList().ForEach(z => smoPolicyNumbers.Add(z));

                        // 14/01/14 поиск по более полному ключу
                        smoPacient.Value.Select(x => x.Key).Distinct().ToList().ForEach(z => smoPolicyNumbers.Add(z));

                        var smo = dataContext.VistaMed.Organisations.FirstOrDefault(x => x.MiacCode == smoCode && x.IsInsurer);
                        if(smo != null)
                        {
                            var smoId = smo.Id;
                            context.ReportProgress(@"СМО {0}", smo.FullName);

                            try
                            {

                                var allPolicies = from p in dataContext.VistaMed.ClientPolicies
                                                  where p.InsurerId == smoId && p.Id == dataContext.VistaMed.GetClientPolicyId(p.ClientId, 1)
                                                  select new { p.Id, p.ClientId, p.Serial, p.Number, p.Client.LastName, p.Client.FirstName, p.Client.PatrName, p.Client.BirthDate };

                                context.ReportProgress(@"Проверяем полисы");

                                var invalidPolicies = new List<Tuple<int,int>>();
                                int i = 1;
                                foreach (var policy in allPolicies)
                                {
                                    if (context.CancellationPending) break;

                                    // 14/01/14 поиск по полному ключу

                                    var policyKey =
                                        (policy.Serial + "|" + policy.Number + "|" + policy.LastName + "|" +
                                         policy.FirstName + "|" + policy.PatrName + "|" +
                                         policy.BirthDate.ToShortDateString()).ToUpper();

                                    if (!smoPolicyNumbers.Contains(policyKey))
                                            invalidPolicies.Add(new Tuple<int, int>(policy.Id, policy.ClientId));

                                    if(i % 50000 == 0)
                                        context.ReportProgress();
                                    i++;
                                }

                                if(invalidPolicies.Count == 0)
                                    context.ReportProgress(@"Недействительные полисы не найдены");
                                else
                                {
                                    context.ReportProgress(@"Обнаружено {0} недействительных полисов", invalidPolicies.Count);
                                    var invalidClients = invalidPolicies.Select(x => x.Item2).Distinct();
                                    var batch = new List<int>();

                                    context.ReportProgress(@"Простановка маркеров");
                                    foreach (var invalidClient in invalidClients)
                                    {
                                        batch.Add(invalidClient);
                                        execBatch(context, dataContext, batch, invMarkerType.Id);
                                    }
                                    execBatch(context, dataContext, batch, invMarkerType.Id, true);
                                }
                            }
                            catch (Exception exception)
                            {
                                context.ReportError(exception.Message);
                            }

                            context.ProgressSeparator('+');
                        }
                        else
                            context.ReportError(@"СМО с кодом МИАЦ {0} не найдена в БД ВистаМед", smoCode);
                    }
                }
                else
                {
                    context.ReportError(@"Тип маркера недействительного полиса не найден в БД ВистаМед");
                }
            }
            context.ProgressSeparator('-');
        }