コード例 #1
0
        public static void CheckBanksUpdate(bool forceUpdate)
        {
            if (!forceUpdate)
            {
                dynamic parameters = new ParametersService(Connection.ConnectionDB);
                DateTime.TryParse(parameters.last_banks_update, out DateTime lastModified);

                int withoutUpdate = (int)DateTime.Now.Subtract(lastModified).TotalDays;
                if (withoutUpdate < UpdatePeriod)
                {
                    return;
                }
                var runUpdate = MessageDialogHelper.RunQuestionDialog(
                    lastModified == default(DateTime)
                                                ? "Справочник банков никогда не обновлялся. Обновить?"
                                                : NumberToTextRus.FormatCase(
                        withoutUpdate,
                        "Cправочник банков обновлялся\n{0} день назад. Обновить?",
                        "Cправочник банков обновлялся\n{0} дня назад. Обновить?",
                        "Cправочник банков обновлялся\n{0} дней назад. Обновить?"));
                if (!runUpdate)
                {
                    return;
                }
            }
            BanksUpdateWindow updateWindow = new BanksUpdateWindow();

            updateWindow.Show();
        }
コード例 #2
0
ファイル: OrmReference.cs プロジェクト: kozlov-d/QSProjects
        protected void OnButtonDeleteClicked(object sender, EventArgs e)
        {
            if (!CanDelete)
            {
                MessageDialogHelper.RunWarningDialog("У вас нет прав для удаления этого документа.");
                return;
            }
            var toDelete = ytreeviewRef.GetSelectedObjects();

            var text = NumberToTextRus.FormatCase(toDelete.Length,
                                                  "Вы собираетесь удалить {0} объект, вам нужно будет проверить ссылки для каждого из них. Продолжить?",
                                                  "Вы собираетесь удалить {0} объекта, вам нужно будет проверить ссылки для каждого из них. Продолжить?",
                                                  "Вы собираетесь удалить {0} объектов, вам нужно будет проверить ссылки для каждого из них. Продолжить?");

            if (toDelete.Length > 1 && !MessageDialogHelper.RunQuestionDialog(text))
            {
                return;
            }

            foreach (var delete in toDelete)
            {
                OrmMain.DeleteObject(delete);
            }

            UpdateObjectList();
        }
コード例 #3
0
ファイル: BanksUpdater.cs プロジェクト: Enzogord/QSProjects
        public static void CheckBanksUpdate(bool forceUpdate)
        {
            if (!forceUpdate)
            {
                DateTime lastModified = new DateTime();
                if (MainSupport.BaseParameters.All.ContainsKey("last_banks_update"))
                {
                    lastModified = DateTime.Parse(MainSupport.BaseParameters.All["last_banks_update"]);
                }

                int withoutUpdate = (int)DateTime.Now.Subtract(lastModified).TotalDays;
                if (withoutUpdate < UpdatePeriod)
                {
                    return;
                }
                var runUpdate = MessageDialogWorks.RunQuestionDialog(
                    lastModified == default(DateTime) ? "Справочник банков никогда не обновлялся. Обновить?" :
                    NumberToTextRus.FormatCase(withoutUpdate, "Cправочник банков обновлялся\n{0} день назад. Обновить?",
                                               "Cправочник банков обновлялся\n{0} дня назад. Обновить?",
                                               "Cправочник банков обновлялся\n{0} дней назад. Обновить?"));
                if (!runUpdate)
                {
                    return;
                }
            }
            BanksUpdateWindow updateWindow = new BanksUpdateWindow();

            updateWindow.Show();
        }
コード例 #4
0
        public bool Validate(string password, out IList <string> errorMessages)
        {
            if (password == null)
            {
                password = "";
            }
            errorMessages = new List <string>();

            if (Settings == null)
            {
                return(true);
            }
            if (Settings.AllowEmpty && String.IsNullOrEmpty(password))
            {
                return(true);
            }

            if (password.Length > Settings.MaxLength)
            {
                errorMessages.Add(
                    $"Пароль слишком длинный (максимум: {Settings.MaxLength} {NumberToTextRus.Case(Settings.MaxLength, "символ", "символа", "символов")})");
            }
            if (password.Length < Settings.MinLength)
            {
                errorMessages.Add($"Пароль слишком короткий (минимум: {Settings.MinLength} {NumberToTextRus.Case(Settings.MinLength, "символ", "символа", "символов")})");
            }
            if (password.Contains(" ") && !Settings.AllowWhitespaces)
            {
                errorMessages.Add("Пароль не должен содержать пробелов");
            }
            if (password.Contains("\n") || password.Contains("\r\n"))
            {
                errorMessages.Add("Пароль не должен содержать символ переноса строки");
            }
            if (Settings.NotAllowedStrings != null && Settings.NotAllowedStrings.Any(password.Contains))
            {
                errorMessages.Add($"Пароль не должен содержать запрещённые символы и слова ( {String.Join(" ", Settings.NotAllowedStrings)} )");
            }
            if (Settings.ASCIIOnly && !StringValidationHelper.ContainsOnlyASCIICharacters(password))
            {
                errorMessages.Add("Пароль должен содержать только цифры, спец. символы и буквы англ. алфавита");
            }
            if (Settings.MinNumberCount != 0 && password.Count(Char.IsNumber) < Settings.MinNumberCount)
            {
                errorMessages.Add($"Пароль должен содержать минимум {Settings.MinNumberCount} {NumberToTextRus.Case(Settings.MinNumberCount, "цифру", "цифры", "цифр")}");
            }
            if (Settings.MinOtherCharactersCount != 0 && password.Count(x => !Char.IsLetterOrDigit(x)) < Settings.MinOtherCharactersCount)
            {
                errorMessages.Add($"Пароль должен содержать минимум {Settings.MinOtherCharactersCount} спец. {NumberToTextRus.Case(Settings.MinOtherCharactersCount, "символ", "символа", "символов")} ( . + - * : ? и др.)");
            }
            if (Settings.MinLetterSameCaseCount != 0 &&
                (password.Count(Char.IsUpper) < Settings.MinLetterSameCaseCount || password.Count(Char.IsLower) < Settings.MinLetterSameCaseCount)
                )
            {
                errorMessages.Add(
                    $"Пароль должен содержать минимум {Settings.MinLetterSameCaseCount} {NumberToTextRus.Case(Settings.MinLetterSameCaseCount, "прописную", "прописных", "прописных")} " +
                    $"и {Settings.MinLetterSameCaseCount} {NumberToTextRus.Case(Settings.MinLetterSameCaseCount, "строчную", "строчных", "строчных")} буквы");
            }
            return(!errorMessages.Any());
        }
