public static bool IsValid(this ReceiptMainInfo receiptInfo) { return(!(string.IsNullOrEmpty(receiptInfo.FiscalDocument) || string.IsNullOrEmpty(receiptInfo.FiscalNumber) || string.IsNullOrEmpty(receiptInfo.FiscalSign) || receiptInfo.PurchaseTime.Equals(DateTime.MinValue))); }
public async Task HandleAsync(UserMessageInfo userMessageInfo) { ReceiptMainInfo data = userMessageInfo.Message.ReceiptInfo; if (data == null) { await Messenger.SendMessageAsync(userMessageInfo, Resources.ParsePhotoError, true); Logger.Trace(Resources.ParsePhotoError); return; } BillingPeriod lastBillingPeriod = await _billingPeriodService.GetLastByGroupIdAsync(userMessageInfo.Group.Id); if (lastBillingPeriod == null) { await Messenger.SendMessageAsync(userMessageInfo, Resources.BillingPeriodNotCreated, true); return; } var receipt = new Receipt { BillingPeriodId = lastBillingPeriod.Id, TotalAmount = data.TotalAmount, FiscalSign = data.FiscalSign, FiscalDocument = data.FiscalDocument, FiscalNumber = data.FiscalNumber, PurchaseTime = data.PurchaseTime, Status = ReceiptStatus.New, Comment = "Чек", }; if (await ReceiptService.IsReceiptExists(receipt)) { await Messenger.SendMessageAsync(userMessageInfo, Resources.ReceiptAlredyAdded, true); return; } var newReceipt = await ReceiptService.AddAsync(receipt); IMenu menu = MenuProvider.GetMenu(userMessageInfo, new AddReceiptQueryData { MenuType = MenuType.NewReceiptSelectCustomer, ReceiptId = newReceipt.Id, SelectedCustomerId = null, SelectedConsumerIds = new long[0], TargetId = null, Version = AddReceiptQueryData.ServerVersion, }); await Messenger.SendMessageAsync(userMessageInfo, Resources.SelectCustomer, true, menu); }
public async Task <bool> ReceiptExistsAsync(ReceiptMainInfo receiptInfo) { var url = Urls.GetCheckUrl(receiptInfo.FiscalNumber, receiptInfo.FiscalDocument, receiptInfo.FiscalSign, receiptInfo.PurchaseTime, (decimal)receiptInfo.TotalAmount); var response = await url.WithClient(_client).GetAsync(); var result = new CheckFnsResult { IsSuccess = response.IsSuccessStatusCode, Message = await response.Content.ReadAsStringAsync(), ReceiptExists = response.IsSuccessStatusCode, StatusCode = response.StatusCode }; return(result.ReceiptExists); }
public static ReceiptInfo ToCore(this FnsReceiptDetailInfo detailInfo, ReceiptMainInfo receiptMainInfo) { return(new ReceiptInfo { PurchaseTime = receiptMainInfo.PurchaseTime, FiscalSign = receiptMainInfo.FiscalSign, FiscalDocument = receiptMainInfo.FiscalDocument, FiscalNumber = receiptMainInfo.FiscalNumber, TotalAmount = (double)detailInfo.TotalSum / 100, RetailAddress = detailInfo.RetailPlaceAddress, RetailInn = detailInfo.RetailInn, CompanyName = detailInfo.StoreName, CashierName = detailInfo.Cashier, Items = detailInfo.Items.Select(x => x.ToCore()).ToArray() }); }
public async Task <ReceiptInfo> GetReceiptInfoAsync(ReceiptMainInfo data) { if (data == null) { throw new ArgumentNullException(nameof(data)); } bool receiptExists = await _fnsService.ReceiptExistsAsync(data); if (!receiptExists) { return(null); } var settings = _cashlogSettingsService.ReadSettings(); var detailInfo = await _fnsService.GetReceiptAsync(data, settings.FnsPhone, settings.FnsPassword); return(detailInfo?.ToCore(data)); }
public async Task <FnsReceiptDetailInfo> GetReceiptAsync(ReceiptMainInfo receiptInfo, string phone, string password) { if (!await ReceiptExistsAsync(receiptInfo)) { return(null); } // Формируем запрос. IFlurlRequest request = Urls.GetReceiveUrl(receiptInfo.FiscalNumber, receiptInfo.FiscalDocument, receiptInfo.FiscalSign).WithClient(_client); request = AddRequiredHeaders(request); request = AddAuthorizationHeaders(request, phone, password); // Запрашиваем данные из ФНС. HttpResponseMessage response = null; const int retires = 4; for (int i = 0; i < retires; i++) { try { response = await request.GetAsync(); if (response.StatusCode != HttpStatusCode.Accepted) { break; } await Task.Delay(TimeSpan.FromMilliseconds(500)); } catch (Exception ex) { _logger.Error($"Во время выполнения запроса информации о чеке (попытка №{i}) произошло исключение", ex); } } if (response == null || response.StatusCode != HttpStatusCode.OK) { return(null); } var result = new ReceiptFnsResult { IsSuccess = response.IsSuccessStatusCode, StatusCode = response.StatusCode, }; // Десериализуем ответ. try { string json = await response.Content.ReadAsStringAsync(); if (!string.IsNullOrEmpty(json)) { result.Document = JsonConvert.DeserializeObject <RootObject>(json).Document; } } catch (Exception ex) { _logger.Error($"Во время десериализации информации о чеке произошло исключение", ex); } if (result.Document?.ReceiptInfo == null) { return(null); } return(result.Document?.ReceiptInfo); }