Beispiel #1
0
        public virtual DeviceStatus ValidateReceipt(Receipt receipt)
        {
            var status = new DeviceStatus();

            if (receipt.Items == null || receipt.Items.Count == 0)
            {
                status.AddError("E410", "Receipt is empty, no items");
                return(status);
            }
            if (String.IsNullOrEmpty(receipt.UniqueSaleNumber))
            {
                status.AddError("E405", "UniqueSaleNumber is empty");
                return(status);
            }
            var uniqueSaleNumberMatch = Regex.Match(receipt.UniqueSaleNumber, "^[A-Z0-9]{8}-[A-Z0-9]{4}-[0-9]{7}$");

            if (!uniqueSaleNumberMatch.Success)
            {
                status.AddError("E405", "Invalid format of UniqueSaleNumber");
                return(status);
            }
            var row = 0;

            foreach (var item in receipt.Items)
            {
                row++;
                if (String.IsNullOrEmpty(item.Text))
                {
                    status.AddError("E407", $"Item {row}: \"text\" is empty");
                }
                if (item.IsComment)
                {
                    status.AddWarning("W401", $"Item {row}: \"isComment\" is deprecated in Item {row}. Use \"type\" : \"comment\" instead");
                }

                // Validation of "type" : "sale"
                if (item.Type == ItemType.Sale)
                {
                    if (item.PriceModifierValue <= 0 && item.PriceModifierType != PriceModifierType.None)
                    {
                        status.AddError("E403", $"Item {row}: \"priceModifierValue\" should be positive number");
                    }
                    if (item.PriceModifierValue != 0 && item.PriceModifierType == PriceModifierType.None)
                    {
                        status.AddError("E403", $"Item {row}: \"priceModifierValue\" should'nt be \"none\" or empty. You can avoid setting priceModifier if you do not want price modification");
                    }
                    if (item.Quantity <= 0)
                    {
                        status.AddError("E403", $"Item {row}: \"quantity\" should be positive number");
                    }
                    if (item.TaxGroup == TaxGroup.Unspecified)
                    {
                        status.AddError("E403", $"Item {row}: \"taxGroup\" should'nt be \"unspecified\" or empty");
                    }
                    try
                    {
                        GetTaxGroupText(item.TaxGroup);
                    }
                    catch (StandardizedStatusMessageException e)
                    {
                        status.AddError(e.Code, e.Message);
                    }
                }

                if (!status.Ok)
                {
                    return(status);
                }
            }
            if (receipt.Payments?.Count > 0)
            {
                row = 0;
                foreach (var payment in receipt.Payments)
                {
                    row++;
                    if (payment.Amount <= 0)
                    {
                        status.AddError("E403", $"Payment {row}: \"amount\" should be positive number");
                    }
                    try
                    {
                        GetPaymentTypeText(payment.PaymentType);
                    }
                    catch (StandardizedStatusMessageException e)
                    {
                        status.AddError(e.Code, e.Message);
                    }
                    if (!status.Ok)
                    {
                        status.AddInfo($"Error occured at Payment {row}");
                        return(status);
                    }
                }
            }
            return(status);
        }