コード例 #5
0
        private void PrepareAndSendReceipts()
        {
            using (IUnitOfWork uow = UnitOfWorkFactory.CreateWithoutRoot()) {
                logger.Info("Подготовка чеков к отправке на сервер фискализации...");

                var receiptForOrderNodes = orderRepository
                                           .GetOrdersForCashReceiptServiceToSend(uow, orderParametersProvider, DateTime.Today.AddDays(-3)).ToList();

                var withoutReceipts     = receiptForOrderNodes.Where(r => r.ReceiptId == null).ToList();
                var withNotSentReceipts = receiptForOrderNodes.Where(r => r.ReceiptId.HasValue && r.WasSent != true).ToList();

                var receiptsToSend = withoutReceipts.Count + withNotSentReceipts.Count;
                if (receiptsToSend <= 0)
                {
                    logger.Info("Нет чеков для отправки.");
                    return;
                }
                logger.Info($"Общее количество чеков для отправки: {receiptsToSend}");

                int notValidCount = 0;
                SendForOrdersWithoutReceipts(uow, withoutReceipts, ref notValidCount);
                SendForOrdersWithNotSendReceipts(uow, withNotSentReceipts, ref notValidCount);

                uow.Commit();

                if (notValidCount > 0)
                {
                    logger.Info($"{notValidCount} {NumberToTextRus.Case(notValidCount, "чек не валиден", "чека не валидно", "чеков не валидно")}.");
                }
            }
        }
コード例 #6
0
        public void AddTableEquipmentFromClient(List <OrderEquipment> list)
        {
            if (list == null)
            {
                return;
            }
            List <M2ProxyDocumentParserNode> result = new List <M2ProxyDocumentParserNode>();

            foreach (var item in list)
            {
                var node = new M2ProxyDocumentParserNode();
                node.FullNameString = item.FullNameString;
                node.Units          = "шт.";       //оборудование только в штуках
                node.Count          = item.Count.ToString();
                node.CountString    = String.Format("{0} ({1})", node.Count, NumberToTextRus.Str(item.Count, true, "", "", "").Trim());
                result.Add(node);
            }

            customTablesList.Clear();
            AddCustomTable <M2ProxyDocumentParserNode>("ОборудованиеОтКлиента", result)
            .AddColumn(x => x.FullNameString, PatternFieldType.FString)
            .AddColumn(x => x.Count, PatternFieldType.FString)
            .AddColumn(x => x.CountString, PatternFieldType.FString);
            SortFields();
        }
コード例 #7
0
        private void GmapWidgetOnMarkerEnter(GMapMarker item)
        {
            if (!(item.Tag is DriverRouteListAddressVMNode node) || !node.Order.IsFastDelivery)
            {
                return;
            }

            var index = item.ToolTipText.LastIndexOf("\nОсталось времени", StringComparison.CurrentCulture);

            if (index != -1)
            {
                item.ToolTipText = item.ToolTipText.Remove(index);
            }
            if (node.RouteListItem.Status != RouteListItemStatus.EnRoute)
            {
                return;
            }
            var timeDiff         = node.RouteListItem.CreationDate.Add(_fastDeliveryTime) - DateTime.Now;
            var timeRemainingStr = timeDiff.Days == 0
                                ? timeDiff.ToString("hh':'mm':'ss")
                                : $"{Math.Abs(timeDiff.Days)} {NumberToTextRus.Case(timeDiff.Days, "день", "дня", "дней")} {timeDiff:hh':'mm':'ss}";

            if (DateTime.Now > node.RouteListItem.CreationDate.Add(_fastDeliveryTime))
            {
                timeRemainingStr = $"-{timeRemainingStr}";
            }

            item.ToolTipText += $"\nОсталось времени: {timeRemainingStr}";
        }
コード例 #8
0
        /// <summary>
        /// Сохраняем журнал изменений через новый UnitOfWork.
        /// </summary>
        public void SaveChangeSet(IUnitOfWork userUoW)
        {
            if (changes.Count == 0)
            {
                return;
            }

            using (var uow = UnitOfWorkFactory.CreateWithoutRoot())
            {
                var user = UserRepository.GetCurrentUser(uow);

                var    conStr  = userUoW.Session.Connection.ConnectionString;
                var    reg     = new Regex("user id=(.+?)(;|$)");
                var    match   = reg.Match(conStr);
                string dbLogin = match.Success ? match.Groups[1].Value : null;

                var changeset = new ChangeSet(userUoW.ActionTitle?.UserActionTitle
                                              ?? userUoW.ActionTitle?.CallerMemberName + " - "
                                              + userUoW.ActionTitle.CallerFilePath.Substring(userUoW.ActionTitle.CallerFilePath.LastIndexOfAny(DIRECTORY_SEPARATORS.ToArray()) + 1)
                                              + " (" + userUoW.ActionTitle.CallerLineNumber + ")",
                                              user,
                                              dbLogin);
                changeset.AddChange(changes.ToArray());
                uow.Save(changeset);
                uow.Commit();
                logger.Debug(NumberToTextRus.FormatCase(changes.Count, "Зарегистрировано изменение {0} объекта.", "Зарегистрировано изменение {0} объектов.", "Зарегистрировано изменение {0} объектов."));

                Reset();
            }
        }
