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:
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 });