@kreiseck/kasseneck-api 1.7.1 → 1.10.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 +113 -0
- package/README.md +170 -1
- package/dist/cjs/client/api.d.ts +5 -3
- package/dist/cjs/client/api.js +1 -0
- package/dist/cjs/client/aufrufe.d.ts +9 -7
- package/dist/cjs/client/aufrufe.js +60 -2
- package/dist/cjs/client/errors.js +3 -0
- package/dist/cjs/client/index.d.ts +2 -2
- package/dist/cjs/client/index.js +3 -1
- package/dist/cjs/client/reports.d.ts +26 -0
- package/dist/cjs/client/reports.js +47 -0
- package/dist/cjs/client/transport.d.ts +27 -3
- package/dist/cjs/client/transport.js +29 -3
- package/dist/cjs/index.d.ts +1 -1
- package/dist/cjs/index.js +4 -2
- package/dist/cjs/inventory/api.d.ts +21 -2
- package/dist/cjs/inventory/api.js +22 -3
- package/dist/cjs/inventory/fehler.d.ts +6 -0
- package/dist/cjs/inventory/fehler.js +12 -0
- package/dist/cjs/inventory/index.d.ts +6 -4
- package/dist/cjs/inventory/index.js +33 -3
- package/dist/cjs/inventory/inventur.d.ts +104 -0
- package/dist/cjs/inventory/inventur.js +245 -0
- package/dist/cjs/inventory/lesen.d.ts +20 -1
- package/dist/cjs/inventory/lesen.js +307 -0
- package/dist/cjs/inventory/typen.d.ts +410 -1
- package/dist/cjs/inventory/vertrag.d.ts +94 -8
- package/dist/cjs/inventory/vertrag.js +118 -5
- package/dist/cjs/invoice/index.d.ts +1 -1
- package/dist/cjs/invoice/typen.d.ts +12 -0
- package/dist/cjs/invoice/vertrag.d.ts +1 -1
- package/dist/cjs/invoice/vertrag.js +3 -0
- package/dist/cjs/models/cancellation.d.ts +1 -1
- package/dist/cjs/models/cancellation.js +3 -0
- package/dist/cjs/models/payment-errors.d.ts +1 -1
- package/dist/cjs/models/payment-errors.js +3 -0
- package/dist/cjs/models/receipt-email.d.ts +1 -1
- package/dist/cjs/models/receipt-email.js +3 -0
- package/dist/cjs/models/receipt-errors.d.ts +1 -1
- package/dist/cjs/models/receipt-errors.js +3 -0
- package/dist/cjs/pos/errors.d.ts +4 -3
- package/dist/cjs/pos/errors.js +24 -2
- package/dist/cjs/pos/index.d.ts +4 -1
- package/dist/cjs/pos/index.js +9 -2
- package/dist/cjs/pos/inventur.d.ts +104 -0
- package/dist/cjs/pos/inventur.js +117 -0
- package/dist/cjs/pos/texte.d.ts +82 -0
- package/dist/cjs/pos/texte.js +35 -0
- package/dist/cjs/register/errors.d.ts +1 -1
- package/dist/cjs/register/errors.js +3 -0
- package/dist/cjs/stored/vokabular.d.ts +1 -1
- package/dist/cjs/stored/vokabular.js +1 -1
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/client/api.d.ts +5 -3
- package/dist/esm/client/api.js +2 -1
- package/dist/esm/client/aufrufe.d.ts +9 -7
- package/dist/esm/client/aufrufe.js +60 -2
- package/dist/esm/client/errors.js +3 -0
- package/dist/esm/client/index.d.ts +2 -2
- package/dist/esm/client/index.js +2 -2
- package/dist/esm/client/reports.d.ts +26 -0
- package/dist/esm/client/reports.js +46 -0
- package/dist/esm/client/transport.d.ts +27 -3
- package/dist/esm/client/transport.js +28 -3
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/inventory/api.d.ts +21 -2
- package/dist/esm/inventory/api.js +23 -4
- package/dist/esm/inventory/fehler.d.ts +6 -0
- package/dist/esm/inventory/fehler.js +11 -0
- package/dist/esm/inventory/index.d.ts +6 -4
- package/dist/esm/inventory/index.js +5 -3
- package/dist/esm/inventory/inventur.d.ts +104 -0
- package/dist/esm/inventory/inventur.js +226 -0
- package/dist/esm/inventory/lesen.d.ts +20 -1
- package/dist/esm/inventory/lesen.js +301 -0
- package/dist/esm/inventory/typen.d.ts +410 -1
- package/dist/esm/inventory/vertrag.d.ts +94 -8
- package/dist/esm/inventory/vertrag.js +117 -4
- package/dist/esm/invoice/index.d.ts +1 -1
- package/dist/esm/invoice/typen.d.ts +12 -0
- package/dist/esm/invoice/vertrag.d.ts +1 -1
- package/dist/esm/invoice/vertrag.js +3 -0
- package/dist/esm/models/cancellation.d.ts +1 -1
- package/dist/esm/models/cancellation.js +3 -0
- package/dist/esm/models/payment-errors.d.ts +1 -1
- package/dist/esm/models/payment-errors.js +3 -0
- package/dist/esm/models/receipt-email.d.ts +1 -1
- package/dist/esm/models/receipt-email.js +3 -0
- package/dist/esm/models/receipt-errors.d.ts +1 -1
- package/dist/esm/models/receipt-errors.js +3 -0
- package/dist/esm/pos/errors.d.ts +4 -3
- package/dist/esm/pos/errors.js +24 -2
- package/dist/esm/pos/index.d.ts +4 -1
- package/dist/esm/pos/index.js +2 -1
- package/dist/esm/pos/inventur.d.ts +104 -0
- package/dist/esm/pos/inventur.js +109 -0
- package/dist/esm/pos/texte.d.ts +82 -0
- package/dist/esm/pos/texte.js +35 -0
- package/dist/esm/register/errors.d.ts +1 -1
- package/dist/esm/register/errors.js +3 -0
- package/dist/esm/stored/vokabular.d.ts +1 -1
- package/dist/esm/stored/vokabular.js +1 -1
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/fixtures/hobex-hps-codes.json +1 -1
- package/fixtures/invoice-api.schema.json +1 -1
- package/fixtures/invoice-texts.json +1 -1
- package/fixtures/pos-texts.json +94 -1
- package/fixtures/stocktake-quantity-cases.json +55 -0
- package/fixtures/surface.json +157 -8
- package/fixtures/v3/antworten/belege.json +1 -1
- package/fixtures/v3/antworten/belegmail.json +1 -1
- package/fixtures/v3/antworten/kasse-belege.json +1 -1
- package/fixtures/v3/antworten/kasse.json +2958 -3
- package/fixtures/v3/antworten/lager.json +1727 -3
- package/fixtures/v3/antworten/rechnungen.json +14 -6
- package/fixtures/v3/antworten/storno.json +1 -1
- package/fixtures/v3/stored/belege.json +1 -1
- package/fixtures/v3/stored/kasse.json +414 -3
- package/fixtures/v3/stored/rechnungen.json +1 -1
- package/fixtures/v3/v3-vokabular.json +530 -8
- package/fixtures/v3/zahlbetrag-faelle.json +1 -1
- package/package.json +1 -1
|
@@ -455,6 +455,307 @@ export function variantengruppe(ort, w) {
|
|
|
455
455
|
updatedAt: text(g.updatedAt),
|
|
456
456
|
};
|
|
457
457
|
}
|
|
458
|
+
// ---- Inventur (Lager-Kern Stufe 3) ---------------------------------------------------
|
|
459
|
+
const unter = (ort, feld) => ({ name: ort.name, pfad: ort.pfad ? `${ort.pfad}.${feld}` : feld });
|
|
460
|
+
/** Ein Unterobjekt, das `null` sein darf (`review`, `closing` …); etwas anderes als Objekt oder `null` ist kaputt. */
|
|
461
|
+
function objektOderNull(ort, feld, w) {
|
|
462
|
+
if (w === undefined || w === null)
|
|
463
|
+
return null;
|
|
464
|
+
const o = objekt(w);
|
|
465
|
+
if (!o)
|
|
466
|
+
throw antwortfehler(ort.name, `Antwort ist unbrauchbar (data.${ort.pfad}.${feld} ist kein Objekt)`);
|
|
467
|
+
return o;
|
|
468
|
+
}
|
|
469
|
+
/** Ein Wahrheitswert, der da sein muss: ein fehlendes „gezaehlt“ ist nicht „ungezaehlt“. */
|
|
470
|
+
function wahrheitswert(ort, feld, w) {
|
|
471
|
+
if (typeof w !== 'boolean')
|
|
472
|
+
throw antwortfehler(ort.name, `Antwort enthaelt keinen Wahrheitswert (data.${ort.pfad}.${feld})`);
|
|
473
|
+
return w;
|
|
474
|
+
}
|
|
475
|
+
/** Eine Liste von Texten, die fehlen darf (dann leer); etwas anderes ist kaputt. */
|
|
476
|
+
function textlisteOderLeer(ort, feld, w) {
|
|
477
|
+
if (w === undefined || w === null)
|
|
478
|
+
return [];
|
|
479
|
+
return textliste(ort, feld, w);
|
|
480
|
+
}
|
|
481
|
+
/** Wer etwas tat; fehlt die Angabe, `null`. Etwas anderes als ein Objekt ist kaputt, nie still „niemand“. */
|
|
482
|
+
function akteur(ort, feld, w) {
|
|
483
|
+
if (w === undefined || w === null)
|
|
484
|
+
return null;
|
|
485
|
+
const a = objekt(w);
|
|
486
|
+
if (!a)
|
|
487
|
+
throw antwortfehler(ort.name, `Antwort ist unbrauchbar (data.${ort.pfad}.${feld} ist kein Objekt)`);
|
|
488
|
+
return { type: textOderNull(a.type), id: textOderNull(a.id), name: textOderNull(a.name) };
|
|
489
|
+
}
|
|
490
|
+
function inventurWarnung(ort, w) {
|
|
491
|
+
const h = eintrag(ort, w);
|
|
492
|
+
if (typeof h.code !== 'string' || h.code === '')
|
|
493
|
+
throw antwortfehler(ort.name, `Hinweis ohne Code (data.${ort.pfad}.code)`);
|
|
494
|
+
return { code: h.code, items: ganzzahl(ort, 'items', h.items), message: typeof h.message === 'string' ? h.message : null };
|
|
495
|
+
}
|
|
496
|
+
/** Hinweise einer Inventur; fehlt die Liste, gibt es keine. */
|
|
497
|
+
export function inventurWarnungen(ort, w) {
|
|
498
|
+
if (w === undefined || w === null)
|
|
499
|
+
return [];
|
|
500
|
+
if (!Array.isArray(w))
|
|
501
|
+
throw antwortfehler(ort.name, `Antwort ist unbrauchbar (data.${ort.pfad} ist keine Liste)`);
|
|
502
|
+
return w.map((h, i) => inventurWarnung({ name: ort.name, pfad: `${ort.pfad}[${i}]` }, h));
|
|
503
|
+
}
|
|
504
|
+
function siegel(ort, w) {
|
|
505
|
+
const s = eintrag(ort, w);
|
|
506
|
+
const raus = {
|
|
507
|
+
fromDay: textOderNull(s.fromDay),
|
|
508
|
+
toDay: textOderNull(s.toDay),
|
|
509
|
+
daysChecked: ganzzahlOderNull(ort, 'daysChecked', s.daysChecked),
|
|
510
|
+
verified: typeof s.verified === 'boolean' ? s.verified : null,
|
|
511
|
+
firstBreak: textOderNull(s.firstBreak),
|
|
512
|
+
gaps: textlisteOderLeer(ort, 'gaps', s.gaps),
|
|
513
|
+
gapCount: ganzzahlOderNull(ort, 'gapCount', s.gapCount),
|
|
514
|
+
};
|
|
515
|
+
if (typeof s.notChecked === 'string')
|
|
516
|
+
raus.notChecked = s.notChecked;
|
|
517
|
+
if (hat(s, 'checkedUntil'))
|
|
518
|
+
raus.checkedUntil = textOderNull(s.checkedUntil);
|
|
519
|
+
return raus;
|
|
520
|
+
}
|
|
521
|
+
/**
|
|
522
|
+
* Kopf einer Inventur. Was erst nach dem Abschluss kommt (Summen, Hinweise,
|
|
523
|
+
* Siegel, Pruefsumme, Protokoll), steht im Modell nur, wenn der Server es
|
|
524
|
+
* sendet; Werte nur mit dem Kosten-Recht.
|
|
525
|
+
*/
|
|
526
|
+
export function inventur(ort, w) {
|
|
527
|
+
const k = eintrag(ort, w);
|
|
528
|
+
const umfang = objektOderNull(ort, 'scope', k.scope);
|
|
529
|
+
const umfangOrt = unter(ort, 'scope');
|
|
530
|
+
const fortschritt = objektOderNull(ort, 'progress', k.progress);
|
|
531
|
+
const fOrt = unter(ort, 'progress');
|
|
532
|
+
const pruefung = objektOderNull(ort, 'review', k.review);
|
|
533
|
+
const pOrt = unter(ort, 'review');
|
|
534
|
+
const abschluss = objektOderNull(ort, 'closing', k.closing);
|
|
535
|
+
const aOrt = unter(ort, 'closing');
|
|
536
|
+
const abbruch = objektOderNull(ort, 'cancellation', k.cancellation);
|
|
537
|
+
const raus = {
|
|
538
|
+
id: kennung(ort, 'id', k.id),
|
|
539
|
+
name: text(k.name),
|
|
540
|
+
locationId: textOderNull(k.locationId),
|
|
541
|
+
scope: umfang
|
|
542
|
+
? {
|
|
543
|
+
type: textOderNull(umfang.type),
|
|
544
|
+
groupIds: textlisteOderLeer(umfangOrt, 'groupIds', umfang.groupIds),
|
|
545
|
+
articleIds: textlisteOderLeer(umfangOrt, 'articleIds', umfang.articleIds),
|
|
546
|
+
}
|
|
547
|
+
: null,
|
|
548
|
+
type: textOderNull(k.type),
|
|
549
|
+
keyDate: textOderNull(k.keyDate),
|
|
550
|
+
// Blind ist die sichere Vorgabe: nur ein ausdrueckliches false zeigt Bestand.
|
|
551
|
+
blind: k.blind !== false,
|
|
552
|
+
status: textOderNull(k.status),
|
|
553
|
+
progress: fortschritt
|
|
554
|
+
? {
|
|
555
|
+
items: ganzzahl(fOrt, 'items', fortschritt.items),
|
|
556
|
+
counted: ganzzahlOderNull(fOrt, 'counted', fortschritt.counted),
|
|
557
|
+
recountOpen: fortschritt.recountOpen === true,
|
|
558
|
+
}
|
|
559
|
+
: null,
|
|
560
|
+
createdAt: text(k.createdAt),
|
|
561
|
+
createdBy: akteur(ort, 'createdBy', k.createdBy),
|
|
562
|
+
source: textOderNull(k.source),
|
|
563
|
+
updatedAt: text(k.updatedAt),
|
|
564
|
+
review: pruefung
|
|
565
|
+
? {
|
|
566
|
+
startedAt: text(pruefung.startedAt),
|
|
567
|
+
startedBy: akteur(pOrt, 'startedBy', pruefung.startedBy),
|
|
568
|
+
complete: pruefung.complete === true,
|
|
569
|
+
expectedAsOf: text(pruefung.expectedAsOf),
|
|
570
|
+
recountUncounted: ganzzahlOderNull(pOrt, 'recountUncounted', pruefung.recountUncounted),
|
|
571
|
+
}
|
|
572
|
+
: null,
|
|
573
|
+
closing: abschluss
|
|
574
|
+
? {
|
|
575
|
+
startedAt: text(abschluss.startedAt),
|
|
576
|
+
startedBy: akteur(aOrt, 'startedBy', abschluss.startedBy),
|
|
577
|
+
uncountedAsZero: abschluss.uncountedAsZero === true,
|
|
578
|
+
parts: ganzzahlOderNull(aOrt, 'parts', abschluss.parts),
|
|
579
|
+
bookedParts: ganzzahlOderNull(aOrt, 'bookedParts', abschluss.bookedParts),
|
|
580
|
+
completedAt: text(abschluss.completedAt),
|
|
581
|
+
}
|
|
582
|
+
: null,
|
|
583
|
+
cancellation: abbruch
|
|
584
|
+
? { reason: text(abbruch.reason), cancelledAt: text(abbruch.cancelledAt), cancelledBy: akteur(unter(ort, 'cancellation'), 'cancelledBy', abbruch.cancelledBy) }
|
|
585
|
+
: null,
|
|
586
|
+
};
|
|
587
|
+
const summen = objektOderNull(ort, 'totals', k.totals);
|
|
588
|
+
if (summen) {
|
|
589
|
+
const sOrt = unter(ort, 'totals');
|
|
590
|
+
raus.totals = {
|
|
591
|
+
items: ganzzahl(sOrt, 'items', summen.items),
|
|
592
|
+
counted: ganzzahl(sOrt, 'counted', summen.counted),
|
|
593
|
+
uncounted: ganzzahl(sOrt, 'uncounted', summen.uncounted),
|
|
594
|
+
recounted: ganzzahl(sOrt, 'recounted', summen.recounted),
|
|
595
|
+
withDifference: ganzzahl(sOrt, 'withDifference', summen.withDifference),
|
|
596
|
+
needsCheck: ganzzahl(sOrt, 'needsCheck', summen.needsCheck),
|
|
597
|
+
notBooked: ganzzahl(sOrt, 'notBooked', summen.notBooked),
|
|
598
|
+
};
|
|
599
|
+
for (const feld of ['differenceValueCents', 'inventoryValueCents']) {
|
|
600
|
+
if (hat(summen, feld))
|
|
601
|
+
raus.totals[feld] = ganzzahlOderNull(sOrt, feld, summen[feld]);
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
if (hat(k, 'warnings'))
|
|
605
|
+
raus.warnings = inventurWarnungen(unter(ort, 'warnings'), k.warnings);
|
|
606
|
+
if (hat(k, 'seal') && k.seal !== null)
|
|
607
|
+
raus.seal = siegel(unter(ort, 'seal'), k.seal);
|
|
608
|
+
if (hat(k, 'checksum'))
|
|
609
|
+
raus.checksum = textOderNull(k.checksum);
|
|
610
|
+
if (hat(k, 'inventoryAsOf'))
|
|
611
|
+
raus.inventoryAsOf = textOderNull(k.inventoryAsOf);
|
|
612
|
+
const pdf = objektOderNull(ort, 'pdf', k.pdf);
|
|
613
|
+
if (pdf) {
|
|
614
|
+
raus.pdf = { available: pdf.available === true };
|
|
615
|
+
if (typeof pdf.valuesSha256 === 'string')
|
|
616
|
+
raus.pdf.valuesSha256 = pdf.valuesSha256;
|
|
617
|
+
if (typeof pdf.quantitiesSha256 === 'string')
|
|
618
|
+
raus.pdf.quantitiesSha256 = pdf.quantitiesSha256;
|
|
619
|
+
}
|
|
620
|
+
return raus;
|
|
621
|
+
}
|
|
622
|
+
function nichtGebucht(ort, w) {
|
|
623
|
+
const n = eintrag(ort, w);
|
|
624
|
+
if (typeof n.code !== 'string' || n.code === '')
|
|
625
|
+
throw antwortfehler(ort.name, `Antwort enthaelt keinen Grund (data.${ort.pfad}.code)`);
|
|
626
|
+
const raus = { code: n.code, quantity: ganzzahlOderNull(ort, 'quantity', n.quantity) };
|
|
627
|
+
if (n.reasons !== undefined && n.reasons !== null) {
|
|
628
|
+
if (!Array.isArray(n.reasons))
|
|
629
|
+
throw antwortfehler(ort.name, `Antwort ist unbrauchbar (data.${ort.pfad}.reasons ist keine Liste)`);
|
|
630
|
+
raus.reasons = n.reasons.map((g, i) => {
|
|
631
|
+
const gOrt = { name: ort.name, pfad: `${ort.pfad}.reasons[${i}]` };
|
|
632
|
+
const r = eintrag(gOrt, g);
|
|
633
|
+
if (typeof r.code !== 'string' || r.code === '')
|
|
634
|
+
throw antwortfehler(ort.name, `Antwort enthaelt keinen Grund (data.${gOrt.pfad}.code)`);
|
|
635
|
+
return { code: r.code, quantity: ganzzahlOderNull(gOrt, 'quantity', r.quantity) };
|
|
636
|
+
});
|
|
637
|
+
}
|
|
638
|
+
return raus;
|
|
639
|
+
}
|
|
640
|
+
/**
|
|
641
|
+
* Eine Position. Soll, Differenz und alles aus Pruefung und Abschluss stehen
|
|
642
|
+
* im Modell nur, wenn der Server sie sendet (blind: vor `review` nie).
|
|
643
|
+
*/
|
|
644
|
+
export function inventurPosition(ort, w) {
|
|
645
|
+
const p = eintrag(ort, w);
|
|
646
|
+
// Wer gezaehlt hat, ist zugesagt: fehlt die Liste, ist die Antwort kaputt (nie „niemand“).
|
|
647
|
+
if (!Array.isArray(p.countedBy))
|
|
648
|
+
throw antwortfehler(ort.name, `Antwort ist unbrauchbar (data.${ort.pfad}.countedBy ist keine Liste)`);
|
|
649
|
+
const zaehler = p.countedBy;
|
|
650
|
+
const nachzaehlen = objektOderNull(ort, 'recount', p.recount);
|
|
651
|
+
const nOrt = unter(ort, 'recount');
|
|
652
|
+
const raus = {
|
|
653
|
+
articleId: kennung(ort, 'articleId', p.articleId),
|
|
654
|
+
condition: kennung(ort, 'condition', p.condition),
|
|
655
|
+
name: text(p.name),
|
|
656
|
+
number: text(p.number),
|
|
657
|
+
unit: text(p.unit),
|
|
658
|
+
round: ganzzahl(ort, 'round', p.round),
|
|
659
|
+
counted: wahrheitswert(ort, 'counted', p.counted),
|
|
660
|
+
quantity: ganzzahlOderNull(ort, 'quantity', p.quantity),
|
|
661
|
+
counts: ganzzahl(ort, 'counts', p.counts),
|
|
662
|
+
firstCountedAt: text(p.firstCountedAt),
|
|
663
|
+
referenceTime: text(p.referenceTime),
|
|
664
|
+
countedBy: zaehler.map((a, i) => {
|
|
665
|
+
const wer = akteur(ort, `countedBy[${i}]`, a);
|
|
666
|
+
if (!wer)
|
|
667
|
+
throw antwortfehler(ort.name, `Antwort ist unbrauchbar (data.${ort.pfad}.countedBy[${i}] ist kein Objekt)`);
|
|
668
|
+
return wer;
|
|
669
|
+
}),
|
|
670
|
+
recountRequested: p.recountRequested === true,
|
|
671
|
+
recount: nachzaehlen
|
|
672
|
+
? {
|
|
673
|
+
reason: text(nachzaehlen.reason),
|
|
674
|
+
requestedAt: text(nachzaehlen.requestedAt),
|
|
675
|
+
requestedBy: akteur(nOrt, 'requestedBy', nachzaehlen.requestedBy),
|
|
676
|
+
round: ganzzahlOderNull(nOrt, 'round', nachzaehlen.round),
|
|
677
|
+
}
|
|
678
|
+
: null,
|
|
679
|
+
addedLater: p.addedLater === true,
|
|
680
|
+
};
|
|
681
|
+
// Die Zaehl- und Storno-Antwort sendet die Position ohne Seriennummern: dann fehlt das Feld, nie [].
|
|
682
|
+
if (hat(p, 'serialNumbers'))
|
|
683
|
+
raus.serialNumbers = textlisteOderLeer(ort, 'serialNumbers', p.serialNumbers);
|
|
684
|
+
// Gezaehlt heisst: es gibt eine Menge. Beides zusammen kaputt waere „0“ oder „nichts“ geraten.
|
|
685
|
+
if (raus.counted && raus.quantity === null)
|
|
686
|
+
throw antwortfehler(ort.name, `Antwort ist unbrauchbar (data.${ort.pfad}.quantity fehlt bei counted: true)`);
|
|
687
|
+
for (const feld of ['bookStockNow', 'expectedQuantity', 'differenceQuantity', 'differenceValueCents', 'bookedQuantity']) {
|
|
688
|
+
if (hat(p, feld))
|
|
689
|
+
raus[feld] = ganzzahlOderNull(ort, feld, p[feld]);
|
|
690
|
+
}
|
|
691
|
+
if (hat(p, 'needsCheck'))
|
|
692
|
+
raus.needsCheck = p.needsCheck === true;
|
|
693
|
+
if (hat(p, 'checkReasons'))
|
|
694
|
+
raus.checkReasons = textlisteOderLeer(ort, 'checkReasons', p.checkReasons);
|
|
695
|
+
if (hat(p, 'expectedAsOf'))
|
|
696
|
+
raus.expectedAsOf = text(p.expectedAsOf);
|
|
697
|
+
if (hat(p, 'missingSerialNumbers'))
|
|
698
|
+
raus.missingSerialNumbers = textlisteOderLeer(ort, 'missingSerialNumbers', p.missingSerialNumbers);
|
|
699
|
+
if (hat(p, 'extraSerialNumbers'))
|
|
700
|
+
raus.extraSerialNumbers = textlisteOderLeer(ort, 'extraSerialNumbers', p.extraSerialNumbers);
|
|
701
|
+
if (hat(p, 'notBooked'))
|
|
702
|
+
raus.notBooked = p.notBooked === null ? null : nichtGebucht(unter(ort, 'notBooked'), p.notBooked);
|
|
703
|
+
if (hat(p, 'inventory')) {
|
|
704
|
+
const inv = objektOderNull(ort, 'inventory', p.inventory);
|
|
705
|
+
if (!inv) {
|
|
706
|
+
raus.inventory = null;
|
|
707
|
+
}
|
|
708
|
+
else {
|
|
709
|
+
const iOrt = unter(ort, 'inventory');
|
|
710
|
+
raus.inventory = { quantity: ganzzahl(iOrt, 'quantity', inv.quantity), countedOn: textOderNull(inv.countedOn) };
|
|
711
|
+
for (const feld of ['unitValueMicros', 'valueCents']) {
|
|
712
|
+
if (hat(inv, feld))
|
|
713
|
+
raus.inventory[feld] = ganzzahlOderNull(iOrt, feld, inv[feld]);
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
return raus;
|
|
718
|
+
}
|
|
719
|
+
/** Eine Zaehlung: Menge, Runde und Kennungen muessen da sein. */
|
|
720
|
+
export function inventurZaehlung(ort, w) {
|
|
721
|
+
const z = eintrag(ort, w);
|
|
722
|
+
const storno = objektOderNull(ort, 'voided', z.voided);
|
|
723
|
+
return {
|
|
724
|
+
id: kennung(ort, 'id', z.id),
|
|
725
|
+
articleId: kennung(ort, 'articleId', z.articleId),
|
|
726
|
+
condition: kennung(ort, 'condition', z.condition),
|
|
727
|
+
quantity: ganzzahl(ort, 'quantity', z.quantity),
|
|
728
|
+
// Die Zaehlung traegt ihre Seriennummern immer (leer bei Mengenartikeln); fehlt die Liste, ist sie kaputt.
|
|
729
|
+
serialNumbers: textliste(ort, 'serialNumbers', z.serialNumbers),
|
|
730
|
+
round: ganzzahl(ort, 'round', z.round),
|
|
731
|
+
countedBy: akteur(ort, 'countedBy', z.countedBy),
|
|
732
|
+
source: textOderNull(z.source),
|
|
733
|
+
cashregisterId: textOderNull(z.cashregisterId),
|
|
734
|
+
countedAt: text(z.countedAt),
|
|
735
|
+
note: text(z.note),
|
|
736
|
+
voided: storno
|
|
737
|
+
? { reason: text(storno.reason), voidedAt: text(storno.voidedAt), voidedBy: akteur(unter(ort, 'voided'), 'voidedBy', storno.voidedBy) }
|
|
738
|
+
: null,
|
|
739
|
+
};
|
|
740
|
+
}
|
|
741
|
+
/** Antwort von Zaehlen und Stornieren: beide Teile sind zugesagt. */
|
|
742
|
+
export function zaehlungMitPosition(name, daten) {
|
|
743
|
+
const d = objekt(daten);
|
|
744
|
+
return { count: inventurZaehlung({ name, pfad: 'count' }, d?.count), item: inventurPosition({ name, pfad: 'item' }, d?.item) };
|
|
745
|
+
}
|
|
746
|
+
/** Lese-Link auf ein grosses Inventurprotokoll; ohne Adresse, Ablauf, Groesse oder Pruefsumme ist er unbrauchbar. */
|
|
747
|
+
export function protokollLink(name, w) {
|
|
748
|
+
const ort = { name, pfad: 'download' };
|
|
749
|
+
const d = eintrag(ort, w);
|
|
750
|
+
return {
|
|
751
|
+
url: kennung(ort, 'url', d.url),
|
|
752
|
+
expiresAt: kennung(ort, 'expiresAt', d.expiresAt),
|
|
753
|
+
sizeBytes: ganzzahl(ort, 'sizeBytes', d.sizeBytes),
|
|
754
|
+
sha256: kennung(ort, 'sha256', d.sha256),
|
|
755
|
+
fileName: textOderNull(d.fileName),
|
|
756
|
+
contentType: textOderNull(d.contentType),
|
|
757
|
+
};
|
|
758
|
+
}
|
|
458
759
|
// ---- Listen ------------------------------------------------------------------
|
|
459
760
|
/** Eine zugesagte Liste `data.<feld>`, Eintrag fuer Eintrag gelesen. */
|
|
460
761
|
export function liste(name, daten, feld, lesen) {
|