コード例 #9
0
        public void Refresh()
        {
            DeliveryPoint = (InfoProvider as IDeliveryPointInfoProvider)?.DeliveryPoint;
            if (DeliveryPoint == null)
            {
                return;
            }
            var allEquipmentAtDeliveryPoint = EquipmentRepository.GetEquipmentAtDeliveryPoint(InfoProvider.UoW, DeliveryPoint);

            labelEquipmentCount.Text = allEquipmentAtDeliveryPoint.Count + " шт.";
            var nextServiceText = string.Empty;
            var equipmentsWithNextServiceDate = allEquipmentAtDeliveryPoint
                                                .Where(eq => eq.NextServiceDate.HasValue);
            var eqWithMinDate = equipmentsWithNextServiceDate
                                .Aggregate <Equipment, Equipment, Equipment>(null, (minEq, eq) => (minEq == null || (eq.NextServiceDate < minEq.NextServiceDate) ? eq : minEq), r => r);

            if (eqWithMinDate != null)
            {
                var nextServiceDate     = eqWithMinDate.LastServiceDate.AddMonths(6);
                var daysTillNextService = (nextServiceDate - DateTime.Today).Days;
                nextServiceText = string.Format(
                    "{0} (осталось {1} {2})",
                    nextServiceDate.ToShortDateString(),
                    daysTillNextService,
                    NumberToTextRus.Case(daysTillNextService, "день", "дня", "дней")
                    );
            }
            labelNextService.Text = nextServiceText;
            var agreements = AdditionalAgreementRepository.GetActiveAgreementsForDeliveryPoint(InfoProvider.UoW, DeliveryPoint);

            /*Отключено из-за ошибки. Задачи I-1221 и I-1020
             * if(fixedPricesList != null)
             *      fixedPricesList.ToList().ForEach(x => InfoProvider.UoW.Session.Evict(x));*/
            if (Contract != null)
            {
                RefreshList();
            }
            else
            {
                fixedPricesList = new List <WaterSalesAgreementFixedPrice>();
            }

            ytreeviewFixedPrices.ColumnsConfig = ColumnsConfigFactory.Create <WaterSalesAgreementFixedPrice>()
                                                 .AddColumn("Номенклатура")
                                                 .AddTextRenderer(x => x.Nomenclature.ShortOrFullName)
                                                 .AddColumn("Цена")
                                                 .AddTextRenderer(x => string.Format("{0}р.", x.Price))
                                                 .Finish();

            ytreeviewFixedPrices.SetItemsSource(fixedPricesList);

            ytreeviewFixedPrices.Visible  = fixedPricesList.Any();
            hboxNotFixedPriceInfo.Visible = !fixedPricesList.Any();

            WaterAgreements = agreements.Where(a => a.Type == AgreementType.WaterSales).ToArray();
            buttonWaterAgreement.Visible = WaterAgreements.Any();
        }
コード例 #10
0
        void UpdateIcon()
        {
            if (viewModel.UnreadNewsCount > 0)
            {
                menuLabel.Markup      = String.Format("<span foreground=\"red\" weight=\"bold\">+{0}</span>", viewModel.UnreadNewsCount);
                menuLabel.TooltipText = NumberToTextRus.FormatCase(viewModel.UnreadNewsCount, "{0} непрочитанная новость", "{0} непрочитанных новости", "{0} непрочитанных новостей");
            }

            menuLabel.Visible = (viewModel.UnreadNewsCount > 0);
            newsicon.Visible  = (viewModel.UnreadNewsCount == 0);
        }
コード例 #11
0
        public SendMessangeViewModel(IUnitOfWorkFactory unitOfWorkFactory, int[] employeeIds, NotificationManagerService notificationManager, IInteractiveMessage interactive, INavigationManager navigation) : base(navigation)
        {
            this.notificationManager = notificationManager ?? throw new ArgumentNullException(nameof(notificationManager));
            this.interactive         = interactive ?? throw new ArgumentNullException(nameof(interactive));
            Title = "Отправка уведомлений " + NumberToTextRus.FormatCase(employeeIds.Length, "{0} сотруднику", "{0} сотрудникам", "{0} сотрудникам");

            uow = unitOfWorkFactory.CreateWithoutRoot();

            Templates = uow.GetAll <MessageTemplate>().ToList();
            employees = uow.GetById <EmployeeCard>(employeeIds);
        }
コード例 #12
0
        public DeletionViewModel(INavigationManager navigation, DeleteCore deletion) : base(navigation)
        {
            this.Deletion = deletion;
            Title         = "Выполнить удаление?";

            var deleteNode = new TreeNode();

            deleteNode.CountedNode = false;
            FillObgectGroups(deleteNode, Deletion.DeletedItems);
            if (deleteNode.TotalChildCount > 0)
            {
                deleteNode.Title = NumberToTextRus.FormatCase(deleteNode.Childs.Count,
                                                              "Будут удалены объекты {0} вида",
                                                              "Будут удалены объекты {0} видов",
                                                              "Будут удалены объекты {0} видов");
                DeletedItems.Add(deleteNode);
            }

            var cleanNode = new TreeNode();

            cleanNode.CountedNode = false;
            FillObgectGroups(cleanNode, Deletion.CleanedItems);
            if (cleanNode.TotalChildCount > 0)
            {
                cleanNode.Title = NumberToTextRus.FormatCase(cleanNode.Childs.Count,
                                                             "Будут очищены ссылки в объектах {0} вида",
                                                             "Будут очищены ссылки в объектах {0} видов",
                                                             "Будут очищены ссылки в объектах {0} видов");
                DeletedItems.Add(cleanNode);
            }

            var removeNode = new TreeNode();

            removeNode.CountedNode = false;
            FillObgectGroups(removeNode, Deletion.CleanedItems);
            if (removeNode.TotalChildCount > 0)
            {
                removeNode.Title = NumberToTextRus.FormatCase(removeNode.Childs.Count,
                                                              "Будут очищены ссылки в коллекциях у {0} вида объектов",
                                                              "Будут очищены ссылки в коллекциях у {0} видов объектов",
                                                              "Будут очищены ссылки в коллекциях у {0} видов объектов");
                DeletedItems.Add(removeNode);
            }

            DeletedItems.Sort();

            var rootNode = FillTreeDependence(Deletion.RootEntity);

            DependenceTree.Add(rootNode);
        }
