getPaperFromReceipt static method

Future<PrintPaper> getPaperFromReceipt(
  1. KasseneckReceipt receipt,
  2. KeckPaperSize paperSize, {
  3. QrPrintMode qrMode = QrPrintMode.imageRaster,
  4. QrModulGroesse qrGroesse = QrModulGroesse.auto,
  5. @Deprecated('Das Logo kommt aus dem Beleg (logoUrl); dieser Parameter greift nur ohne Adresse.') bool marke = 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.qrFehler; dieser Weg ruehrt letzterQrFehler 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 (ladeDruckLogo(url, stufe, paperSize)); passt ein DruckLogo 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.

Implementation

static Future<PrintPaper> getPaperFromReceipt(
  KasseneckReceipt receipt,
  KeckPaperSize paperSize, {
  QrPrintMode qrMode = QrPrintMode.imageRaster,
  QrModulGroesse qrGroesse = QrModulGroesse.auto,
  @Deprecated('Das Logo kommt aus dem Beleg (logoUrl); dieser Parameter greift nur ohne Adresse.')
  DruckLogo? logo,
  @Deprecated('Das Logo kommt aus dem Beleg (logoUrl); dieser Parameter greift nur ohne Adresse.')
  bool marke = false,
}) async {
  final PrintPaper paper =
      PrintPaper(paperSize: paperSize, profile: KeckPrinterService.profile ?? CapabilityProfile());
  final BelegLayout? layout = receipt.layout;
  if (layout != null && receipt.layoutIstVollstaendig) {
    final bool belegTraegtLogo = receipt.logoUrl != null && receipt.logoUrl!.isNotEmpty;
    DruckLogo? logoAusBeleg;
    if (belegTraegtLogo) {
      try {
        logoAusBeleg = await logoLader(receipt.logoUrl, receipt.logoStufe, 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 DruckLogo? wirksamesLogo = belegTraegtLogo ? logoAusBeleg : logo;
    final bool wirksameMarke = receipt.showKreiseckLogo || marke;
    // [wirksamesLogo] und [wirksameMarke] gelten nur fuer das Blatt; der
    // Altweg kennt sein eigenes Logo (`receipt.logo`) und Branding
    // (`showKreiseckLogo`).
    try {
      await paper.setBelegBlatt(layout,
          logo: wirksamesLogo, marke: wirksameMarke, qrMode: qrMode, qrGroesse: qrGroesse);
    } on ArgumentError {
      // [setBelegBlatt] 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.setBelegBlatt(layout,
          marke: wirksameMarke, qrMode: qrMode, qrGroesse: qrGroesse);
    }
  } else {
    await paper.setKeckReceipt(receipt, qrMode: qrMode, qrGroesse: qrGroesse);
  }
  return paper;
}