Briefe/Dokumente zum Vertrag hochladen

Briefe/Dokumente zum Vertrag hochladen

Inhaltsverzeichnis:


Ausgangssituation

Sie möchten einen Brief zum Vertrag hochladen.

Vorgehen

Sie können zum Vertrag beliebig viele Briefe per API hochladen.

Allgemeines zum Hochladen

  • für die API wird über OAuth2 ein BearerToken (mit scope: drive) ermittelt über ClientId+ClientSecret und Benutzername+Passwort. Dieses Token ist 30 Minuten gültig, und sollte in der Zeit wiederverwendet werden.
    Nach den 30 Minuten kann man sich über das RefreshToken ein aktuelles Token holen. Aber dann muss man das ursprüngliche Token auch mit Scope: offline_access%20drive geholt haben.

  • Insert und Update von Datensätzen ist der gleiche API-Aufruf. Wenn der Wert im Feld-‚Id‘ in der Datenbank bekannt ist, wird ein Update gemacht. Ansonsten ein Insert

  • Es muss immer der komplette Datensatz übertragen werden. Es reicht nicht aus, nur geänderte Felder zu übertragen. Nicht übergebene Felder werden in der Datenbank auf leer gesetzt

  • Leere Felder werden normalerweise nicht übertragen. Dadurch werden weniger Daten übertragen. Wenn man ein Feld (welches vorher gefüllt war) per Update auf leer setzen möchte, muss man beim AmsTransferContextOptions das Feld SendNulls=true setzen

  • Die markierten Zwangsfelder müssen gefüllt werden

  • Die IMPORTACTION muss passend zu den Daten gefüllt werden. Es sollten immer nur die nötigen Datensätze geändert werden (z.B. wenn nur der Vertrag geändert wird, muss meist nicht der Kunde auch geändert werden):

IMPORTACTION

Bedeutung

IMPORTACTION

Bedeutung

iaNewKD

Kunde neu

iaUpdateKD

Kunde ändern

iaUpdateKDVT

Kunde und Vertrag ändern

iaUpdateKDNoVT

Kunde ändern, aber Vertrag unverändert

iaNewVT

Vertrag neu

iaUpdateVT

Vertrag ändern

iaNoKDVTUpdate

z.B. Schaden neu/ändern, aber Vertrag und Kunde unverändert

iaNew

sonstiges neu (z.B. Gesellschaft)

  • assfinet Cloud und ams.5 sind unterschiedliche Datenbanksysteme. Das bedeutet beim Erzeugen von Datensätzen per API:

    • wenn ein neuer Vertrag und ein neuer Brief (oder ein neuer Vertrag/Schaden/Termin/Aufgabe) angelegt werden, so müssen diese Datensätze in einem gemeinsamen TRANSFER übertragen werden. Ansonsten geht die Verknüpfung zwischen dem Vertrag-Brief verloren

    • Wenn man einen Brief (oder ein neuer Brief/Schaden/Termin/Aufgabe) zu einem bestehenden Vertrag per API anlegt, so muss mit dem Vertrag-Datensatz bereits eine Replikation durchlaufen worden sein, damit beide Datenbanken die gleiche Feldkennung-Amsidnr haben. Dieses wird in den Beispielen geprüft mit der Testkennung auf z.B. "Kd-" und "Vt-"

  • Damit ein neues Dokument erfolgreich nach ams.5 übertragen werden kann, muss beim TRANSFER auch sein zugehöriger Verweis mit übergeben werden

  • Es kann auch ein neuer Vertrag gleichzeitig mit einem neuen zugeordneten Dokument hochgeladen werden. Siehe ApiDokumentNeuerVertragUpload()

  • In Collaboration definierte Standardschlagwörter müssen zu einem neuen Brief nicht mit übertragen werden, da diese automatisch gespeichert werden. Abweichende Schlagwörter können aber beim Transfer zum Brief genutzt werden. Bitte prüfen Sie, ob Ihr Standard-Brief-Schlagwort gesetzt ist:

image-20251201-114944.png

