setKeckReceipt method

Future setKeckReceipt(
  1. KasseneckReceipt receipt, {
  2. bool qrAsImage = false,
})

Implementation

Future setKeckReceipt(KasseneckReceipt receipt, {bool qrAsImage = false}) async {
  if (KeckPrinterService.profile == null) {
    throw Exception('Printer not initialized');
  }

  bytes.clear();
  if (receipt.logo != null) {
    Image image = decodeImage(receipt.logo!)!;
    Image resized = copyResize(image, width: paperSize.imageWidth);

    addImage(resized);
    addFeed();
  }

  addText(receipt.companyName, styles: PosStyles(align: PosAlign.center, bold: true));
  addText(receipt.street, styles: PosStyles(align: PosAlign.center));
  addText('${receipt.zip} ${receipt.city}', styles: PosStyles(align: PosAlign.center));
  addText(receipt.uid, styles: PosStyles(align: PosAlign.center));
  addText(receipt.phone, styles: PosStyles(align: PosAlign.center));

  if (receipt.customerDetails.isNotEmpty) {
    addFeed();

    for (int i = 0; i < receipt.customerDetails.length; i++) {
      if (i == 0) {
        addDoubleText('Kunde:', receipt.customerDetails[i], leftWidth: 5, rightWidth: 7);
      } else {
        addDoubleText('', receipt.customerDetails[i], leftWidth: 1, rightWidth: 11);
      }
    }
  }

  addFeed();
  addDoubleText('Datum:', receipt.readableTime, leftWidth: 4, rightWidth: 8);
  addDoubleText('Kassen-ID:', receipt.cashregisterId);
  addDoubleText('Beleg-ID:', receipt.receiptId);
  addFeed();

  Map<VatRate, List<KasseneckItem>> itemsByVat = {};
  for (KasseneckItem item in receipt.items) {
    if (itemsByVat[item.vat] == null) {
      itemsByVat[item.vat] = [];
    }
    itemsByVat[item.vat]!.add(item);
    String amount = item.quantity.toString().padRight(2);
    if (item.quantity
        .toString()
        .length > 2) {
      amount += ' x';
    } else {
      amount += ' x ';
    }
    addDoubleText('$amount${item.name.check()}', '${item.singlePrice.toStringAsFixed(2)} ${item.vat.category}', leftWidth: 7, rightWidth: 5);
  }
  addFeed();

  _addTable('MwSt%', 'MwSt', 'Netto', 'Brutto');

  itemsByVat.forEach((key, value) {
    double brutto = 0;
    for (KasseneckItem element in value) {
      brutto += element.singlePrice * element.quantity;
    }
    int mwstSatz = key.rate;

    double netto = brutto / (1 + (mwstSatz / 100));

    double mwst = brutto - netto;

    _addTable('${key.category} ${key.rate}%', mwst.toStringAsFixed(2), netto.toStringAsFixed(2), brutto.toStringAsFixed(2));
  });

  addFullHorizontalLine();
  addDoubleText('Gesamt:', '${receipt.sum.toStringAsFixed(2)} EUR');

  addFeed();

  if (receipt.legalMessage.isNotEmpty) {
    for (String line in receipt.legalMessage) {
      addText(line, styles: PosStyles(align: PosAlign.center));
    }
    addFeed();
  }
  if (receipt.isSigFailed) {
    addText(RKSVService.signatureDeviceDamagedKey, styles: PosStyles(align: PosAlign.center));
    addFeed();
  }

  if (qrAsImage) {
    QrPainter painter = QrPainter(
      data: receipt.qr,
      version: QrVersions.auto,
      gapless: true,
    );
    ByteData? byteData = await painter.toImageData(250);
    if (byteData == null) {
      if (kDebugMode) {
        print('Error decoding image');
      }
    }
    Image? img = decodeImage(byteData!.buffer.asUint8List());
    if (img == null) {
      if (kDebugMode) {
        print('Error decoding image');
      }
    }
    addImage(img!);
  } else {
    addQrCode(receipt.qr);
  }

  addFeed();

  if (receipt.cardPaymentData != null) {
    try {
      switch (receipt.creditCardProvider) {
        case CreditCardProvider.gpTomAndroid:
        case CreditCardProvider.gpTomIos:
          _gpTom(receipt.cardPaymentData!);
          break;
        case CreditCardProvider.hobexCloudApi:
          _hobexApi(receipt.cardPaymentData!);
          break;
        default:
          break;
      }
      addFeed();
    } catch (e) {}
  }

  if (receipt.thanksMessage.isNotEmpty) {
    addFeed();
    for (String message in receipt.thanksMessage) {
      addText(message, styles: PosStyles(align: PosAlign.center));
    }
  }

  addText(receipt.footer1, styles: PosStyles(align: PosAlign.center));
  addText(receipt.footer2, styles: PosStyles(align: PosAlign.center));
  if (receipt.footer3 != null) {
    addText(receipt.footer3!, styles: PosStyles(align: PosAlign.center));
  }
  if (receipt.footer4 != null) {
    addText(receipt.footer4!, styles: PosStyles(align: PosAlign.center));
  }
  addCut();
}