コード例 #13
0
        private void CleanWorks(object state)
        {
            var toRemove = Calls.Values.Where(x => x.LiveTime.TotalHours > 1).ToList();

            if (!toRemove.Any())
            {
                return;
            }

            var noDisconnected = toRemove.Where(c => c.Events.Values.All(e => e.CallState != CallState.Disconnected)).ToList();

            if (noDisconnected.Count > 0)
            {
                var text = NumberToTextRus.FormatCase(noDisconnected.Count,
                                                      "Следующие {0} звонок не получили события Disconnected в течении 1 часа:\n",
                                                      "Следующие {0} звонка не получили события Disconnected в течении 1 часа:\n",
                                                      "Следующие {0} звонков не получили события Disconnected в течении 1 часа:\n"
                                                      );
                noDisconnected.ForEach(info => text += $"* CallInfo {info.LastEvent.call_id}:\n{info.EventsToText()}\n");
                loggerLostEvents.Error(text);
            }

            var lostIncome = toRemove.Where(c => c.Events.Values.All(e => e.CallState == CallState.Disconnected)).ToList();

            if (lostIncome.Count > 0)
            {
                var text = NumberToTextRus.FormatCase(lostIncome.Count,
                                                      "У следующего {0} звонка было только событие Disconnected:\n",
                                                      "У следующих {0} звонков было только событие Disconnected:\n",
                                                      "У следующих {0} звонков было только событие Disconnected:\n"
                                                      );
                lostIncome.ForEach(info => text += $"* CallInfo {info.LastEvent.call_id}:\n{info.EventsToText()}\n");
                loggerLostEvents.Error(text);
            }
            //Удаляем
            foreach (var call in toRemove)
            {
                Calls.TryRemove(call.LastEvent.call_id, out var callNull);
            }

            var activeCallsCount =
                Calls.Count(p => p.Value.Events.Values.All(e => e.CallState != CallState.Disconnected));

            logger.Info($"Забыта информация о {toRemove.Count} звонках. Всего сервер знает о {Calls.Count} звонках, из них {activeCallsCount} активных.");
        }
コード例 #14
0
        void UpdateNextIssue(EmployeeProcessingJournalNode[] nodes)
        {
            var progressPage = NavigationManager.OpenViewModel <ProgressWindowViewModel>(null);
            var progress     = progressPage.ViewModel.Progress;

            loggerProcessing.Info($"Пересчет даты следующией выдачи для {nodes.Length} сотрудников");
            loggerProcessing.Info($"База данных: {dataBaseInfo.Name}");

            progress.Start(nodes.Length + 1, text: "Загружаем сотрудников");
            var employees = UoW.GetById <EmployeeCard>(nodes.Select(x => x.Id));

            int step = 0;

            foreach (var employee in employees)
            {
                progress.Add(text: $"Обработка {employee.ShortName}");
                step++;
                var oldDates = employee.WorkwearItems.Select(x => x.NextIssue).ToArray();
                employee.UpdateNextIssueAll();
                var changes = employee.WorkwearItems.Select((x, i) => x.NextIssue?.Date != oldDates[i]?.Date ? $"Изменена дата следующей выдачи с {oldDates[i]:d} на {x.NextIssue:d} для потребности [{x.Title}]" : null)
                              .Where(x => x != null).ToArray();
                if (changes.Length > 0)
                {
                    Results[employee.Id] = NumberToTextRus.FormatCase(changes.Length, "изменена {0} строка", "изменено {0} строки", "изменено {0} строк");
                    foreach (var message in changes)
                    {
                        loggerProcessing.Info(message);
                    }
                }
                else
                {
                    Results[employee.Id] = "Без изменений";
                }
                UoW.Save(employee);
                if (step % 10 == 0)
                {
                    UoW.Commit();
                }
            }
            progress.Add(text: "Готово");
            UoW.Commit();
            NavigationManager.ForceClosePage(progressPage, CloseSource.FromParentPage);
            Refresh();
        }
コード例 #15
0
        void UpdateOrdersInfo()
        {
            textOrdersInfo.Buffer.Text = ViewModel.GetOrdersInfo(addressesWithoutCoordinats, addressesWithoutRoutes, totalBottlesCountAtDay, bottlesWithoutRL);

            if (progressOrders.Adjustment != null)
            {
                progressOrders.Adjustment.Upper = ViewModel.OrdersOnDay.Count;
                progressOrders.Adjustment.Value = ViewModel.OrdersOnDay.Count - addressesWithoutRoutes;
            }
            if (!ViewModel.OrdersOnDay.Any())
            {
                progressOrders.Text = string.Empty;
            }
            else if (addressesWithoutRoutes == 0)
            {
                progressOrders.Text = "Готово.";
            }
            else
            {
                progressOrders.Text = NumberToTextRus.FormatCase(addressesWithoutRoutes, "Остался {0} заказ", "Осталось {0} заказа", "Осталось {0} заказов");
            }
        }
コード例 #16
0
ファイル: OrmReference.cs プロジェクト: kozlov-d/QSProjects
        protected void OnButtonEditClicked(object sender, EventArgs e)
        {
            if (!CanEdit)
            {
                MessageDialogHelper.RunWarningDialog("У вас нет прав для редактирования этого документа.");
                return;
            }
            if (OrmMain.GetObjectDescription(objectType).SimpleDialog)
            {
                EntityEditSimpleDialog.RunSimpleDialog(this.Toplevel as Window, objectType, ytreeviewRef.GetSelectedObjects().First());
            }
            else
            {
                var selected = ytreeviewRef.GetSelectedObjects();

                var text = NumberToTextRus.FormatCase(selected.Length,
                                                      "Вы действительно хотите открыть {0} вкладку?",
                                                      "Вы действительно хотите открыть {0} вкладки?",
                                                      "Вы действительно хотите открыть {0} вкладок?"
                                                      );

                if (selected.Length > 5 && !MessageDialogHelper.RunQuestionDialog(text))
                {
                    return;
                }

                foreach (var one in selected)
                {
                    TabParent.OpenTab(DialogHelper.GenerateDialogHashName(objectType, DomainHelper.GetId(one)),
                                      () => OrmMain.CreateObjectDialog(objectType, one),
                                      this,
                                      canSlided: selected.Length == 1
                                      );
                }
            }
        }
