예제 #1
0
 public static Task PrintReceiptAsync(ReceiptData receiptData)
 {
     return(ThreadHelper.RunInNewThreadAsync(async() =>
     {
         try
         {
             await PrintReceiptImplementationAsync(receiptData);
         }
         catch (Exception ex)
         {
             Log.Error(LogContextEnum.Device, "Receipt printing failed.", ex);
         }
     }));
 }
예제 #2
0
        private static async Task PrintReceiptImplementationAsync(ReceiptData receiptData)
        {
            if (!await SerialPortHelper.IsSerialPortPresentedAsync(ReceiptPrinterComPort))
            {
                return;
            }

            var deviceIoPortProvider = new UwpSerialPortProvider(new SerialPortSettings(ReceiptPrinterComPort, 115200, SerialStopBitCount.One, SerialParity.None));

            using (var devicePort = new DeviceIoPortDriver(deviceIoPortProvider))
            {
                await devicePort.OpenAsync();

                var messageBytes = GetReceiptBytes(receiptData);

                await devicePort.WriteAsync(messageBytes, CancellationToken.None);
            }
        }
예제 #3
0
        private static byte[] GetReceiptBytes(ReceiptData receiptData)
        {
            Assure.ArgumentNotNull(receiptData, nameof(receiptData));

            var kioskAppSettings = ComponentManager.Current.GetComponent <IKioskAppSettingsContract>().State;
            var now                = DateTime.Now;
            var kioskAddress       = kioskAppSettings.KioskAddress;
            var kioskAddressParts  = new[] { kioskAddress?.AddressLine2, kioskAddress?.City, kioskAddress?.AddressLine1 };
            var kioskAddressString = string.Join(", ", kioskAddressParts.Where(x => !string.IsNullOrEmpty(x)));

            string deliveryTypeString;

            string[] deliveryAddressParts;
            switch (receiptData.DeliveryInfo?.Type)
            {
            case EkDeliveryTypeEnum.DeliveryServiceStore:
                deliveryTypeString   = "Самовывоз из Новой Почты";
                deliveryAddressParts = new[]
                {
                    receiptData.DeliveryInfo?.Address?.City,
                    // address line contains branch number
                    receiptData.DeliveryInfo?.Address?.AddressLine1
                };
                break;

            default:
            case EkDeliveryTypeEnum.Courier:
                deliveryTypeString   = "Курьер";
                deliveryAddressParts = new[]
                {
                    receiptData.DeliveryInfo?.Address?.City,
                    receiptData.DeliveryInfo?.Address?.AddressLine1
                };
                break;
            }

            var deliveryAddressString = string.Join(", ", deliveryAddressParts.Where(x => !string.IsNullOrEmpty(x)));

            var productsStringBuilder = new StringBuilder();

            if (receiptData.Products?.Length > 0)
            {
                for (var i = 0; i < receiptData.Products.Length; i++)
                {
                    var product           = receiptData.Products[i];
                    var totalProductPrice = product.Price * product.Quantity;
                    productsStringBuilder.AppendLine(
                        $@"{EscP.ALIGN_LEFT}{i + 1}. {product.Name.FirstNSymbols(100)}
   {product.Quantity} x {product.Price.ToAmountString(false)} = {totalProductPrice.ToAmountString(false)} {product.PriceCurrencyCode}");
                }
            }

            var message = $@"{EscP.INIT}{EscP.SET_LEFT_MARGIN}{EscP.ALIGN_LEFT}{EscP.SET_B_MODE}{EscP.SET_BOLD}Номер терминала: {EscP.CLEAR_BOLD}{kioskAppSettings.KioskId}
{EscP.SET_BOLD}Адрес терминала: {EscP.CLEAR_BOLD}{kioskAddressString}
{EscP.SET_BOLD}Дата: {EscP.CLEAR_BOLD}{now:dd.MM.yyyy} {EscP.SET_BOLD}Время: {EscP.CLEAR_BOLD}{now:HH:mm:ss}
{EscP.SET_BOLD}Номер операции: {EscP.CLEAR_BOLD}{receiptData.ReceiptNumber}

{EscP.SET_A_MODE}{EscP.ALIGN_CENTER}{EscP.SET_BOLD}ЗАКАЗ ТОВАРОВ/УСЛУГ{EscP.CLEAR_BOLD}{EscP.SET_B_MODE}
{productsStringBuilder}{EscP.ALIGN_LEFT}{EscP.SET_BOLD}ИТОГО: {EscP.CLEAR_BOLD}{EscP.ALIGN_RIGHT}{receiptData.TotalPrice.ToAmountString(false)} {receiptData.TotalPriceCurrencyCode}

{EscP.ALIGN_LEFT}{EscP.SET_BOLD}Заказчик: {EscP.CLEAR_BOLD}{receiptData.CustomerInfo?.FullName}
{EscP.SET_BOLD}Телефон: {EscP.CLEAR_BOLD}{receiptData.CustomerInfo?.Phone}
{EscP.SET_BOLD}Доставка: {EscP.CLEAR_BOLD}{deliveryTypeString}
{EscP.SET_BOLD}Адрес: {EscP.CLEAR_BOLD}{deliveryAddressString}

{EscP.SET_A_MODE}{EscP.ALIGN_CENTER}{EscP.SET_BOLD}ИНСТРУКЦИЯ{EscP.CLEAR_BOLD}{EscP.SET_B_MODE}
{EscP.ALIGN_LEFT}1. В течении 1 минуты Вы получите СМС с инструкциями по оплате.
2. Выберите и оплатите заказ удобным способом оплаты.
3. Следите за статусом заказа и доставки с помощью СМС.

{EscP.SET_A_MODE}{EscP.ALIGN_CENTER}{EscP.SET_BOLD}ИЛИ ОПЛАТИТЕ В БАНКЕ ПО РЕКВИЗИТАМ{EscP.CLEAR_BOLD}{EscP.SET_B_MODE}
{EscP.ALIGN_LEFT}ФОП ""Дубина Л. В.""
14000, Чернігівська обл., м. Чернігів,
вул. Проспект Перемоги, 90/78
UA383052990000026009016303944
в АТ КБ ""ПРИВАТБАНК""
МФО 353586
ЄДРПОУ 2092012427
Платник єдиного податку на 
спрощеній системі оподаткування.
Сума {receiptData.TotalPrice.ToAmountString(false)} {receiptData.TotalPriceCurrencyCode}


{EscP.SET_A_MODE}{EscP.ALIGN_CENTER}{EscP.SET_BOLD}ДЯКУЄМО!{EscP.CLEAR_BOLD}{EscP.SET_B_MODE}

{EscP.SET_BOLD}Телефон контакт-центра:
{kioskAppSettings.SupportPhone}

{EscP.FORM_FEED}";

            message = message.Replace("\r", "");

            // todo: REMOVE AND FIX UKR LANGUAGE
            message = message
                      .Replace('І', 'I')
                      .Replace('і', 'i')
                      .Replace('Ї', 'I')
                      .Replace('ї', 'i')
                      .Replace('Є', 'E')
                      .Replace('є', 'e');

            // todo: should we make this only once?
            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
            var cyrillicEncoding = Encoding.GetEncoding(866);
            var messageBytes     = cyrillicEncoding.GetBytes(message);

            return(messageBytes);
        }