@kreiseck/kasseneck-api 0.10.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +74 -1
- package/README.md +41 -0
- package/dist/cjs/printing/escpos.d.ts +85 -1
- package/dist/cjs/printing/escpos.js +140 -4
- package/dist/cjs/printing/index.d.ts +2 -1
- package/dist/cjs/printing/index.js +13 -1
- package/dist/cjs/printing/qr-groesse.d.ts +122 -0
- package/dist/cjs/printing/qr-groesse.js +126 -0
- package/dist/cjs/receipt/epos.d.ts +42 -1
- package/dist/cjs/receipt/epos.js +66 -5
- package/dist/cjs/receipt/index.d.ts +2 -2
- package/dist/cjs/receipt/index.js +3 -1
- package/dist/cjs/receipt/layout-escpos.d.ts +50 -2
- package/dist/cjs/receipt/layout-escpos.js +59 -2
- package/dist/esm/printing/escpos.d.ts +85 -1
- package/dist/esm/printing/escpos.js +138 -4
- package/dist/esm/printing/index.d.ts +2 -1
- package/dist/esm/printing/index.js +2 -1
- package/dist/esm/printing/qr-groesse.d.ts +122 -0
- package/dist/esm/printing/qr-groesse.js +120 -0
- package/dist/esm/receipt/epos.d.ts +42 -1
- package/dist/esm/receipt/epos.js +65 -5
- package/dist/esm/receipt/index.d.ts +2 -2
- package/dist/esm/receipt/index.js +2 -2
- package/dist/esm/receipt/layout-escpos.d.ts +50 -2
- package/dist/esm/receipt/layout-escpos.js +59 -3
- package/fixtures/hobex-hps-codes.json +1 -1
- package/fixtures/kasse-texte.json +1 -1
- package/fixtures/oberflaeche.json +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type PosCodeTable, type PosCutMode, type PosPaperSize, type QrCorrection, type QrSize } from '../printing/index.js';
|
|
1
|
+
import { type PosCodeTable, type PosCutMode, type PosPaperSize, type QrCorrection, type QrMatrix, type QrModulGroesse, type QrSize } from '../printing/index.js';
|
|
2
2
|
import type { ReceiptLayout } from './layout.js';
|
|
3
3
|
/**
|
|
4
4
|
* Bruecke vom Layout-Modell zu ESC/POS-Bytes — der Bondrucker-Ausgabeweg.
|
|
@@ -14,6 +14,20 @@ import type { ReceiptLayout } from './layout.js';
|
|
|
14
14
|
* ein unerwartetes Zeichen darin soll darum auffallen und nicht still
|
|
15
15
|
* verfaelscht werden.
|
|
16
16
|
*/
|
|
17
|
+
/**
|
|
18
|
+
* Wie der Beleg-QR auf das Papier kommt — Zwilling von `QrPrintMode`
|
|
19
|
+
* (kasseneck_api/lib/enums/qr_print_mode.dart).
|
|
20
|
+
*
|
|
21
|
+
* - `native` — der Druckbefehl `GS ( k`; der Drucker zeichnet selbst.
|
|
22
|
+
* Ohne Modellbefehl, also byteidentisch zum Bestand.
|
|
23
|
+
* - `nativeModel1` — derselbe Befehl mit ausdruecklicher Wahl von **Modell 1**
|
|
24
|
+
* (`GS ( k 04 00 31 41 31 00`). Fuer guenstige Geraete, die
|
|
25
|
+
* nur diesen aelteren Symboltyp beherrschen; belegt ist
|
|
26
|
+
* eines, das bei Modell 2 unter dem Code eine "0" ausgibt.
|
|
27
|
+
* - `imageRaster` — der QR als Rasterbild. Braucht ein Raster vom Aufrufer
|
|
28
|
+
* (`qrMatrix`), weil dieses Paket keine QR-Codes rechnet.
|
|
29
|
+
*/
|
|
30
|
+
export type QrPrintMode = 'native' | 'nativeModel1' | 'imageRaster';
|
|
17
31
|
export interface EscPosLayoutOptions {
|
|
18
32
|
/** Papierbreite; Vorgabe ist die des Layouts (dessen Spaltenbreiten daran haengen). */
|
|
19
33
|
paperSize?: PosPaperSize;
|
|
@@ -21,10 +35,38 @@ export interface EscPosLayoutOptions {
|
|
|
21
35
|
codeTable?: PosCodeTable | null;
|
|
22
36
|
/** Papierschnitt am Ende: `true` (voll), `'partial'` oder `false`. Vorgabe `true`. */
|
|
23
37
|
cut?: boolean | PosCutMode;
|
|
24
|
-
/**
|
|
38
|
+
/**
|
|
39
|
+
* Feste Modulgroesse des QR-Codes. Gesetzt schaltet sie die Rechnung ab —
|
|
40
|
+
* dann passt der Aufrufer selbst auf, dass das Symbol aufs Papier geht.
|
|
41
|
+
*/
|
|
25
42
|
qrSize?: QrSize;
|
|
26
43
|
/** Fehlerkorrekturstufe des QR-Codes. */
|
|
27
44
|
qrCorrection?: QrCorrection;
|
|
45
|
+
/** Deckel fuer die gerechnete Modulgroesse; Vorgabe `auto`. */
|
|
46
|
+
qrGroesse?: QrModulGroesse;
|
|
47
|
+
/** Druckweg des QR; Vorgabe `native` (der Bestandsweg). */
|
|
48
|
+
qrModus?: QrPrintMode;
|
|
49
|
+
/**
|
|
50
|
+
* Raster fuer den Bildweg — ohne das gibt es keinen Notausgang.
|
|
51
|
+
*
|
|
52
|
+
* Dieses Paket rechnet keine QR-Codes und verarbeitet keine Bilder (siehe
|
|
53
|
+
* Kopf von `layout.ts`); der Aufrufer bringt das fertige Raster mit, etwa
|
|
54
|
+
* aus der QR-Bibliothek, die er ohnehin fuer den Bildschirm benutzt.
|
|
55
|
+
*/
|
|
56
|
+
qrMatrix?: (nutzlast: string) => QrMatrix;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Der Bytestrom **samt** dem, was dem QR unterwegs zugestossen ist.
|
|
60
|
+
*
|
|
61
|
+
* Zwilling von `KeckPrintResult`: `qrFehler` heisst "Beleg ohne QR,
|
|
62
|
+
* nachdrucken oder elektronisch ausgeben", `qrAusweich` heisst "gedruckt,
|
|
63
|
+
* aber der eingestellte Weg taugt fuer dieses Geraet nicht" — das eine gehoert
|
|
64
|
+
* dem Kunden gesagt, das andere dem Chef.
|
|
65
|
+
*/
|
|
66
|
+
export interface EscPosLayoutErgebnis {
|
|
67
|
+
bytes: Uint8Array;
|
|
68
|
+
qrFehler: string | null;
|
|
69
|
+
qrAusweich: string | null;
|
|
28
70
|
}
|
|
29
71
|
/**
|
|
30
72
|
* Bytes fuer den Bondrucker -- **aus dem Zeichenraster** ([renderReceiptGrid]):
|
|
@@ -33,3 +75,9 @@ export interface EscPosLayoutOptions {
|
|
|
33
75
|
* zeigt, druckt der Drucker (Monospace, Font A: 32/48 Zeichen).
|
|
34
76
|
*/
|
|
35
77
|
export declare function escPosLayoutBytes(layout: ReceiptLayout, options?: EscPosLayoutOptions): Uint8Array;
|
|
78
|
+
/**
|
|
79
|
+
* Wie [escPosLayoutBytes], gibt aber zusaetzlich zurueck, was dem QR
|
|
80
|
+
* zugestossen ist. Die Bytes sind dieselben; wer die Meldungen braucht, nimmt
|
|
81
|
+
* diesen Weg.
|
|
82
|
+
*/
|
|
83
|
+
export declare function escPosLayoutErgebnis(layout: ReceiptLayout, options?: EscPosLayoutOptions): EscPosLayoutErgebnis;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createEscPosDocument, escPosBytes, escPosCut, escPosFeed, escPosPrintableText, escPosQrCode, escPosReset, escPosText, } from '../printing/index.js';
|
|
1
|
+
import { createEscPosDocument, escPosBytes, escPosCut, escPosFeed, escPosPrintableText, escPosQrCode, escPosQrRaster, escPosReset, escPosText, QR_DRUCK_PUNKTE, qrGroesseFuer, } from '../printing/index.js';
|
|
2
2
|
import { renderReceiptGrid, ZEICHEN_JE_PAPIER } from './grid.js';
|
|
3
3
|
/**
|
|
4
4
|
* Druckbar gemachtes Layout: Texte durch [escPosPrintableText] (Codepage,
|
|
@@ -26,6 +26,14 @@ function druckbaresLayout(layout) {
|
|
|
26
26
|
* zeigt, druckt der Drucker (Monospace, Font A: 32/48 Zeichen).
|
|
27
27
|
*/
|
|
28
28
|
export function escPosLayoutBytes(layout, options = {}) {
|
|
29
|
+
return escPosLayoutErgebnis(layout, options).bytes;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Wie [escPosLayoutBytes], gibt aber zusaetzlich zurueck, was dem QR
|
|
33
|
+
* zugestossen ist. Die Bytes sind dieselben; wer die Meldungen braucht, nimmt
|
|
34
|
+
* diesen Weg.
|
|
35
|
+
*/
|
|
36
|
+
export function escPosLayoutErgebnis(layout, options = {}) {
|
|
29
37
|
const paperSize = options.paperSize ?? layout.paperSize;
|
|
30
38
|
const dokumentOptionen = { paperSize };
|
|
31
39
|
if (options.codeTable !== undefined) {
|
|
@@ -33,11 +41,59 @@ export function escPosLayoutBytes(layout, options = {}) {
|
|
|
33
41
|
}
|
|
34
42
|
const doc = createEscPosDocument(dokumentOptionen);
|
|
35
43
|
escPosReset(doc);
|
|
44
|
+
const modus = options.qrModus ?? 'native';
|
|
36
45
|
const qrOptionen = { align: 'center' };
|
|
37
46
|
if (options.qrSize !== undefined)
|
|
38
47
|
qrOptionen.size = options.qrSize;
|
|
39
48
|
if (options.qrCorrection !== undefined)
|
|
40
49
|
qrOptionen.correction = options.qrCorrection;
|
|
50
|
+
if (options.qrGroesse !== undefined)
|
|
51
|
+
qrOptionen.groesse = options.qrGroesse;
|
|
52
|
+
if (modus === 'nativeModel1')
|
|
53
|
+
qrOptionen.modell1 = true;
|
|
54
|
+
if (modus === 'imageRaster' && options.qrMatrix === undefined) {
|
|
55
|
+
throw new Error("qrModus 'imageRaster' braucht ein qrMatrix -- dieses Paket rastert nicht selbst");
|
|
56
|
+
}
|
|
57
|
+
const rasterOptionen = { align: 'center' };
|
|
58
|
+
if (options.qrGroesse !== undefined)
|
|
59
|
+
rasterOptionen.groesse = options.qrGroesse;
|
|
60
|
+
/**
|
|
61
|
+
* Eine QR-Zeile des Rasters. Hier sitzt der **Notausgang**: passt das Symbol
|
|
62
|
+
* nativ auch mit der Ausnahmegroesse nicht aufs Papier, druckt der Drucker
|
|
63
|
+
* es GAR NICHT -- er schneidet nicht ab, er laesst weg. Ein Pflichtbeleg
|
|
64
|
+
* ohne QR ist der schlechteste aller Ausgaenge, also geht der QR dann als
|
|
65
|
+
* Bild hinaus, und der Aufrufer erfaehrt es ueber `qrAusweich`.
|
|
66
|
+
*
|
|
67
|
+
* Ohne `qrMatrix` gibt es diesen Weg nicht -- dann bleibt nur die Meldung
|
|
68
|
+
* `qrFehler` aus `escPosQrCode`, und der Beleg geht ohne QR hinaus.
|
|
69
|
+
*/
|
|
70
|
+
const qrZeile = (nutzlast) => {
|
|
71
|
+
const raster = options.qrMatrix;
|
|
72
|
+
if (nutzlast !== '' && raster !== undefined) {
|
|
73
|
+
if (modus === 'imageRaster') {
|
|
74
|
+
escPosQrRaster(doc, raster(nutzlast), rasterOptionen);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
// Feste `qrSize` heisst: der Aufrufer weiss, was er tut -- dann wird
|
|
78
|
+
// weder gerechnet noch ausgewichen.
|
|
79
|
+
if (options.qrSize === undefined) {
|
|
80
|
+
const mass = qrGroesseFuer({
|
|
81
|
+
nutzlast,
|
|
82
|
+
papierbreitePunkte: QR_DRUCK_PUNKTE[paperSize],
|
|
83
|
+
groesse: options.qrGroesse ?? 'auto',
|
|
84
|
+
});
|
|
85
|
+
if (!mass.passt) {
|
|
86
|
+
doc.qrAusweich =
|
|
87
|
+
`QR mit ${mass.module} Modulen passt nativ nicht auf ` +
|
|
88
|
+
`${paperSize === 'mm58' ? 58 : 80} mm (${QR_DRUCK_PUNKTE[paperSize]} Punkte) ` +
|
|
89
|
+
`-- als Bild gedruckt`;
|
|
90
|
+
escPosQrRaster(doc, raster(nutzlast), rasterOptionen);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
escPosQrCode(doc, nutzlast, qrOptionen);
|
|
96
|
+
};
|
|
41
97
|
const grid = renderReceiptGrid(druckbaresLayout(layout), { zeichen: ZEICHEN_JE_PAPIER[paperSize] });
|
|
42
98
|
for (const zeile of grid.lines) {
|
|
43
99
|
switch (zeile.kind) {
|
|
@@ -45,7 +101,7 @@ export function escPosLayoutBytes(layout, options = {}) {
|
|
|
45
101
|
escPosFeed(doc, 1);
|
|
46
102
|
break;
|
|
47
103
|
case 'qr':
|
|
48
|
-
|
|
104
|
+
qrZeile(zeile.qr ?? '');
|
|
49
105
|
break;
|
|
50
106
|
case 'banner': {
|
|
51
107
|
// Belegart/Warnung: fett zwischen zwei Volllinien — derselbe Rahmen-
|
|
@@ -65,5 +121,5 @@ export function escPosLayoutBytes(layout, options = {}) {
|
|
|
65
121
|
if (options.cut !== false) {
|
|
66
122
|
escPosCut(doc, options.cut === 'partial' ? 'partial' : 'full');
|
|
67
123
|
}
|
|
68
|
-
return escPosBytes(doc);
|
|
124
|
+
return { bytes: escPosBytes(doc), qrFehler: doc.qrFehler, qrAusweich: doc.qrAusweich };
|
|
69
125
|
}
|