Ein Dokument zu einem bestehenden Vertrag hochladen

  • mit ClientId + ClientSecret und der Kombination aus Name + Passwort über "oauth/token" einen Bearer-Token holen (noch gültige Token nicht erneut holen)

  • neue File-Guid ermitteln mit "/api/v1/File"

  • neue Datei selbst hochladen mit "/api/v1/File/" + myFileGuid + "/FileData"

  • in der Struktur-AmsTransferContext den neuen Briefdatensatz und Brief-TagSetting hinzufügen

  • Brief-TagSetting wird benötigt, falls der Brief Schlagwörter benötigt (falls mehr als Standard-Schlagworte).

  • Der Vertrag muss mit dem Brief gemeinsam hochgeladen werden, damit die Zuordnung klappt

  • Das LinkObject muss mit dem Brief gemeinsam hochgeladen werden, damit der Brief sichtbar ist

  • diese Daten läd man nun als JSON-String mitsamt Bearer-Token an "/api/v1/Ams/Transfer" hoch

  • Beispiel in C# :

// mit ClientId und ClientSecret und Username+Passwort anmelden und ein Dokument zum Vertrag neu hochladen public static async Task ApiDokumentVertragUpload () { HttpClient httpClient = new HttpClient(); Uri baseUriAuth, baseUriApi; string userName, passwort, license; GetServerUrl(out baseUriAuth, out baseUriApi, out userName, out passwort, out license); // meine Servereinstellungen (bearerToken, bearerExpireTimeUTC, refreshToken) = await GetBearerToken(httpClient, baseUriAuth, userName, passwort, bearerToken, bearerExpireTimeUTC, refreshToken, license); // Bearer-Token ermitteln, und Ablaufzeit des BearerToken, und RefreshToken string vertragGuid = "2936E523-4D79-4668-9D80-xxxx"; // meinen Vater - Datensatz über die Guid lesen. Hier Vertrag.Id eintragen bool adminAccessMode = true; //darf der Benutzer AdminZugriff? Sonst false //der Vertrag zum Dokument muss gelesen werden, damit beides gemeinsam im Transfer enthalten ist: var myVertrag = await GetVertrag(httpClient, bearerToken, baseUriApi, vertragGuid, adminAccessMode); //den Vertrag lesen var myKunde = await GetVertragKunde(httpClient, bearerToken, baseUriApi, myVertrag.Id.ToString(), adminAccessMode); //den Kunden zum Vertrag lesen if (myVertrag.Amsidnr.IndexOf(KundePreAmsidnr) >= 0 || myVertrag.Amsidnr.IndexOf(VertragPreAmsidnr) >= 0 || myVertrag.Amsidnr.IndexOf(SchadenPreAmsidnr) >= 0) throw new Exception("Fehler: der Vater-Datensatz wurde noch nicht nach AMS5 übertragen und ist per Replikation wieder zurück nach Collaboration synchronisiert"); string nameJpg = "Meine_Datei" + DateTime.Now + ".JPG"; //hier Ihre Dateibezeichnung //neue File-Guid ermitteln: string apiPath = "/api/v1/File"; Guid myFileGuid; AmsFileContext fileContext = new AmsFileContext { Name = nameJpg, License = mySchaden.License, //nehme License wie im Vater-Datensatz }; var contenStr = Newtonsoft.Json.JsonConvert.SerializeObject(fileContext, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }); httpClient.DefaultRequestHeaders.Clear(); httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", String.Format("Bearer {0}", bearerToken)); HttpContent content = new StringContent(contenStr, System.Text.Encoding.UTF8, "application/json"); var requestUri = new Uri(baseUriApi, apiPath); var results2 = await httpClient.PostAsync(requestUri, content); var apiErgebnis = await results2.Content.ReadAsStringAsync(); if (results2.StatusCode != HttpStatusCode.OK) throw new Exception("Fehler: " + apiErgebnis); dynamic myResponse = JObject.Parse(apiErgebnis); try { myFileGuid = myResponse.FileGuid; //GUID für den gleich hochzuladenden Dateianhang if (myFileGuid == null || myFileGuid == Guid.Empty) { throw new Exception("VertragTransfer_File GUID fehlgeschlagen: leer: " + myResponse.ToString()); } } catch (Exception ex) { throw new Exception("Fehler: " + ex.Message); } //neue Datei jetzt hochladen: apiPath = "/api/v1/File/" + myFileGuid + "/FileData"; MultipartFormDataContent form = new MultipartFormDataContent(); content = new StringContent("fileToUpload"); form.Add(content, "fileToUpload"); httpClient.DefaultRequestHeaders.Clear(); httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", String.Format("Bearer {0}", bearerToken)); var stream = new FileStream("C:\\Temp\\kleine_datei.jpg", FileMode.Open); //hier Ihre Datei eintragen content = new StreamContent(stream); content.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") { Name = "file", FileName = nameJpg }; form.Add(content); requestUri = new Uri(baseUriApi, apiPath); HttpResponseMessage response = null; try { response = await httpClient.PostAsync(requestUri, form); var responseString = await response.Content.ReadAsStringAsync(); if (response.StatusCode != HttpStatusCode.OK) throw new Exception("Fehler: " + apiErgebnis); if (!responseString.Equals("true",StringComparison.OrdinalIgnoreCase)) throw new Exception("Fehler: nicht erfolgreich: " + apiErgebnis); } catch (Exception ex) { throw new Exception("Fehler Datei hochladen: " + ex.Message); } finally { stream.Close(); } var k = response.Content.ReadAsStringAsync().Result; if (k.ToLower() != "true") { throw new Exception("Fehler Datei hochladen: false"); } //jetzt noch den zugehörigen Brief-Datensatz anlegen: var briefId = Guid.NewGuid(); var myBrief = new BriefModel { Id = briefId, Amsidnr = DokumentPreAmsidnr + briefId, // Zwangsfeld, meine eindeutige interne Dokument-Nummer Bearbeiter = "MeinFirma", Key = myVertrag.Amsidnr, Brieftyp = "DMS-JPG", // welcher Brieftyp, hier JPG. Jeweils "DMS-" davor, also z.B.: "DMS-PDF", "DMS-MSG", "DMS-EML", "DMS-RTF", "DMS-GDV", "DMS-DOC", "DMS-TIF" Auslagerungsschutz = false, FileGuid = myFileGuid, Erstellt = DateTime.Now, Titel = "mein Brief Titel:" + DateTime.Now, Compression = 0, ArchiviertAm = DateTime.Now, License = mySchaden.License, //nehme License wie im Vater-Datensatz Links = new List<BriefLinkModel>() { new BriefLinkModel() { Ordner = "ROOT/Sonstiges" } }, // wie in AMS.5 die Ordnerstruktur im Postfach. z.B. "ROOT/Ablage", "ROOT/Dokumente" "ROOT/Bilder", "ROOT" }; //Schagworte aus der Konfiguration (meistens "PORTAL") werden automatisch gesetzt. Hier also nur eventuell zusätzliche Schlagworte setzen //var myTagSettings = new TagSettingModel //{ // Id = Guid.NewGuid(), // Amsidnr = "P-" + Guid.NewGuid(), // Zwangsfeld, meine eindeutige interne Tag-Nummer. Erst mal vorläufige Nummer, wird später durch AMS.5 endgültig vergeben // Key = myBrief.Amsidnr, // Schlagwort zeigt worauf? Hier auf Dokument // TagKey = "AMS52000001xxxx", // Zwangsfeld, Schlagwort.Amsidnr für abweichendes Portalschlagwort (Standard meist "PORTAL" wird bereits automatisch gesetzt). Siehe /api/v1/Ams/Tag // KeyArt = ForeignTable.Briefe, // Schlagwort worauf? Hier auf Brief. ACHTUNG: Hier die ENUM-Ziffer übergeben z.B. 1 //}; //if (!("|" + (myVertrag.Schlagwoerter ?? "").Trim() + "|").Contains("AMS52000001xxxx")) // myVertrag.Schlagwoerter += (myVertrag.Schlagwoerter?.Length>2 ? "|":"") + "AMS52000001xxxx"; //extra redundant: in vertrag.schlagwoerter und TagSettings //LinkObject erzeugen, damit Dokument gefunden wird: var linkId = Guid.NewGuid(); var myLinkObject = new LinkObjectModel { Id = linkId, Amsidnr = LinkPreAmsidnr + linkId, // Zwangsfeld, meine eindeutige interne Link-Nummer SId = myVertrag.Amsidnr, SArt = LinkObjectArt.Vertrag, // ACHTUNG: Hier ENUM-Ziffer übergeben z.B. 8 Key = myBrief.Amsidnr, KeyArt = LinkObjectArt.Brief, // ACHTUNG: Hier ENUM-Ziffer übergeben z.B. 0 Bearbeiter = "MeinFirma", //Ordner= "ROOT/Bilder", // wie in AMS.5 die Ordnerstruktur im Postfach. z.B. "ROOT/Ablage", "ROOT/Dokumente" "ROOT/Bilder", "ROOT" License = mySchaden.License, //nehme License wie im Vater-Datensatz }; AmsTransferContext myExport = new AmsTransferContext { Kunden = new List<KundeModel> { myKunde }, // Kunde zum Vertrag mit übergeben Vertraege = new List<VertragModel> { myVertrag }, Briefe = new List<BriefModel> { myBrief }, LinkObjekte = new List<LinkObjectModel> { myLinkObject }, //TagSettings = new List<TagSettingModel> { myTagSettings}, }; await GetTransferToken(httpClient, baseUriApi, bearerToken, license, myExport, ImportAction.iaNoKDVTUpdate, SendNulls:false); // Ihre Lizenz/Mandant eintragen und ImportFlags und TransferOptions in Parameter myExport als Rückgabewert zurückerhalten //neuen Brief hochladen: apiPath = "/api/v1/Ams/Transfer"; contenStr = Newtonsoft.Json.JsonConvert.SerializeObject(myExport, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }); httpClient.DefaultRequestHeaders.Clear(); httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", String.Format("Bearer {0}", bearerToken)); content = new StringContent(contenStr, System.Text.Encoding.UTF8, "application/json"); requestUri = new Uri(baseUriApi, apiPath); results2 = await httpClient.PostAsync(requestUri, content); apiErgebnis = await results2.Content.ReadAsStringAsync(); if (results2.StatusCode != HttpStatusCode.OK) throw new Exception("Fehler: " + apiErgebnis); var mySuccessResponse = Newtonsoft.Json.JsonConvert.DeserializeObject<SuccessResponse>(apiErgebnis); if (mySuccessResponse == null || !mySuccessResponse.Success) throw new Exception("Fehler: nicht erfolgreich: "+ apiErgebnis); }

