Briefe/Dokumente zum Schaden hochladen

Briefe/Dokumente zum Schaden hochladen

Inhaltsverzeichnis:


Ausgangssituation

Sie möchten einen Brief zum Schaden hochladen.

Vorgehen

Sie können zum Schaden 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 Schaden 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 Schaden-Brief verloren

    • Wenn man einen Brief (oder ein neuer Brief/Schaden/Termin/Aufgabe) zu einem bestehenden Schaden per API anlegt, so muss mit dem Schaden-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 Schaden gleichzeitig mit einem neuen zugeordneten Dokument hochgeladen werden. Siehe ApiDokumentNeuerSchadenUpload()

  • 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 Schaden 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 Schaden 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 Schaden neu hochladen public static async Task ApiDokumentSchadenUpload() { 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 schadenGuid = "2936E523-4D79-4668-9D80-xxxxxxx"; // meinen Vater - Datensatz über die Guid lesen. Hier Schaden.Id eintragen string vertragGuid = "FDFD8B6A-1593-4D7F-9DCF-xxxxxxx"; // Vertrag zu Kunden. Hier Vertrag.Id eintragen bool adminAccessMode = true; //darf der Benutzer AdminZugriff? Sonst false //der Schaden zum Dokument muss gelesen werden, damit beides gemeinsam im Transfer enthalten ist: var mySchaden = await GetSchaden(httpClient, bearerToken, baseUriApi, schadenGuid, adminAccessMode); //den Schaden lesen var myVertrag = await GetSchadenVertrag(httpClient, bearerToken, baseUriApi, schadenGuid , adminAccessMode); //den Vertrag zum Schaden lesen var myKunde = await GetVertragKunde(httpClient, bearerToken, baseUriApi, myVertrag.Id.ToString(), adminAccessMode); //den Kunden zum Vertrag lesen if (mySchaden.Amsidnr.IndexOf(KundePreAmsidnr) >= 0 || mySchaden.Amsidnr.IndexOf(SchadenPreAmsidnr) >= 0 || mySchaden.Amsidnr.IndexOf(SchadenPreAmsidnr) >= 0) throw new Exception("Fehler: der Vater-Datensatz wurde noch nicht nach AMS.5 übertragen und ist per Replikation wieder zurück nach Collaboration synchronisiert worden"); 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 = myVertrag.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("SchadenTransfer_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"; //Mitgeschnittene Daten siehe unten 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 = mySchaden.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 = myVertrag.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 bitte die ENUM-Ziffer übergeben z.B. 1 //}; //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 = mySchaden.Amsidnr, SArt = LinkObjectArt.Schaden, // ACHTUNG: Hier ENUM-Ziffer übergeben z.B. 4 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 = myVertrag.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 }, // Vertrag zum Schaden mit übergeben Schaden = new List<SchadenModel> { mySchaden }, // Schaden zum Dokument mit übergeben 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-111703.png

b) in Fiddler