コード例 #17
0
        public static async Task RunAsync(string baseAddress, AuthenticationHeaderValue authentication)
        {
            if (httpClient == null)
            {
                httpClient = new HttpClient();
                Fiscalization.baseAddress = baseAddress;
                httpClient.BaseAddress    = new Uri(baseAddress);
                httpClient.DefaultRequestHeaders.Accept.Clear();
                httpClient.DefaultRequestHeaders.Authorization = authentication;
                httpClient.DefaultRequestHeaders.Accept.Add(
                    new MediaTypeWithQualityHeaderValue("application/json")
                    );
            }
            logger.Info(string.Format("Авторизация и проверка фискального регистратора..."));
            FinscalizatorStatusResponseDTO response = await GetSatusAsync("fn/v1/status");

            if (response != null)
            {
                switch (response.Status)
                {
                case FiscalRegistratorStatus.Associated:
                    logger.Warn("Клиент успешно связан с розничной точкой, но касса еще ни разу не вышла на связь и не сообщила свое состояние.");
                    return;

                case FiscalRegistratorStatus.Failed:
                    logger.Warn("Проблемы получения статуса фискального накопителя. Этот статус не препятствует добавлению документов для фискализации. " +
                                "Все документы будут добавлены в очередь на сервере и дождутся момента когда касса будет в состоянии их фискализировать.");
                    break;

                case FiscalRegistratorStatus.Ready:
                    logger.Info("Соединение с фискальным накопителем установлено и его состояние позволяет фискализировать чеки.");
                    break;

                default:
                    logger.Warn(string.Format("Провал с сообщением: \"{0}\".", response.Message));
                    return;
                }
            }
            else
            {
                logger.Warn("Провал. Нет ответа от сервиса.");
                return;
            }

            logger.Info("Подготовка документов к отправке на сервер фискализации...");
            int sent = 0, sentBefore = 0, notValid = 0, receiptsToSend = 0;

            using (IUnitOfWork uow = UnitOfWorkFactory.CreateWithoutRoot("[Fisk] Получение подходящих заказов и чеков (если они есть)...")) {
                var ordersAndReceiptNodes = GetReceiptsForOrders(uow);
                var withoutReceipts       = ordersAndReceiptNodes.Where(r => r.ReceiptId == null);
                var withNotSentReceipts   = ordersAndReceiptNodes.Where(r => r.ReceiptId.HasValue && r.WasSent != true);
                var cashier = uow.GetById <Employee>(new BaseParametersProvider().DefaultSalesReceiptCashierId).ShortName;
                receiptsToSend = withoutReceipts.Count() + withNotSentReceipts.Count();

                if (receiptsToSend <= 0)
                {
                    logger.Info("Нет документов для отправки.");
                    return;
                }

                if (withoutReceipts.Any())
                {
                    var ordersWithoutReceipts = uow.GetById <Order>(withoutReceipts.Select(n => n.OrderId));
                    foreach (var o in ordersWithoutReceipts)
                    {
                        logger.Info(string.Format("Подготовка документа \"№{0}\" к отправке...", o.Id));
                        var newReceipt = new CashReceipt {
                            Order = o
                        };
                        var doc = new SalesDocumentDTO(o, cashier);
                        if (!doc.IsValid)
                        {
                            notValid++;
                        }
                        await SendSalesDocumentAsync(newReceipt, doc);

                        uow.Save(newReceipt);
                        if (newReceipt.Sent)
                        {
                            logger.Info(string.Format("Чек для заказа \"№{0}\" отправлен", o.Id));
                            sent++;
                        }
                        continue;
                    }
                }

                if (withNotSentReceipts.Any())
                {
                    var ordersWithNotSentReceipts = uow.GetById <Order>(withNotSentReceipts.Select(n => n.OrderId));
                    var notSentReceipts           = uow.GetById <CashReceipt>(withNotSentReceipts.Select(n => n.ReceiptId.Value));
                    foreach (var r in notSentReceipts)
                    {
                        if (r.Sent)
                        {
                            sentBefore++;
                            continue;
                        }
                        logger.Info(string.Format("Подготовка документа \"№{0}\" к переотправке...", r.Order.Id));
                        var doc = new SalesDocumentDTO(r.Order, cashier);
                        if (!doc.IsValid)
                        {
                            notValid++;
                        }
                        await SendSalesDocumentAsync(r, doc);

                        uow.Save(r);
                        if (r.Sent)
                        {
                            logger.Info(string.Format("Чек для заказа \"№{0}\" переотправлен", r.Order.Id));
                            sent++;
                        }
                        continue;
                    }
                }
                uow.Commit();
            }

            logger.Info(
                string.Format(
                    "За текущую сессию {0} {1} {2} из {3}.",
                    NumberToTextRus.Case(sent, "был отправлен", "было отправлено", "было отправлено"),
                    sent,
                    NumberToTextRus.Case(sent, "чек", "чека", "чеков"),
                    receiptsToSend
                    )
                );
            if (sentBefore > 0)
            {
                logger.Info(
                    string.Format(
                        "{0} {1} ранее.",
                        sentBefore,
                        NumberToTextRus.Case(sentBefore, "документ был отправлен", "документа было отправлено", "документов было отправлено")
                        )
                    );
            }
            if (notValid > 0)
            {
                logger.Info(
                    string.Format(
                        "{0} {1}.",
                        notValid,
                        NumberToTextRus.Case(notValid, "документ не валиден", "документа не валидно", "документов не валидно")
                        )
                    );
            }
        }