Beispiel Content beim Upload-Filedata:
a) im Quelltext

image-20251202-101738.png

b) in Fiddler

image-20251202-101749.png
POST https://drive-staging.assfinetcloud.de/api/v1/File/9fd0c269-d74e-43cd-a035-039b661c7bb2/FileData HTTP/1.1 Authorization: Bearer d5XI9X-IUE649N0v0Nh9EAwIxkU6UtgcE5GpIud5CX5gMiDVx45cgSWZT5q7_lfeZI_B4B3x8aoBOiNIVKPI0fYv4OCY--NM0cTU3C7kuvIjyA7xoYC7TVWTvxWwlZQqfTvOsyLtSrwQ0iU1bnB_OfrYl_8t570dLXCrDlkuGTKfyDt2MNAPDtTncG__k-duAyeDox2XMTmKwMcFhWnZ1-yJHQ6ha4ifsUn-KSe2i6tiYG-hUChAVUFn9KlCK6Ul6rOluUqvFW9UX-Act5_EXPnwjxuZqjW0cn8izCDqQqiyqI8leK8QuMydCNzX-fDLAXx56bqKJ2_CydunH4kIX_3X7VAxhCPx7u2q9ARDoIoxg-9TYQbO6LhANjeJ_4y9bKabeuDDn-HPvr2MIXUhtNi5hRAWx5wk_G2dw3XpIn_WDfiEJkpftWP_v-mYKUQ_lwSaMKph4axwEzlWKqA2nX1mxuziHj3zRungRgHluEUT3liLECOL017w3R9vjbYCNnmXMbfwZg2M6RIGd0oM0B1_P3EeV6q7d4lfbRqALZxPRQxvbVJpq07rE7PwAGzf7mi3EKcOVjngTESVCtqE_-n0TkYXcJw3Y6FomGZ49nA Content-Type: multipart/form-data; boundary="0cb78752-de38-4ee1-ae4f-fea41d7f3079" Host: drive-staging.assfinetcloud.de Content-Length: 1197 Expect: 100-continue --0cb78752-de38-4ee1-ae4f-fea41d7f3079 Content-Type: text/plain; charset=utf-8 Content-Disposition: form-data; name=fileToUpload fileToUpload --0cb78752-de38-4ee1-ae4f-fea41d7f3079 Content-Disposition: form-data; name=file; filename="Meine_Datei29.11.2021 11:24:52.JPG"

