Zum Inhalt

BMU-Dokumente mit dem SDK

BMU-Begleit- und Übernahmescheine mit dem SDK: anlegen, Felder setzen, signieren, Layer anhängen und an ZEDAL senden.

Die fachlichen Hintergründe stehen in der Anleitung Begleitschein und Übernahmeschein.

BmuDocumentHandler

Ablauf je Rolle mit durchgehendem Beispiel: Begleitschein je Rolle.

Der Handler für BMU-Begleit- und Übernahmescheine arbeitet gegen die zustandslose BmuDocumentApi. Er hält das XML (DocXml) und die typisierte Sicht (Document), schickt das XML bei jedem Aufruf mit und aktualisiert danach beide Properties.

Methode Zweck
CreateFromTemplate(templateXml) Dokument aus einem ZEDAL-Muster anlegen
Create(document, vorlageLayer, xmlOptions) Dokument aus Daten anlegen
UpdateDocument(document, xmlOptions) Felder des aktuellen Layers schreiben, nur Felder mit InLayer = true
AddLayer(layerType, xmlOptions) nächsten Layer anhängen, nur beim Begleitschein
GetValidSignaturePositions() offene Signaturstellen des aktuellen Layers
Load(docXml) vorhandenes XML laden, etwa nach dem Signieren
LoadTransportDocumentFromZedal(docIdentifier, value) Dokument aus ZEDAL laden
SubmitTransportDocumentToZedal(cancel, dekade, distribute) an ZEDAL senden; liefert die DocumentId

xmlOptions ist optional; ohne Angabe prüfen Create und UpdateDocument vollständig, AddLayer prüft den neuen Layer nicht. Ablauf mit Code: BMU-Anleitung.

Setup

using System;
using System.Linq;
using Google.Protobuf;
using Infotech.Signer.Sign.V1;          // DocumentInput, DocumentKind
using Infotech.Zedal.Bxa.Bmu.V1.Api;    // XmlOptions
using Infotech.Zedal.Core.V1.Api;       // TemplateId, DocumentId
using Infotech.Zedal.Documents.V1;      // Document, StringField, DoubleField, FieldMeta
using Infotech.Zedal.Documents.V1.Bmu;  // BGSDokument, UNSDokument, Befoerderer, LayerType, Rolle
using Zedal.Sdk.Apis.Signer;            // DocumentResults

var bmu = client.DocumentHandler.CreateBmuHandler();

Anlegen

Aus einem ZEDAL-Muster

byte[] templateXml = await client.CoreApi.Templates.ExportTransportTemplate(
    new TemplateId { Id = templateId });   // template_id aus der Liste

await bmu.CreateFromTemplate(templateXml);

Aus Daten

var entwurf = new XmlOptions { Validation = XmlOptions.Types.Validation.None };

await bmu.Create(new Document
{
    Bgs = new BGSDokument
    {
        Abfallbezeichnung = new StringField { Value = "Altöl", Meta = new FieldMeta { InLayer = true } }
    }
}, vorlageLayer: false, entwurf);

Felder setzen

await bmu.UpdateDocument(new Document
{
    Bgs = new BGSDokument
    {
        Menge = new DoubleField { Value = 12.5, Meta = new FieldMeta { InLayer = true } }   // Tonnen
    }
}, entwurf);

Signieren

Welche Signaturstellen im aktuellen Layer offen sind, liefert:

var positionen = await bmu.GetValidSignaturePositions();

Signiert wird über den WebSigner (infotech.signer.sign.v1): Vorgang mit dem aktuellen XML anlegen und vorlegen, die signing_url einem Menschen zeigen, der dort signiert, auf den Abschluss warten, Ergebnis abholen. Das Ergebnis enthält das vollständige signierte XML. SignAsync erledigt das in einem Aufruf:

var result = await client.SignerApi.SigningProcesses.SignAsync(
    new[]
    {
        new DocumentInput
        {
            DisplayName = "Begleitschein",
            Kind        = DocumentKind.BmuXml,
            Content     = ByteString.CopyFrom(bmu.DocXml)
        }
    },
    presentSigningUrl: url => Console.WriteLine($"Open to sign: {url}"));

var signed = result.Results.SingleOrDefault();
if (result.Completed && DocumentResults.IsUsable(signed))
{
    await bmu.Load(signed.Content.ToByteArray());   // signiertes XML übernehmen
}

Nächster Layer

await bmu.AddLayer(LayerType.Befoerderer);

await bmu.UpdateDocument(new Document
{
    Bgs = new BGSDokument
    {
        Befoerderer1 = new Befoerderer
        {
            Kfz = new StringField { Value = "RE TK 61", Meta = new FieldMeta { InLayer = true } }
        }
    }
});

Lesen

// storedXml: the document XML from your own system as byte[]
await bmu.Load(storedXml);
double? quantity = bmu.Document.Bgs.Menge?.Value;

An ZEDAL senden

DocumentId id = await bmu.SubmitTransportDocumentToZedal(cancel: false, dekade: false, distribute: false);

Übernahmeschein

var uns = client.DocumentHandler.CreateBmuHandler();

await uns.Create(new Document
{
    Uns = new UNSDokument
    {
        Abfallbezeichnung = new StringField { Value = "Altöl", Meta = new FieldMeta { InLayer = true } }
    }
}, vorlageLayer: false,
   new XmlOptions { Validation = XmlOptions.Types.Validation.None, AtbRolle = Rolle.Erz });