getPaperFromReceipt static method

Future<PrintPaper> getPaperFromReceipt(
  1. KasseneckReceipt receipt,
  2. KeckPaperSize paperSize, {
  3. QrPrintMode qrMode = QrPrintMode.imageRaster,
  4. QrModuleSize qrModuleSize = QrModuleSize.auto,
  5. CodeTableId? codeTable,
  6. @Deprecated('Das Logo kommt aus dem Beleg (logoUrl); dieser Parameter greift nur ohne Adresse.') bool brandMark = false,
})

Setzt receipt als Beleg und gibt das fertige Papier zurueck -- die eine Stelle, an der PrintPaper fuer einen Beleg entsteht.

Der Rueckgabewert traegt neben bytes und myPosPaper auch PrintPaper.qrError; dieser Weg ruehrt lastQrError nicht an und ist damit frei von globalem Zustand.

Das Logo kommt aus receipt.logoUrl -- logo greift nur noch als Rueckfallebene fuer Belege ohne Logo-Adresse. Fuer paperSize muss es gerastert sein (loadPrintLogo(url, size, paperSize)); passt ein PrintLogo nicht (z. B. fuer eine andere Papierbreite gerastert), gilt: kommt es selbst aus receipt.logoUrl, druckt der Beleg ohne Logo weiter -- ein Datenfehler am Konto darf den Bon nicht verhindern. Nur ein ausdruecklich uebergebenes logo laesst den Druck mit ArgumentError abbrechen, bevor ein Byte entsteht.

codeTable ist die im Drucker-Wizard gewaehlte Tabelle dieses Druckers (siehe PrintPaper.codeTable); ohne Wahl bleibt der Bon byte-gleich.

Implementation

static Future<PrintPaper> getPaperFromReceipt(
  KasseneckReceipt receipt,
  KeckPaperSize paperSize, {
  QrPrintMode qrMode = QrPrintMode.imageRaster,
  QrModuleSize qrModuleSize = QrModuleSize.auto,
  CodeTableId? codeTable,
  @Deprecated('Das Logo kommt aus dem Beleg (logoUrl); dieser Parameter greift nur ohne Adresse.')
  PrintLogo? logo,
  @Deprecated('Das Logo kommt aus dem Beleg (logoUrl); dieser Parameter greift nur ohne Adresse.')
  bool brandMark = false,
}) async {
  final PrintPaper paper =
      PrintPaper(paperSize: paperSize, profile: KeckPrinterService.profile ?? CapabilityProfile(), codeTable: codeTable);
  // Ein Server-Layout gewinnt immer (receiptLayoutFromResult), auch wenn
  // ihm ein Kartenblock zu fehlen scheint: Aufdruck (TESTKASSE, Belegart)
  // und QR wiegen schwerer, und Bildschirm, Bon und PDF zeigen so denselben
  // Beleg. Nur ohne Layout zeichnet der Rueckfall.
  final ReceiptLayout? layout = receiptLayoutFromResult(receipt, fallbackPaperSize: paperSize).layout;
  if (layout != null) {
    final bool belegTraegtLogo = receipt.logoUrl != null && receipt.logoUrl!.isNotEmpty;
    PrintLogo? logoAusBeleg;
    if (belegTraegtLogo) {
      try {
        logoAusBeleg = await logoLoader(receipt.logoUrl, receipt.logoScale, paperSize);
      } catch (_) {
        // Ein Logo, das nicht kommt, ist kein Druckfehler: der Beleg steht
        // laengst in der Signaturkette, der Bon muss hinaus.
        logoAusBeleg = null;
      }
    }
    // Traegt der Beleg eine Adresse, entscheidet AUSSCHLIESSLICH sie -- auch
    // wenn der Abruf scheiterte. Sonst stuende auf dem Bon ein anderes Logo
    // als im PDF und in der Online-Ansicht, und genau das soll nie wieder
    // auseinanderlaufen.
    final PrintLogo? wirksamesLogo = belegTraegtLogo ? logoAusBeleg : logo;
    final bool wirksameMarke = receipt.showKreiseckLogo || brandMark;
    // [wirksamesLogo] und [wirksameMarke] gelten nur fuer das Blatt; der
    // Altweg kennt sein eigenes Logo (`receipt.logo`) und Branding
    // (`showKreiseckLogo`).
    try {
      await paper.setReceiptSheet(layout,
          logo: wirksamesLogo, brandMark: wirksameMarke, qrMode: qrMode, qrModuleSize: qrModuleSize);
    } on ArgumentError {
      // [setReceiptSheet] wirft nur ueber ein gesetztes Logo -- diese Pruefung
      // war fuer den AUFRUFER gedacht, der ein eigenes Raster mitbringt. Kommt
      // das Logo hier stattdessen selbst aus dem Beleg (Kontodaten), darf ein
      // Datenfehler dort nicht den ganzen Bon verhindern, den gesetzlich
      // vorgeschriebenen QR eingeschlossen: der Bon druckt dann ohne Logo.
      // Ein ausdruecklich uebergebenes [logo] (die veraltete Rueckfallebene)
      // bleibt hart -- wer ein Raster mitbringt, soll erfahren, dass es nicht passt.
      if (!belegTraegtLogo) rethrow;
      await paper.setReceiptSheet(layout,
          brandMark: wirksameMarke, qrMode: qrMode, qrModuleSize: qrModuleSize);
    }
  } else {
    await paper.setKeckReceipt(receipt, qrMode: qrMode, qrModuleSize: qrModuleSize);
  }
  return paper;
}