Beispiel Content beim Transfer:

{"Vertraege":[{"Id":"21d37d3b-b3df-4290-bcad-xxxx","Bearbeitet":"0001-01-01T01:00:00+01:00","Sparte":"KompaktKraft","Vu":"Apfelsinia Allgemeine","VuNummer":53333,"ComputedStatus":"Angebot","License":"DEMO_18800xxx","LastSynchronisation":"0001-01-01T00:00:00","Amsidnr":"Ver-16384521659951","Bearbeiter":"Drive","Gesellschaft":"APFEL-A","IsHistorie":false,"Key":"DEMO-0000000730","Status":"ANGEBOT","Typ":"KOMPAKTKRAFT","Vertragsablauf":"2022-03-02T00:00:00","Vertragsbeginn":"2021-12-02T00:00:00","Draft":false,"LastSynchronisation":"0001-01-01T00:00:00Z"}],"Briefe":[{"Id":"260fd876-3479-433a-8b3f-xxx","Erstellt":"2022-02-10T17:49:40.0114616+01:00","Links":[{"Ordner":"ROOT/Sonstiges"}],"FileGuid":"e0027df0-a14c-4321-a032-xxx","License":"DEMO_18800179","LastSynchronisation":"0001-01-01T00:00:00","Amsidnr":"D-3cbc7705-93f7-4edb-87e8-xxx","ArchiviertAm":"2022-02-10T17:49:40.0114616+01:00","Auslagerungsschutz":false,"Bearbeiter":"MeinFirma","Brieftyp":"DMS-JPG","Compression":0,"Key":"Ver-16384521659951","Titel":"mein Brief Titel:10.02.2022 17:49:40"}],"LinkObjekte":[{"Id":"91bfe659-92f5-4f64-8a08-xxx","KeyArt":0,"SArt":8,"License":"DEMO_18800179","LastSynchronisation":"0001-01-01T00:00:00","Amsidnr":"L-1e321f00-e0d7-4a3f-b859-xxx","Bearbeiter":"MeinFirma","Key":"D-3cbc7705-93f7-4edb-87e8-xxx","Ordner":"ROOT/Sonstiges","SId":"Ver-16384521659951"}],"ImportFlags":{"ImportAction":"iaNoKDVTUpdate","ImportActionSchaden":"iaUndefinedSchaden","EnableOptVnrOnly":false,"Identity":"AMSPK","Importbehavior":"AUTOMATIC"},"Options":{"Synchron":true,"TransferMode":"SaveAndTransport","License":"DEMO_18800xxx"}}