コード例 #18
0
        private void SendForOrdersWithNotSendReceipts(IUnitOfWork uow, IEnumerable <ReceiptForOrderNode> nodes, ref int notValidCount)
        {
            IList <PreparedReceiptNode> receiptNodesToSend = new List <PreparedReceiptNode>();
            int sentBefore = 0;

            foreach (var receipt in uow.GetById <CashReceipt>(nodes.Select(n => n.ReceiptId).Where(x => x.HasValue).Select(x => x.Value)))
            {
                if (receipt.Sent)
                {
                    sentBefore++;
                    continue;
                }

                var doc = new SalesDocumentDTO(receipt.Order, receipt.Order.Contract?.Organization?.Leader?.ShortName);

                CashBox cashBox = null;
                if (receipt.Order.Contract?.Organization?.CashBoxId != null)
                {
                    cashBox = cashBoxes.FirstOrDefault(x => x.Id == receipt.Order.Contract.Organization.CashBoxId);
                }

                if (doc.IsValid && cashBox != null)
                {
                    var newPreparedReceiptNode = new PreparedReceiptNode {
                        CashReceipt      = receipt,
                        SalesDocumentDTO = doc,
                        CashBox          = cashBox
                    };

                    receiptNodesToSend.Add(newPreparedReceiptNode);

                    if (receiptNodesToSend.Count >= maxReceiptsAllowedToSendInOneGo)
                    {
                        break;
                    }
                }
                else
                {
                    if (cashBox == null)
                    {
                        logger.Warn($"Для заказа №{receipt.Order.Id} не удалось подобрать кассовый аппарат для отправки. Пропускаю");
                    }

                    notValidCount++;
                    receipt.HttpCode = 0;
                    receipt.Sent     = false;
                    uow.Save(receipt);
                }
            }

            if (sentBefore > 0)
            {
                logger.Info($"{sentBefore} {NumberToTextRus.Case(sentBefore, "документ был отправлен", "документа было отправлено", "документов было отправлено")} ранее.");
            }

            logger.Info($"Количество чеков для переотправки: {receiptNodesToSend.Count} (Макс.: {maxReceiptsAllowedToSendInOneGo})");
            if (!receiptNodesToSend.Any())
            {
                return;
            }

            var result = salesReceiptSender.SendReceipts(receiptNodesToSend.ToArray());

            foreach (var sendReceiptNode in result)
            {
                sendReceiptNode.CashReceipt.Sent     = sendReceiptNode.SendResultCode == HttpStatusCode.OK;
                sendReceiptNode.CashReceipt.HttpCode = (int)sendReceiptNode.SendResultCode;
                uow.Save(sendReceiptNode.CashReceipt);
            }
        }
コード例 #19
0
        private void RefreshData()
        {
            if (_counterparty == null)
            {
                buttonSaveComment.Sensitive = false;
                return;
            }

            labelName.Text = _counterparty.FullName;
            SetupPersonalManagers();
            textviewComment.Buffer.Text = _counterparty.Comment;

            var latestOrder = _orderRepository.GetLatestCompleteOrderForCounterparty(InfoProvider.UoW, _counterparty);

            if (latestOrder != null)
            {
                var daysFromLastOrder = (DateTime.Today - latestOrder.DeliveryDate.Value).Days;
                labelLatestOrderDate.Text = string.Format(
                    "{0} ({1} {2} назад)",
                    latestOrder.DeliveryDate.Value.ToShortDateString(),
                    daysFromLastOrder,
                    NumberToTextRus.Case(daysFromLastOrder, "день", "дня", "дней")
                    );
            }
            else
            {
                labelLatestOrderDate.Text = "(Выполненных заказов нет)";
            }

            var currentOrders = _orderRepository.GetCurrentOrders(InfoProvider.UoW, _counterparty);

            ytreeCurrentOrders.SetItemsSource <Order>(currentOrders);
            vboxCurrentOrders.Visible = currentOrders.Count > 0;

            foreach (var child in PhonesTable.Children)
            {
                PhonesTable.Remove(child);
                child.Destroy();
            }

            uint rowsCount = Convert.ToUInt32(_counterparty.Phones.Count) + 1;

            PhonesTable.Resize(rowsCount, 2);
            for (uint row = 0; row < rowsCount - 1; row++)
            {
                Label label = new Label();
                label.Selectable = true;
                label.Markup     = $"{_counterparty.Phones[Convert.ToInt32(row)].LongText}";

                HandsetView handsetView = new HandsetView(_counterparty.Phones[Convert.ToInt32(row)].DigitsNumber);

                PhonesTable.Attach(label, 0, 1, row, row + 1);
                PhonesTable.Attach(handsetView, 1, 2, row, row + 1);
            }

            Label labelAddPhone = new Label()
            {
                LabelProp = "Щёлкните чтобы\n добавить телефон-->"
            };

            PhonesTable.Attach(labelAddPhone, 0, 1, rowsCount - 1, rowsCount);

            Image addIcon = new Image();

            addIcon.Pixbuf = Stetic.IconLoader.LoadIcon(this, "gtk-add", IconSize.Menu);
            Button btn = new Button();

            btn.Image    = addIcon;
            btn.Clicked += OnBtnAddPhoneClicked;
            PhonesTable.Attach(btn, 1, 2, rowsCount - 1, rowsCount);
            PhonesTable.ShowAll();
            btn.Sensitive = buttonSaveComment.Sensitive = _counterpartyPermissionResult.CanUpdate && _counterparty.Id != 0;
        }
コード例 #20
0
        void UpdateDocs()
        {
            if (CurDocType == null)
            {
                return;
            }
            logger.Info("Запрос документов в базе...");
            DocsListStore.Clear();

            string sqlExtra = "";

            if (CurDocType.DBTableExsist)
            {
                sqlExtra = "LEFT JOIN extra_" + CurDocType.DBTableName + " ON extra_" + CurDocType.DBTableName +
                           ".doc_id = docs.id ";
            }
            string sql = "SELECT * FROM docs " + sqlExtra + "WHERE docs.type_id = @type_id";

            if (!selectperiodDocs.IsAllTime)
            {
                sql += " AND date BETWEEN @startdate AND @enddate";
            }
            if (entryDocNumber.Text.Length > 0)
            {
                sql += string.Format(" AND number LIKE '%{0}%' ", entryDocNumber.Text);
            }
            QSMain.CheckConnectionAlive();
            MySqlCommand cmd = new MySqlCommand(sql, QSMain.connectionDB);

            if (comboDocType.GetActiveIter(out TreeIter iter))
            {
                cmd.Parameters.AddWithValue("@type_id", comboDocType.Model.GetValue(iter, 1));
            }
            cmd.Parameters.AddWithValue("@startdate", selectperiodDocs.DateBegin);
            cmd.Parameters.AddWithValue("@enddate", selectperiodDocs.DateEnd);
            MySqlDataReader rdr = cmd.ExecuteReader();

            while (rdr.Read())
            {
                object[] Values = new object[4 + UsedExtraFields];
                Values[0] = rdr.GetInt32("id");
                if (rdr["number"] != DBNull.Value)
                {
                    Values[1] = rdr.GetString("number");
                }
                else
                {
                    Values[1] = "";
                }
                if (rdr["date"] != DBNull.Value)
                {
                    Values[2] = string.Format("{0:d}", rdr.GetDateTime("date"));
                }
                else
                {
                    Values[2] = "";
                }
                Values[3] = string.Format("{0}", rdr.GetDateTime("create_date"));

                if (CurDocType.FieldsList != null)
                {
                    foreach (DocFieldInfo item in CurDocType.FieldsList)
                    {
                        if (!item.Display && !item.Search)
                        {
                            continue;
                        }
                        switch (item.Type)
                        {
                        case "varchar":
                            if (rdr[item.DBName] != DBNull.Value)
                            {
                                Values[item.ListStoreColumn] = rdr.GetString(item.DBName);
                            }
                            else
                            {
                                Values[item.ListStoreColumn] = "";
                            }
                            break;
                        }
                    }
                }

                DocsListStore.AppendValues(Values);
            }
            rdr.Close();
            OnTreeviewDocsCursorChanged(null, null);
            int totaldoc = DocsListStore.IterNChildren();

            logger.Info(NumberToTextRus.FormatCase(totaldoc,
                                                   "Получен {0} документ.",
                                                   "Получено {0} документа.",
                                                   "Получено {0} документов."));
        }