image-20251202-111716.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":"945b4b38-dd13-47f9-921c-xxx","Bearbeitet":"2020-12-07T17:13:00+01:00","Sparte":"Kraftfahrzeug","Vu":"R+V Allgem. Versicherung AG","VuNummer":0,"ComputedStatus":"Angebot","License":"DEMO_xxx","LastSynchronisation":"0001-01-01T00:00:00","Abbuchung":false,"AbrechenbarerVertrag":true,"AbrechnenueberEinzelpositionen":false,"Abschlussvermittler":"500DEINEVD","Amsidnr":"032370051162009","Angebot":"2020-12-07T00:00:00","AnpassungAm":"2100-01-01T00:00:00","AnzahlZahlungenProJahr":1,"Bearbeiter":"Schacht","Beteiligungsverhaeltnis":false,"BisherigeJahresNettoPraemie":0.00,"BruttopraemieGemaessZahlweise":427.48,"BruttoVertrag":false,"EinzelpraemienErfassen":false,"GekuendigtVon":"VN","Gesellschaft":"R+V-A","HatFestwertBeteiligung":false,"Inkasso":false,"IsHistorie":false,"Jahrespraemie":427.48,"Jahressteuerbetrag":68.25,"Key":"032370018335312","KeyAngebot":"032370054262847","MaklerFuehrtVersSteuerAb":false,"PraemieNetto":359.23,"RisikoAllgemein":"STD-MS 10 BMW BAYERISCHE MOTOR 3C (320D CABRIO)","Sammelvertrag":false,"Sachbearbeiter":"deinEVD","SpartenberechnungAus":true,"Status":"ANGEBOT","Steuer":19.00,"Typ":"KFZ","Unterjaehrigkeitszuschlag":0.00,"Vermittlerkonto":"STANDARD","Vertragsablauf":"2021-12-10T00:00:00","Vertragsbeginn":"2020-12-10T00:00:00","VertragsNr":"?","VorvertragVU":"ANG-GESELL","Waehrung":"EUR","Zahlweise":"Jährlich","Zeichnungsjahr":2020,"Zuordnung":"PRIVAT","Courtformelbetragzv":0.0,"Courtprozzv":0.0,"Courtprozzvb":0.0,"SpartenberechnAufschub":false,"Zugangsdatum":"2020-05-06T00:00:00","ZugangsdatumJjjj":2020,"ZugangsdatumJjjjmm":20205,"Draft":false,"LastSynchronisation":"2021-03-11T02:41:27.7703714Z","F_NETTOJPRAEMIE":"359.23"}],"Schaden":[{"Id":"05ca1222-cfb9-4707-9a62-xxx","Bearbeitet":"2020-11-18T15:53:11+01:00","SchadenZeitpunkt":"2020-11-18T00:00:00+01:00","License":"DEMO_xxx","ClaimSent":true,"LastSynchronisation":"0001-01-01T00:00:00","Amsidnr":"999990054253728","Anlage":"2020-11-18T00:00:00","Bearbeiter":"cloudtransfer","BearbeiterMakler":"Hartmann","EmailMakler":"cloudt-xxx@yyy.assfinet.de","EmailVn":"evd_xxx@yyy.assfinet.de","Gesellschaft":"ANG-GESELL","Key":"032370051162009","Meldungtag":"2020-11-18T00:00:00","NummerMakler":"2020-KFZ-26645","Regulierungsart":"Fremdregulierung","Reserve":0.00,"Schadenhoehe":0.00,"Schadenstatus":"Prüfung durch Makler","Vermittlerkonto":"STANDARD","VerteilenAufBeteiligte":false,"Vnr":"?","Vorgang":"KH: AW-A 1811 || ?","Zahlung":0.00,"Zeichnungsjahr":2020,"VstAbzug":false,"Draft":false,"ApprovalPending":false,"LastSynchronisation":"2020-11-18T15:01:09.6129648Z"}],"Briefe":[{"Id":"65565fce-c7ba-4eba-936c-xxx","Erstellt":"2021-03-21T15:45:51.5654792+01:00","Links":[{"Ordner":"ROOT/Sonstiges"}],"FileGuid":"f899754a-3936-4f04-b36f-afb69927365d","License":"DEMO_xxx","LastSynchronisation":"0001-01-01T00:00:00","Amsidnr":"D-00a182cb-8dc7-42be-a8d8-xxx","ArchiviertAm":"2021-03-21T15:45:51.5654792+01:00","Auslagerungsschutz":false,"Bearbeiter":"MeinFirma","Brieftyp":"DMS-JPG","Compression":0,"Key":"999990054253728","Titel":"mein Brief Titel:21.03.2021 15:45:51"}],"LinkObjekte":[{"Id":"9549df3c-e905-4c76-8b10-b8975ed568aa","KeyArt":0,"SArt":4,"License":"DEMO_xxx","LastSynchronisation":"0001-01-01T00:00:00","Amsidnr":"L-bc5e3e77-6f76-43ff-a403-291890f5e44f","Bearbeiter":"MeinFirma","Key":"D-00a182cb-8dc7-42be-a8d8-e0cf904fe6dd","Ordner":"ROOT/Sonstiges","SId":"999990054253728"}],"ImportFlags":{"ImportAction":"iaNoKDVTUpdate","EnableOptVnrOnly":false,"Identity":"AMSPK"},"Options":{"Synchron":true,"TransferMode":"SaveAndTransport","License":"DEMO_xxx"}}

Ein neues Dokument zu einem neuen Schaden hochladen

  • Es kann auch ein neuer Schaden gleichzeitig mit einem neuen zugeordneten Dokument hochgeladen werden

  • Der neue Schaden und Brief und LinkObject müssen im gleichen Transfer hochgeladen werden

  • Als ImportAction: ImportAction.iaNoKDVTUpdate

