Beispiel #1
0
 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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
 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()
     });
 }
Beispiel #5
0
        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));
        }
Beispiel #6
0
        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);
        }