コード例 #21
0
        void UpdateJournal(bool nextPage = false)
        {
            DateTime startTime = DateTime.Now;

            if (!nextPage)
            {
                takenRows = 0;
                takenAll  = false;
            }

            if (!canUpdate)
            {
                return;
            }

            logger.Info("Получаем журнал изменений{0}...", takenRows > 0 ? $"({takenRows}+)" : "");
            ChangeSet changeSetAlias = null;

            var query = UoW.Session.QueryOver <ChangedEntity>()
                        .JoinAlias(ce => ce.ChangeSet, () => changeSetAlias)
                        .Fetch(SelectMode.Fetch, x => x.ChangeSet)
                        .Fetch(SelectMode.Fetch, x => x.ChangeSet.User);

            if (!selectperiod.IsAllTime)
            {
                query.Where(ce => ce.ChangeTime >= selectperiod.DateBegin && ce.ChangeTime < selectperiod.DateEnd);
            }

            if (entryUser.Subject != null)
            {
                query.Where(() => changeSetAlias.User.Id == entryUser.SubjectId);
            }

            if (entryObject3.Subject is HistoryTraceObjectNode selectedClassType)
            {
                query.Where(ce => ce.EntityClassName == selectedClassType.ObjectName);
            }

            if (comboAction.SelectedItem is EntityChangeOperation)
            {
                query.Where(ce => ce.Operation == (EntityChangeOperation)comboAction.SelectedItem);
            }

            if (!string.IsNullOrWhiteSpace(entrySearchEntity.Text))
            {
                var pattern = $"%{entrySearchEntity.Text}%";
                query.Where(ce => ce.EntityTitle.IsLike(pattern));
            }

            if (!string.IsNullOrWhiteSpace(entSearchId.Text))
            {
                if (int.TryParse(entSearchId.Text, out int id))
                {
                    query.Where(ce => ce.EntityId == id);
                }
            }

            if (!string.IsNullOrWhiteSpace(entrySearchValue.Text) || entryProperty.Subject is HistoryTracePropertyNode)
            {
                FieldChange fieldChangeAlias = null;
                query.JoinAlias(ce => ce.Changes, () => fieldChangeAlias);

                if (entryProperty.Subject is HistoryTracePropertyNode selectedProperty)
                {
                    query.Where(() => fieldChangeAlias.Path == selectedProperty.PropertyPath);
                }

                if (!string.IsNullOrWhiteSpace(entrySearchValue.Text))
                {
                    var pattern = $"%{entrySearchValue.Text}%";
                    query.Where(
                        () => fieldChangeAlias.OldValue.IsLike(pattern) || fieldChangeAlias.NewValue.IsLike(pattern)
                        );
                }
            }

            try{
                var taked = query.OrderBy(x => x.ChangeTime).Desc
                            .Skip(takenRows)
                            .Take(pageSize)
                            .List();

                if (takenRows > 0)
                {
                    changedEntities.AddRange(taked);
                    datatreeChangesets.YTreeModel.EmitModelChanged();
                }
                else
                {
                    changedEntities = taked.ToList();
                    datatreeChangesets.ItemsDataSource = changedEntities;
                }

                if (taked.Count < pageSize)
                {
                    takenAll = true;
                }
            } catch (GenericADOException ex) {
                if (ex?.InnerException?.InnerException?.InnerException?.InnerException?.InnerException is System.Net.Sockets.SocketException exception &&
                    exception.SocketErrorCode == System.Net.Sockets.SocketError.TimedOut)
                {
                    MessageDialogHelper.RunWarningDialog("Превышен интервал ожидания ответа от сервера:\n" +
                                                         "Попробуйте выбрать меньший интервал времени\n" +
                                                         "или уточнить условия поиска");
                }
            }

            takenRows = changedEntities.Count;

            logger.Debug("Время запроса {0}", DateTime.Now - startTime);
            logger.Info(NumberToTextRus.FormatCase(changedEntities.Count, "Загружено изменение {0}{1} объекта.", "Загружено изменение {0}{1} объектов.", "Загружено изменение {0}{1} объектов.", takenAll ? "" : "+"));
        }