// zu einem neuen Schaden ein Dokument hochladen public static async Task ApiDokumentNeuerSchadenUpload(string vertragGuid, 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 //der Schaden zum Dokument muss gelesen werden, damit beides gemeinsam im Transfer enthalten ist: var myVertrag = await GetVertrag(httpClient, bearerToken, baseUriApi, vertragGuid, adminAccessMode); //den Vertrag zum Schaden lesen var myKunde = await GetVertragKunde(httpClient, bearerToken, baseUriApi, myVertrag.Id.ToString(), adminAccessMode); //den Kunden zum Vertrag lesen var schadenId = Guid.NewGuid(); var mySchaden = new SchadenModel { Id = schadenId, Amsidnr = SchadenPreAmsidnr + schadenId, // Zwangsfeld, meine eindeutige interne Schadennummer Key = myVertrag.Amsidnr, // Zwangsfeld, Vater - Datensatz, also zugehöriger Vertrag.Amsidnr NummerVU = "SNR-" + DateTime.Now.ToString("HHmmss"), // Schadennummer bei der Gesellschaft NummerVN = null, // Schadennummer beim Kunden NummerMakler = null, // Schadennummer beim Makler BearbeiterVU = "", BearbeiterVN = "", Meldungtag = DateTime.Now, //wann wurde gemeldet? SchadenZeitpunkt = DateTime.Now.AddDays(-3), //wann ist der Schaden passiert? Schadenhoehe = (decimal)6.50, Vorgang = "SCHADENTEXT 5 am " + DateTime.Now, Hergang = "HERGANGSTEXT 5 am " + DateTime.Now, Schadenort = "Unna", Risiko = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras XYZ123", Bearbeiter = "MeinBearbeiter", Anspruchsteller = "ich bin Anspruchsteller", ClaimSent = false, Gesellschaft = "VANDAL-A", Vermittlerkonto = "STANDARD", Zeichnungsjahr = 2022, License= myVertrag.License }; if (myVertrag.Amsidnr.IndexOf(KundePreAmsidnr) >= 0 || myVertrag.Amsidnr.IndexOf(SchadenPreAmsidnr) >= 0 || myVertrag.Amsidnr.IndexOf(SchadenPreAmsidnr) >= 0) throw new Exception("Fehler: der Vater-Datensatz wurde noch nicht nach AMS.5 übertragen und ist per Replikation wieder zurück nach assfinet Cloud synchronisiert worden"); 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 Schaden }; 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 && results2.StatusCode != HttpStatusCode.NoContent) 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("SchadenTransfer_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 = mySchaden.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 vom Schaden 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 tagId1 = Guid.NewGuid(); var tagId2 = Guid.NewGuid(); var myTagSettings = new TagSettingModel { Id = tagId1, Amsidnr = "P-" + tagId1, // Zwangsfeld, meine eindeutige interne Tag-Nummer. Erst mal vorläufige Nummer, wird später durch AMS.5 endgültig Key = myBrief.Amsidnr, // Schlagwort zeigt worauf? Hier auf Dokument TagKey = "AMS64000001xxxxxxxxxx", // 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 ENUM-Ziffer übergeben z.B. 0 }; var myTagSettings2 = new TagSettingModel { Id = tagId2, Amsidnr = "P-" + tagId2, // Zwangsfeld, meine eindeutige interne Tag-Nummer. Erst mal vorläufige Nummer, wird später durch AMS.5 endgültig Key = myBrief.Amsidnr, // Schlagwort zeigt worauf? Hier auf Dokument TagKey = "123450000008xxx", // Zwangsfeld, Schlagwort.Amsidnr für abweichendes Portalschlagwort KeyArt = ForeignTable.Briefe, // Schlagwort worauf? Hier auf Brief. ACHTUNG: Hier ENUM-Ziffer übergeben z.B. 0 }; if (!("|" + (mySchaden.Schlagwoerter ?? "").Trim() + "|").Contains("AMS64000001xxxxxxxxxx|123450000008xxx")) mySchaden.Schlagwoerter += (mySchaden.Schlagwoerter?.Length > 2 ? "|" : "") + "AMS64000001xxxxxxxxxx|123450000008xxx"; //extra redundant: in schaden.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 = mySchaden.Amsidnr, SArt = LinkObjectArt.Schaden, ) // ACHTUNG: Hier ENUM-Ziffer übergeben z.B. 4 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 = mySchaden.License, //nehme License vom Schaden }; AmsTransferContext myExport = new AmsTransferContext { Kunden = new List<KundeModel> { myKunde }, // Kunde zum Vertrag mit übergeben Vertraege = new List<VertragModel> { myVertrag }, // Vertrag zum Schaden mit übergeben Schaden = new List<SchadenModel> { mySchaden }, // Schaden zum Dokument mit übergeben Briefe = new List<BriefModel> { myBrief }, TagSettings = new List<TagSettingModel> { myTagSettings, myTagSettings2 }, LinkObjekte = new List<LinkObjectModel> { myLinkObject }, }; await GetTransferToken(httpClient, baseUriApi, bearerToken, license, myExport, ImportAction.iaNoKDVTUpdate); // 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 && 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.