Ein neuer Vertrag und gleichzeitig ein neues zugeordnetes Dokument hochladen

  • Man kann auch gleichzeitig in einem Transfer einen neuen Vertrag und gleichzeitig ein zugeordnetes Dokument hochladen

  • Da man ja auch einen neuen Vertrag hochläd, muss auch der zugehörige Kunde im Transfer übertragen werden

  • Als Importaction nimmt man dann: ImportAction.iaNewVT

public static async Task ApiDokumentNeuerVertragUpload(string kundeGuid, bool adminAccessMode = true) { HttpClient httpClient = new HttpClient(); Uri baseUriAuth, baseUriApi; string userName, passwort, license, gesellschaft; GetServerUrl(out baseUriAuth, out baseUriApi, out userName, out passwort, out license, out gesellschaft); // meine Servereinstellungen (bearerToken, bearerExpireTimeUTC, refreshToken) = await GetBearerToken(httpClient, baseUriAuth, userName, passwort, bearerToken, bearerExpireTimeUTC, refreshToken, license); // Bearer-Token ermitteln, und Ablaufzeit des BearerToken, und RefreshToken var myKunde = await GetKunde(httpClient, bearerToken, baseUriApi, kundeGuid, adminAccessMode); //den Kunden lesen if (myKunde.Amsidnr.IndexOf(KundePreAmsidnr) >= 0) throw new Exception("Fehler: der Kunde wurde noch nicht nach AMS.5 übertragen und ist per Replikation wieder zurück nach assfinet Cloud synchronisiert worden"); var vertragId = Guid.NewGuid(); var myVertrag = new VertragModel { Id = vertragId, Amsidnr = VertragPreAmsidnr + vertragId, // Zwangsfeld, meine eindeutige interne Vertragsnummer Key = myKunde.Amsidnr, // Zwangsfeld, Vater - Datensatz, also zugehöriger Kunde.Amsidnr Vm1 = MeineFirmaVm1, // Freigabe für welchen Vermittler? Feld "Code" in api/v1/Ams/Vermittler Matchcode = "Test", // Suchfeld Nachname Typ = "GEB", // MeineFirmaTyp, // Zwangsfeld, Sparte des Vertrages, muss vorkommen in Tabelle-Sparte mit Feld-Spartenkuerzel. Sparte = "Kapital", // z.B. "Feuer", IsHistorie = false, // Zwangsfeld Jahrespraemie = (decimal)20329.80, //nicht nur dieses Feld alleine füllen, da AMS die Jahresprämie aus Netto+Gebühr+UnterjährigZuschlag+Zahlweise+VersSteuer neu berechnet Jahressteuerbetrag = (decimal)0.00, PraemieNetto = (decimal)1694.15, RisikoStrasse = "Test Risiko neu:" + DateTime.Now, // RisikoAllgemein = "RisikoAllgemein" nicht alleine füllen, da es in AMS.5 selbst ermittelt wird" Status = "EIGEN", // Zwangsfeld, Status des Vertrages, "ANFRAGE","ANGEBOT","EIGEN","FREMD","FREMDTEIL","GESPERRT","RUHEND","STORNO","INFO" Steuer = (decimal)0.00, Unterjaehrigkeitszuschlag = (decimal)0.00, Vermittlerkonto = "STANDARD", Vertragsablauf = DateTime.Now.AddMonths(-5), // Zwangsfeld, wann ist Vertragsablauf Vertragsbeginn = DateTime.Now.AddMonths(+5), // Zwangsfeld, wann ist Vertragsbeginn VertragsNr = "Test VSNR " + DateTime.Now, Waehrung = "EUR", Zahlweise = "Monatlich", Zeichnungsjahr = 2018, Zuordnung = "PRIVAT", Vu = "KAPITAL Vernichtungs - AG", // "Gesellschaft VU-Nr 04143", ComputedStatus = "Police", Abbuchung = false, // Zwangsfeld AbrechenbarerVertrag = true, // Zwangsfeld Sammelvertrag = false, // Zwangsfeld Gesellschaft = gesellschaft, // Zwangsfeld, Gesellschaft des Vertrages, muss vorkommen in Tabelle-Gesellschaft mit Feld-Matchcode. License = myKunde.License, //nehme License vom Kunde }; //string nameJpg = "Meine_Datei" + DateTime.Now + ".JPG"; //hier Ihre Dateibezeichnung string nameJpg = "Meine_Datei.JPG"; //hier Ihre Dateibezeichnung //neue File-Guid ermitteln: string apiPath = "/api/v1/File"; Guid myFileGuid; AmsFileContext fileContext = new AmsFileContext { Name = nameJpg, License = myKunde.License, //nehme License wie im Vater-Datensatz }; var contenStr = Newtonsoft.Json.JsonConvert.SerializeObject(fileContext, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }); httpClient.DefaultRequestHeaders.Clear(); httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", String.Format("Bearer {0}", bearerToken)); HttpContent content = new StringContent(contenStr, System.Text.Encoding.UTF8, "application/json"); var requestUri = new Uri(baseUriApi, apiPath); HttpResponseMessage results2; string apiErgebnis; dynamic myResponse; results2 = await httpClient.PostAsync(requestUri, content); apiErgebnis = await results2.Content.ReadAsStringAsync(); if (results2.StatusCode != HttpStatusCode.OK && results2.StatusCode != HttpStatusCode.NoContent) throw new Exception("Fehler: " + apiErgebnis); myResponse = JObject.Parse(apiErgebnis); try { myFileGuid = myResponse.FileGuid; //GUID für den gleich hochzuladenden Dateianhang if (myFileGuid == null || myFileGuid == Guid.Empty) { throw new Exception("VertragTransfer_File GUID fehlgeschlagen: leer: " + myResponse.ToString()); } } catch (Exception ex) { throw new Exception("Fehler: " + ex.Message); } //neue Datei jetzt hochladen: apiPath = "/api/v1/File/" + myFileGuid + "/FileData"; MultipartFormDataContent form = new MultipartFormDataContent(); content = new StringContent("fileToUpload"); form.Add(content, "fileToUpload"); httpClient.DefaultRequestHeaders.Clear(); httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", String.Format("Bearer {0}", bearerToken)); var stream = new FileStream("C:\\Temp\\kleine_datei.jpg", FileMode.Open); //hier Ihre Datei eintragen content = new StreamContent(stream); content.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data") { Name = "file", FileName = nameJpg }; form.Add(content); requestUri = new Uri(baseUriApi, apiPath); HttpResponseMessage response = null; try { response = await httpClient.PostAsync(requestUri, form); var responseString = await response.Content.ReadAsStringAsync(); if (response.StatusCode != HttpStatusCode.OK) throw new Exception("Fehler: " + apiErgebnis); if (!responseString.Equals("true", StringComparison.OrdinalIgnoreCase)) throw new Exception("Fehler: nicht erfolgreich: " + apiErgebnis); } catch (Exception ex) { throw new Exception("Fehler Datei hochladen: " + ex.Message); } finally { stream.Close(); } var k = response.Content.ReadAsStringAsync().Result; if (k.ToLower() != "true") { throw new Exception("Fehler Datei hochladen: false"); } //jetzt noch den zugehörigen Brief-Datensatz anlegen: var briefId = Guid.NewGuid(); var myBrief = new BriefModel { Id = briefId, Amsidnr = DokumentPreAmsidnr + briefId, // Zwangsfeld, meine eindeutige interne Dokument-Nummer Bearbeiter = "MeinFirma", Key = myVertrag.Amsidnr, Brieftyp = "DMS-JPG", // welcher Brieftyp, hier JPG. Jeweils "DMS-" davor, also z.B.: "DMS-PDF", "DMS-MSG", "DMS-EML", "DMS-RTF", "DMS-GDV", "DMS-DOC", "DMS-TIF" Auslagerungsschutz = false, FileGuid = myFileGuid, Erstellt = DateTime.Now, //Titel = "mein Brief Titel üöäÜÖÄ:" + DateTime.Now, Titel = "mein Brief Titel ohne umlaute:" + DateTime.Now, Compression = 0, ArchiviertAm = DateTime.Now, License = myKunde.License, //nehme License vom Kunde Links = new List<BriefLinkModel>() { new BriefLinkModel() { Ordner = "ROOT/Sonstiges" } }, // wie in AMS.5 die Ordnerstruktur im Postfach. z.B. "ROOT/Ablage", "ROOT/Dokumente" "ROOT/Bilder", "ROOT" }; //Schagworte aus der Konfiguration (meistens "PORTAL") werden automatisch gesetzt. Hier also nur eventuell zusätzliche Schlagworte setzen //var tagId = Guid.NewGuid(); //var myTagSettings = new TagSettingModel //{ // Id = tagId, // Amsidnr = "P-" + tagId, // Zwangsfeld, meine eindeutige interne Tag-Nummer. Erst mal vorläufige Nummer, wird später durch AMS.5 endgültig vergeben // Key = myBrief.Amsidnr, // Schlagwort zeigt worauf? Hier auf Dokument // TagKey = "AMS5200xxxxxxx", // Zwangsfeld, Schlagwort.Amsidnr für abweichendes Portalschlagwort (Standard meist "PORTAL" wird bereits automatisch gesetzt). // KeyArt = ForeignTable.Briefe, // Schlagwort worauf? Hier auf Brief. ACHTUNG: Hier ENUM-Ziffer übergeben z.B. 4 //}; //LinkObject erzeugen, damit Dokument gefunden wird: var linkId = Guid.NewGuid(); var myLinkObject = new LinkObjectModel { Id = linkId, Amsidnr = LinkPreAmsidnr + linkId, // Zwangsfeld, meine eindeutige interne Link-Nummer SId = myVertrag.Amsidnr, SArt = LinkObjectArt.Vertrag, // ACHTUNG: Hier ENUM-Ziffer übergeben z.B. 8 Key = myBrief.Amsidnr, KeyArt = LinkObjectArt.Brief, // ACHTUNG: Hier ENUM-Ziffer übergeben z.B. 0 Bearbeiter = "MeinFirma", Ordner = "ROOT/Sonstiges", // wie in AMS.5 die Ordnerstruktur im Postfach. z.B. "ROOT/Ablage", "ROOT/Dokumente" "ROOT/Bilder", "ROOT" License = myKunde.License, //nehme License vom Kunde }; AmsTransferContext myExport = new AmsTransferContext { Kunden = new List<KundeModel> { myKunde }, // Kunde zum Vertrag mit übergeben Vertraege = new List<VertragModel> { myVertrag }, Briefe = new List<BriefModel> { myBrief }, LinkObjekte = new List<LinkObjectModel> { myLinkObject }, //TagSettings = new List<TagSettingModel> { myTagSettings, }, }; await GetTransferToken(httpClient, baseUriApi, bearerToken, license, myExport, ImportAction.iaNewVT); // Ihre Lizenz/Mandant eintragen und ImportFlags und TransferOptions in Parameter myExport als Rückgabewert zurückerhalten //neuen Vertrag und neuen Brief hochladen: apiPath = "/api/v1/Ams/Transfer"; contenStr = Newtonsoft.Json.JsonConvert.SerializeObject(myExport, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }); httpClient.DefaultRequestHeaders.Clear(); httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", String.Format("Bearer {0}", bearerToken)); content = new StringContent(contenStr, System.Text.Encoding.UTF8, "application/json"); requestUri = new Uri(baseUriApi, apiPath); results2 = await httpClient.PostAsync(requestUri, content); apiErgebnis = await results2.Content.ReadAsStringAsync(); if (results2.StatusCode != HttpStatusCode.OK && results2.StatusCode != HttpStatusCode.NoContent) throw new Exception("Fehler: " + apiErgebnis); var mySuccessResponse = Newtonsoft.Json.JsonConvert.DeserializeObject<SuccessResponse>(apiErgebnis); if (mySuccessResponse == null || !mySuccessResponse.Success) throw new Exception("Fehler: nicht erfolgreich: " + apiErgebnis); }

Anhang

Verweise


Noch Fragen? Ist etwas unklar geblieben?

Sollten Sie noch weitere Fragen zu diesem Thema haben, die in diesem Artikel nicht behandelt oder erklärt wurden, wenden Sie sich gerne über unser Kundenportal an unseren Support.