Briefe/Dokumente zum Termin hochladen

Briefe/Dokumente zum Termin hochladen

Inhaltsverzeichnis:


Ausgangssituation

Sie möchten einen Brief zum Termin hochladen.

Vorgehen

Sie können zum Termin beliebig viele Briefe hochladen.

Der Termin muss hinter einem Datensatz zugeordnet sein. Z.B. Vertrag, Schaden oder Kunde.

Allgemeines zum Hochladen

Es gelten die gleichen Dinge wie auch beim Brief-Hochladen z.B. beim Kunden.

Ein Dokument zu einem bestehenden Kunden 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 zugeordnete Datensatz (Schaden oder Vertrag oder Kunde) 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# für Brief + Termin am Schaden:

// einen Termin+Brief zum Schaden neu hochladen public static async Task<string> ApiNeuerTerminNeuerBriefUpload(string schadenGuid, bool adminAccessMode = true) { HttpClient httpClient = new HttpClient(); Uri baseUriAuth, baseUriApi; string userName, passwort, license, gesellschaft, mandantAmsidnr, mandantVm1; GetServerUrl(out baseUriAuth, out baseUriApi, out userName, out passwort, out license, out gesellschaft, out mandantAmsidnr, out mandantVm1); // 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 Vertrag zum Termin/Aufgabe 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, mySchaden.Id.ToString(), adminAccessMode); //den Vertrag zum Schaden lesen var myKunde = await GetVertragKunde(httpClient, bearerToken, baseUriApi, myVertrag.Id.ToString(), adminAccessMode); //den Kunden zum Vertrag lesen if (myKunde.Amsidnr.IndexOf(KundePreAmsidnr) >= 0 || myVertrag.Amsidnr.IndexOf(VertragPreAmsidnr) >= 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 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 Vater-Datensatz }; var contentStr = 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(contentStr, 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"); } var mySachbearbeiterUser = await GetSachbearbeiterUser(httpClient, bearerToken, baseUriApi, license); if (mySachbearbeiterUser is null) { throw new Exception("Fehler: keinen Sachbearbeiter gefunden"); } var terminId = Guid.NewGuid(); var myTermin = new TerminModel { Id = terminId, Amsidnr = TerminPreAmsidnr + terminId, // Zwangsfeld, meine eindeutige interne Termin-Nummer Alarmactive = false, Alarmstatus = true, Bearbeiter = "MeinFirma", Grund = "Vorgang von API:" + DateTime.Now, Info = "Termin geändert:" + DateTime.Now, Gevo = "Antragsversand", // gültige Gevo.GevoBezeichnung, siehe auch /api/v1/BiproGevo?biproService=vertragsservice GevoId = 100001000, // gültige Gevo.GevoId Vorgangtyp = "VERSICHERUNGSFALL-LEISTUNG", Kategorie = "Vorgang", TerminFuer = mySachbearbeiterUser.Username, //welcher "Bearbeiter" ist für diesen Termin zuständig? siehe AmsUsers.Username, (AMS.5-Username)-> nehme Schaden.Bearbeiter ? Art = "Schaden", Key = mySchaden.Amsidnr, AngelegtZeitpunkt = DateTime.Now, Angelegtvon = "Mustermann", Ort = "XXX", S21_F1 = "xx S21_F1", S21_F12 = "XX S21_F12", InfoHtml = "https xxx", License = mySchaden.License, //nehme License vom Schaden KCloudId = 9378, //KCloudToken = "a7a51630-9465-443a-85fc-e8acd666d23b", //Alarmstatud= null, Partner = myKunde.Name1 ?? myKunde.Name, // Name "Ansprechpartner" in Termin, welcher bei Email-Antwort als Empfänger genommen wird PartnerEmail = myKunde.EmailGeschaeftlich ?? myKunde.EmailPrivat, // Email "Ansprechpartner" in Termin, welcher bei Email-Antwort als Empfänger genommen wird PartnerAdrid = myKunde.Adrid // Adresse "Ansprechpartner" in Termin, welcher bei Email-Antwort als Empfänger genommen wird }; //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-PNG", // 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, // siehe: SELECT TOP (1000) * FROM [drive].[dbo].[Files] a where profileid=8 order by id desc 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" }; List<LinkObjectModel> myLinkObjecte = new List<LinkObjectModel> { }; var linkId1 = Guid.NewGuid(); var linkId2 = Guid.NewGuid(); var linkId3 = Guid.NewGuid(); myLinkObjecte.Add( new LinkObjectModel { Id = linkId1, Amsidnr = LinkPreAmsidnr + linkId1, // Zwangsfeld, meine eindeutige interne Link-Nummer SId = mySchaden.Amsidnr, SArt = LinkObjectArt.Schaden, // ACHTUNG: Hier ENUM-Ziffer übergeben z.B. 4 Key = myTermin.Amsidnr, KeyArt = LinkObjectArt.Termin, // ACHTUNG: Hier ENUM-Ziffer übergeben z.B. 5 Bearbeiter = "MeinFirma", License = mySchaden.License, //nehme License vom Schaden }); myLinkObjecte.Add( new LinkObjectModel { Id = linkId2, Amsidnr = LinkPreAmsidnr + linkId2, // Zwangsfeld, meine eindeutige interne Link-Nummer SId = myTermin.Amsidnr, SArt = LinkObjectArt.Termin, // ACHTUNG: Hier ENUM-Ziffer übergeben z.B. 5 Key = myBrief.Amsidnr, KeyArt = LinkObjectArt.Brief, // ACHTUNG: Hier ENUM-Ziffer übergeben z.B. 0 Bearbeiter = "MeinFirma", License = mySchaden.License, //nehme License vom Schaden }); myLinkObjecte.Add( new LinkObjectModel { Id = linkId3, Amsidnr = LinkPreAmsidnr + linkId3, // 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", License = mySchaden.License, //nehme License vom Schaden }); AmsTransferContext myExport = new AmsTransferContext { Kunden = new List<KundeModel> { myKunde }, Vertraege = new List<VertragModel> { myVertrag }, Schaden = new List<SchadenModel> { mySchaden }, Termine = new List<TerminModel> { myTermin }, Briefe = new List<BriefModel> { myBrief }, LinkObjekte = myLinkObjecte, }; 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 Termin hochladen: apiPath = "/api/v1/Ams/Transfer"; contentStr = 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(contentStr, 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); return myTermin.Id.ToString(); }

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.