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(); }
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(); }
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(); }
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()); }
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, "чек не валиден", "чека не валидно", "чеков не валидно")}."); } } }
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(); }
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}"; }
/// <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(); } }
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(); }
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); }
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); }
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); }
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} активных."); }
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(); }
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} заказов"); } }
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 ); } } }
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, "документ не валиден", "документа не валидно", "документов не валидно") ) ); } }
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); } }
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; }
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} документов.")); }
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 ? "" : "+")); }
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(); }
private static string ActiveUowCountText() { return(NumberToTextRus.FormatCase(RegisteredUoWs.Count, "Сейчас {0} активный UnitOfWork.", "Сейчас {0} активных UnitOfWork.", "Сейчас {0} активных UnitOfWork.")); }
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 ? "" : "+")); }