public void  PrinterOrderReceipt(MainOrder order)
       {
          Log(string.Format("printing order id={0}", order.Id));
           var printer = new FiscalPrinterUtility(comPort, comSpeed);

           if (!FiscalPrinterHelper._isConnected)
           {
               printer.ConnectFiscalPrinter();
           }
           
           if (printer.OpenFiscalPrinter())
           {
                   int casesQuantity = 0;
                   double calculatedTotal = 0.0;
                   decimal cumulativeTotal = 0m;
                   int pricePrecision = 0;
                   int quantityPrecision = 0;
                   foreach (var item in order.ItemSummary)
                   {
                       var vat = item.VatValue;
                       string hasVAT = vat> 0 ? "A" : "B";

                      
                       if (item.Product.ReturnableType == ReturnableType.Returnable && item.Value==0)
                       {
                           continue;
                       }

                       double price = (double)Math.Truncate((item.Value + vat)*100) / 100;
                       var pricecheck = (item.Value + vat).GetTruncatedValue();

                       cumulativeTotal += Convert.ToDecimal((item.Value + vat) * (int)item.Qty);

                       var bulkQuantity = 0.0m;
                       var calulationPrice = 0.0;
                       using (var container = ObjectFactory.Container.GetNestedContainer())
                       {
                           var summaryService = container.GetInstance<IProductPackagingSummaryService>();
                          bulkQuantity = summaryService.GetProductQuantityInBulk(item.Product.Id);
                           var modulo = item.Qty%bulkQuantity;
                           if (modulo != 0)
                           {
                               casesQuantity =(int) item.Qty;
                               calulationPrice = (double) ((pricecheck));
                           }
                           else
                           {
                               casesQuantity = (int)item.Qty / (int)bulkQuantity;
                               calulationPrice = (double)(pricecheck).GetTruncatedValue();
                               calulationPrice = (double)((decimal)(calulationPrice * (double)bulkQuantity)).GetTotalGross();
                           }
                           
                       }

                       double price2 =(double) (item.Value + vat+item.ProductDiscount);
                       int quantity = (int)item.Qty;
                       
                       var line1 = item.Product.ProductCode.Trim();
                       var line2 = item.Product.Description.Trim();


                       printer.Sell(line1, line2, hasVAT.Trim(), calulationPrice, pricePrecision, casesQuantity, quantityPrecision);

                        calculatedTotal += quantity * price;

                   }

                   

                   var paidAmount = order.GetPayments.Sum(n => n.Amount);
                   var expectedPayment = order.TotalGross;
                  
                  
                   int subtotal, sumA, sumB, sumC, sumD, sumE, sumF, sumG, sumH;

                   double salediscountValue = Convert.ToDouble(order.SaleDiscount);
                   printer.SaleDiscount(1, 0, -salediscountValue, out subtotal, out sumA, out sumB, out sumC, out sumD, out sumE, out sumF, out sumG, out sumH);

                   cumulativeTotal = cumulativeTotal.GetTotalGross();
                   cumulativeTotal = (cumulativeTotal - order.SaleDiscount).GetTotalGross();
                   var value = paidAmount;
                   printer.GetTotalQ((double)value);


                  

                   printer.CloseFiscalPrinter();
               }
           
       }