コード例 #22
0
        void UpdateLastIssue(EmployeeProcessingJournalNode[] nodes)
        {
            var progressPage = NavigationManager.OpenViewModel <ProgressWindowViewModel>(null);
            var progress     = progressPage.ViewModel.Progress;

            loggerProcessing.Info($"Пересчет сроков носки получного для {nodes.Length} сотрудников");
            loggerProcessing.Info($"База данных: {dataBaseInfo.Name}");

            progress.Start(nodes.Length + 2, text: "Загружаем сотрудников");
            var employees = UoW.GetById <EmployeeCard>(nodes.Select(x => x.Id)).ToArray();

            progress.Add(text: $"Получаем последние выдачи");
            var employeeIssueRepository = AutofacScope.Resolve <EmployeeIssueRepository>(new TypedParameter(typeof(IUnitOfWork), UoW));
            var operations = employeeIssueRepository.GetLastIssueOperationsForEmployee(employees);
            int step       = 0;

            foreach (var employee in employees)
            {
                progress.Add(text: $"Обработка {employee.ShortName}");
                step++;
                var employeeOperations = operations.Where(x => x.Employee.IsSame(employee)).ToList();
                if (employeeOperations.Count == 0)
                {
                    Results[employee.Id] = "Нет выданного";
                    continue;
                }
                int changes = 0;
                foreach (var operation in employeeOperations)
                {
                    if (operation.ProtectionTools == null)
                    {
                        continue;
                    }
                    var oldDate = operation.ExpiryByNorm;
                    var graph   = IssueGraph.MakeIssueGraph(UoW, employee, operation.ProtectionTools);
                    operation.RecalculateDatesOfIssueOperation(graph, baseParameters, interactive);
                    if (operation.ExpiryByNorm?.Date != oldDate?.Date)
                    {
                        UoW.Save(operation);
                        loggerProcessing.Info($"Изменена дата окончания носки с {oldDate:d} на {operation.ExpiryByNorm:d} для выдачи {operation.OperationTime} [{operation.Title}]");
                        changes++;
                        var item = employee.WorkwearItems.FirstOrDefault(x => x.ProtectionTools.IsSame(operation.ProtectionTools));
                        if (item != null)
                        {
                            var lastDate = item.NextIssue;
                            item.UpdateNextIssue(UoW);
                            if (item.NextIssue?.Date != lastDate?.Date)
                            {
                                loggerProcessing.Info($"Изменена дата следующей выдачи с {lastDate:d} на {item.NextIssue:d} для потребности [{item.Title}]");
                            }
                        }
                    }
                }
                if (changes > 0)
                {
                    Results[employee.Id] = NumberToTextRus.FormatCase(changes, "изменена {0} дата", "изменено {0} даты", "изменено {0} дат");
                    UoW.Save(employee);
                }
                else
                {
                    Results[employee.Id] = "Без изменений";
                }
                if (step % 10 == 0)
                {
                    UoW.Commit();
                }
            }
            progress.Add(text: "Готово");
            UoW.Commit();
            NavigationManager.ForceClosePage(progressPage, CloseSource.FromParentPage);
            Refresh();
        }
コード例 #23
0
 private static string ActiveUowCountText()
 {
     return(NumberToTextRus.FormatCase(RegisteredUoWs.Count, "Сейчас {0} активный UnitOfWork.", "Сейчас {0} активных UnitOfWork.", "Сейчас {0} активных UnitOfWork."));
 }
コード例 #24
0
        void UpdateJournal(bool nextPage = false)
        {
            DateTime startTime = DateTime.Now;

            if (!nextPage)
            {
                takenRows = 0;
                takenAll  = false;
            }

            if (!canUpdate)
            {
                return;
            }

            logger.Info("Получаем журнал изменений{0}...", takenRows > 0 ? $"({takenRows}+)" : "");
            ChangeSet changeSetAlias = null;

            var query = UoW.Session.QueryOver <ChangedEntity>()
                        .JoinAlias(ce => ce.ChangeSet, () => changeSetAlias)
                        .Fetch(x => x.ChangeSet).Eager
                        .Fetch(x => x.ChangeSet.User).Eager;

            if (!selectperiod.IsAllTime)
            {
                query.Where(ce => ce.ChangeTime >= selectperiod.DateBegin && ce.ChangeTime < selectperiod.DateEnd.AddDays(1));
            }

            var selectedClassType = (datacomboObject.SelectedItem as HistoryObjectDesc);

            if (selectedClassType != null)
            {
                query.Where(ce => ce.EntityClassName == selectedClassType.ObjectName);
            }

            if (ComboWorks.GetActiveId(comboUsers) > 0)
            {
                query.Where(() => changeSetAlias.User.Id == ComboWorks.GetActiveId(comboUsers));
            }

            if (comboAction.SelectedItem is EntityChangeOperation)
            {
                query.Where(ce => ce.Operation == (EntityChangeOperation)comboAction.SelectedItem);
            }

            if (!String.IsNullOrWhiteSpace(entrySearchEntity.Text))
            {
                var pattern = $"%{entrySearchEntity.Text}%";
                query.Where(ce => ce.EntityTitle.IsLike(pattern));
            }

            if (!String.IsNullOrWhiteSpace(entrySearchValue.Text) || comboProperty.SelectedItem is HistoryFieldDesc)
            {
                FieldChange fieldChangeAlias = null;
                query.JoinAlias(ce => ce.Changes, () => fieldChangeAlias);

                var selectedProperty = comboProperty.SelectedItem as HistoryFieldDesc;
                if (selectedProperty != null)
                {
                    query.Where(() => fieldChangeAlias.Path == selectedProperty.FieldName);
                }


                if (!String.IsNullOrWhiteSpace(entrySearchValue.Text))
                {
                    var pattern = $"%{entrySearchValue.Text}%";
                    query.Where(() => fieldChangeAlias.OldValue.IsLike(pattern) ||
                                fieldChangeAlias.NewValue.IsLike(pattern));
                }
            }

            var taked = query.OrderBy(x => x.ChangeTime).Desc
                        .Skip(takenRows)
                        .Take(pageSize)
                        .List();

            if (takenRows > 0)
            {
                changedEntities.AddRange(taked);
                datatreeChangesets.YTreeModel.EmitModelChanged();
            }
            else
            {
                changedEntities = taked.ToList();
                datatreeChangesets.ItemsDataSource = changedEntities;
            }

            if (taked.Count < pageSize)
            {
                takenAll = true;
            }

            takenRows = changedEntities.Count;

            logger.Debug("Время запроса {0}", DateTime.Now - startTime);
            logger.Info(NumberToTextRus.FormatCase(changedEntities.Count, "Загружено изменение {0}{1} объекта.", "Загружено изменение {0}{1} объектов.", "Загружено изменение {0}{1} объектов.", takenAll ? "" : "+"));
        }