void ConfigureFiscalPrinter()
        {

            int port = 2;
            int portSpeed = 115200;
            using (var c = NestedContainer)
            {
                var printerRepo = Using<IGeneralSettingRepository>(c);
                var printerEnabled = printerRepo.GetByKey(GeneralSettingKey.FiscalPrinterEnabled);
                if (printerEnabled != null && !string.IsNullOrEmpty(printerEnabled.SettingValue))
                {

                    bool enabled = Boolean.Parse(printerEnabled.SettingValue);
                    _printerUtility = null;
                    if (!enabled) return;

                    var portSetting = printerRepo.GetByKey(GeneralSettingKey.FiscalPrinterPort);
                    if (portSetting != null && !string.IsNullOrEmpty(portSetting.SettingValue))
                    {
                        port = Convert.ToInt32(portSetting.SettingValue);
                    }
                    var portSpeedSetting = printerRepo.GetByKey(GeneralSettingKey.FiscalPrinterPortSpeed);
                    if (portSpeedSetting != null && !string.IsNullOrEmpty(portSpeedSetting.SettingValue))
                    {
                        portSpeed = Convert.ToInt32(portSpeedSetting.SettingValue);
                    }
                    _printerUtility = new FiscalPrinterUtility(port, portSpeed) { IsEnabled = enabled };
                }
            }

        }
       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();
               }
           
       }
 public static void Reinitialize(int port,int comSpeed)
 {
     var fiscalPrinter = new FiscalPrinterUtility(port, comSpeed);
     fiscalPrinter.ConnectFiscalPrinter();
 }
      public void PrintNonFiscalOrderReceipt(MainOrder order)
      {
          Log(string.Format("printing non fiscal order id={0}", order.Id));
          var printer = new FiscalPrinterUtility(comPort, comSpeed);

          if (!FiscalPrinterHelper._isConnected)
          {
              printer.ConnectFiscalPrinter();
          }

          if (printer.OpenNonFiscalPrinter())
          {
              int casesQuantity = 0;
              var spaces = string.Empty;
              foreach (var item in order.ItemSummary)
              {
                  if (item.Product.ReturnableType == ReturnableType.Returnable &&item.Value==0)
                  {
                      continue;
                  }

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

                  var bulkQuantity = 0.0m;
                  var calculationPrice = 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;
                          calculationPrice = (double)((pricecheck));
                      }
                      else
                      {
                          casesQuantity = (int)item.Qty / (int)bulkQuantity;
                          calculationPrice = (double)(pricecheck).GetTruncatedValue();
                          calculationPrice = (double)((decimal)(calculationPrice * (double)bulkQuantity)).GetTotalGross();
                      }
                      
                  }

                  spaces = GenerateSpaces("\t", item.Product.ProductCode, casesQuantity + " x " + calculationPrice.ToString("0.00"), 48);
                  FP2000KL.CMD_42_0_0(item.Product.ProductCode + spaces + casesQuantity + " x " + calculationPrice.ToString("0.00"));

                  var total = casesQuantity * calculationPrice;
                  spaces = GenerateSpaces("\t", item.Product.Description, total.ToString("0.00"), 48);
                  FP2000KL.CMD_42_0_0(item.Product.Description + spaces + total.ToString("0.00"));


                  
              }

              if (order.SaleDiscount > 0)
              {
                  spaces = GenerateSpaces("\t", "Discount", order.SaleDiscount.ToString("0.00"), 48);
                  FP2000KL.CMD_42_0_0("Discount" + spaces + order.SaleDiscount.ToString("0.00"));
              }

              var paidAmount = order.GetPayments.Sum(n => n.Amount);
              var expectedPayment =order.SaleDiscount>0?(order.TotalGross.GetTotalGross()-order.SaleDiscount):order.TotalGross;
              var amountDue = paidAmount >= expectedPayment ? paidAmount : expectedPayment.GetTotalGross();
              var amountPaid = paidAmount;
              spaces = GenerateSpaces("-", string.Empty, string.Empty, 48);
              FP2000KL.CMD_42_0_0(spaces);
              spaces = GenerateSpaces("\t", "Total", amountDue.ToString("0.00"), 48);

              FP2000KL.CMD_42_0_0("Total" + spaces + amountDue.ToString("0.00"));

              spaces = GenerateSpaces("\t", "Paid", amountPaid.ToString("0.00"), 48);

              FP2000KL.CMD_42_0_0("Paid" + spaces + amountPaid.ToString("0.00"));
              FP2000KL.CMD_42_0_0("\n");
              FP2000KL.CMD_42_0_0("\n");
              
              printer.CloseNonFiscalPrinter();
          }

      }