/** * Die Aufrufe der Partner-API — Betriebe, Signatur, Kassen. * * Jede Funktion nimmt den Transport als ersten Parameter und ist einzeln * importierbar; die Fassade [createPartnerApi] bindet ihn nur einmal. * * **Was hier geprueft wird und was nicht.** Vor dem Senden prueft dieser Client * nur, was er ohne den Server wissen kann: dass eine Kennung ueberhaupt da ist, * dass eine Liste nicht leer ist, dass eine Zahl im erlaubten Bereich liegt. * Die fachliche Pruefung der Betriebsdaten (Steuernummer samt Pruefziffer, UID, * PLZ, Gericht) macht das Backend mit `@kreiseck/validator` — sie hier zu * wiederholen hiesse, zwei Wahrheiten zu haben, von denen eine veraltet. * Ein Formfehler kommt als `KasseneckApiError` mit `code:"validation"` zurueck; * `partnerFieldErrors(fehler)` macht `data.errors[]` daraus. **Es entsteht dabei * nichts** — der Aufruf ist folgenlos wiederholbar. * * Nach dem Senden wird nichts hart gecastet: fehlt ein zugesagtes Feld, wirft * der Aufruf `KasseneckValidationError` mit `scope:'response'` statt spaeter * einen `TypeError` an unpassender Stelle. */ import type { InternerTransport } from '../client/aufrufe.js'; import type { ActivateCashregisterResult, CreateCashregisterOptions, CreateCashregisterResult, CreateCustomerOptions, CreateCustomerResult, CustomerCredentials, FonLinkResult, CustomerCashregisterList, PartnerCustomer, PartnerCustomerList, ListCustomersOptions, PartnerInfo, ReportCustomerContractOptions, ReportCustomerContractResult, RequestSignatureOptions, RequestSignatureResult, CustomerSignatureStatus } from './typen.js'; /** * Wer bin ich, in welcher Umgebung, mit welchen Rechten — und welche Apps * gehoeren mir. `apps[].id` ist die `appId` fuer [createPartnerCustomer]. * * Der guenstigste Selbsttest beim Hochfahren: er beweist Schluessel, Umgebung * und Rechte in einem Aufruf. */ export declare function getPartnerInfo(transport: InternerTransport): Promise; /** * Legt einen Betrieb an. * * **Ohne Panel-Zugang**, solange nicht `access:{invite:true}` dabeisteht: * viele Betriebe arbeiten ausschliesslich in der App des Partners. Fuer die * Einladung braucht das Partner-Konto ausserdem * `partner.canCreateAccess`. * * **`env` waehlt die Umgebung.** Ohne Angabe entscheidet der Schluessel; ein * Live-Schluessel darf mit `env:"test"` einen Testbetrieb anlegen, ein * Test-Schluessel niemals einen Live-Betrieb (`live_not_allowed`). * * **`idempotencyKey` benutzen.** Ein verlorener Antwortweg ist kein * Sonderfall, und ohne Schluessel legt der zweite Versuch einen zweiten Betrieb * an. Mit Schluessel kommt die gespeicherte Antwort zurueck (`replayed:true`) * — auch dann, wenn der Rumpf inzwischen abweicht. Die eigene Kundennummer ist * der natuerliche Wert dafuer. */ export declare function createPartnerCustomer(transport: InternerTransport, options: CreateCustomerOptions): Promise; /** Betriebe dieses Partners, seitenweise. `cursor` aus der Antwort setzt fort. */ export declare function listPartnerCustomers(transport: InternerTransport, options?: ListCustomersOptions): Promise; /** Ein Betrieb mit allem, was der Partner ueber ihn sehen darf — nie Geheimnisse. */ export declare function getPartnerCustomer(transport: InternerTransport, customerId: string): Promise; /** * Schickt dem Betrieb den Einrichtungs-Link fuer seinen FinanzOnline-Zugang. * Ohne diesen Zugang gibt es live keine Signatureinheit (`fon_missing`). * * Die Antwort nennt den Empfaenger **maskiert** — die Adresse gibt das Backend * nie im Klartext aus. */ /** * Ist diese E-Mail-Adresse noch als Kasseneck-Zugang frei? * * Nur noetig, wenn der Betrieb einen eigenen Zugang zum Kundenpanel bekommen * soll (`access.invite: true`) — dann wird die Adresse sein Login und darf * noch keines sein. Ohne Einladung ist eine belegte Adresse kein Hindernis. * * Der Sinn ist der Zeitpunkt: ohne diese Frage faellt `email_taken` erst nach * einem ganzen ausgefuellten Formular auf. Die Antwort sagt NUR ja oder nein — * nie, wem die Adresse gehoert. */ export declare function checkPartnerCustomerEmail(transport: InternerTransport, email: string): Promise; export declare function sendPartnerCustomerFonLink(transport: InternerTransport, customerId: string): Promise; /** * Beantragt die Signatureinheit. Kasseneck laesst die Karte beim * Vertrauensdiensteanbieter **auf diesen Betrieb** ausstellen und meldet sie * bei FinanzOnline an; einen Vorrat fertiger Karten gibt es nicht. * * Der Antrag erzeugt sofort ein Signatur-OBJEKT: `request.requestId` ist * zugleich die `signatureRequestId`, auf die sich eine Kasse beruft — auch solange * noch keine Karte zugewiesen ist. * * **Je Betrieb laeuft nur ein Antrag.** Ein zweiter Aufruf liefert den * laufenden zurueck (`replayed:true`) und ist damit folgenlos wiederholbar. * Eine WEITERE Signatur (Ersatzkarte, zweiter Standort) entsteht nur mit * `additional:true` — hoechstens zehn je Betrieb (`signature_limit`). Der * Abschluss kommt als Ereignis `signature.ready`, nicht als Antwort auf diesen * Aufruf. */ export declare function requestCustomerSignature(transport: InternerTransport, customerId: string, options?: RequestSignatureOptions): Promise; /** Stand der Signatur eines Betriebs samt aller Signaturen, Antraege und des FON-Zugangs. */ export declare function getCustomerSignatureStatus(transport: InternerTransport, customerId: string): Promise; /** * Legt eine Kasse an. * * **Jede Kasse bezieht sich auf eine Signatur.** Ohne eine einzige — auch eine * noch laufende zaehlt — entsteht keine (`signature_missing`); bei mehreren * muss `signatureRequestId` dastehen (`signature_ambiguous`). * * **Darf vor der fertigen Signatur aufgerufen werden:** die Kasse bleibt dann * auf `draft` und geht von selbst live, sobald IHRE Signatur bereit ist * (`automatic:true`, Vorgabe). `activation.reason` sagt, warum gerade * nichts lief: `signature_not_ready` oder `automation_off`. * * Hoechstens 20 Kassen je Betrieb (`cashregister_limit`); ohne gebuchtes Modul * `module_inactive`. */ export declare function createCustomerCashregister(transport: InternerTransport, options: CreateCashregisterOptions): Promise; /** * Nimmt eine Kasse in Betrieb — von Hand, wenn `automatic:false` gilt oder * ein Lauf abgebrochen ist. * * **Jeder Schritt der Kette ist idempotent**, der Startbeleg entsteht nach * RKSV genau einmal und ein vorhandener wird erkannt. Ein Wiederholungsaufruf * setzt deshalb an der Bruchstelle an und macht nichts doppelt; eine bereits * laufende Kasse antwortet mit `unchanged:true`. Das ist der eine * veraendernde Aufruf dieses Clients, der ohne Idempotenzschluessel gefahrlos * wiederholbar ist — weil der Server ihn so gebaut hat. */ export declare function activateCashregister(transport: InternerTransport, customerId: string, cashregisterId: string): Promise; /** Die Kassen eines Betriebs samt Stand der Inbetriebnahme — **nie** Token. */ export declare function listCustomerCashregisters(transport: InternerTransport, customerId: string): Promise; /** * Holt die **Geheimnisse des Betriebs**: seinen `api_key` und die Token seiner * Kassen. Damit signiert eine App in seinem Namen Belege — und ein Beleg ist * nach RKSV nicht zuruecknehmbar. * * Braucht den Scope `credentials:read`, der **nicht** zum Standardsatz gehoert * und keinem bestehenden Schluessel nachtraeglich hinzugefuegt wird; dafuer * wird ein eigener Schluessel angelegt. Jeder Abruf wird mitgeschrieben * (Partner, Schluessel, Zeitpunkt) und ist fuer den Betrieb sichtbar. * * **Nur verschluesselt speichern. Nie protokollieren, nie in eine Mail, nie in * einen Fehlerbericht.** Die Werte kommen darum als [KasseneckSecret] und * nicht als `string` zurueck: `console.log`, `JSON.stringify` und jede * Zeichenketten-Umwandlung zeigen eine Maske, heraus kommt man nur ueber * `.reveal()`. */ export declare function getCustomerCredentials(transport: InternerTransport, customerId: string): Promise; /** * Meldet eine Zustimmung des Betriebs, die der Partner **in Vollmacht** * eingeholt hat (Endpunkt `reportCustomerContract`, unter `/v1` * `reportCustomerVertrag`). Braucht die Berechtigung `customers:write`. * * Vor dem Senden prueft dieser Client nur, dass jede Pflichtangabe da ist und * `acceptedAt` eine Zahl ist. Ob die Art erlaubt ist (`kind_not_allowed`), die * Fassung gilt (`unknown_version`, `no_version`) und der Text derselbe ist * (`text_changed`), entscheidet der Server. Eine schon bestaetigte Fassung * kommt als `already_accepted` mit `data.contractId`; das ist kein Schaden, * sondern die Bestaetigung, dass es sie gibt. */ export declare function reportCustomerContract(transport: InternerTransport, options: ReportCustomerContractOptions): Promise;