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 |
|---|---|
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:
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
b) in Fiddler
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
Mitarbeiterzugriff über AccessMode API anmelden: Entwicklungsphase und Produktionsphase | API Mitarbeiterzugriff über AccessMode
BearerToken ermitteln GetBearerToken() Verweise | BearerToken ermitteln
Meine Konstanten ForeignTable/LinkAdresseKeyArt Neue-AmsNr Verweise | Meine Konstanten
Klasse KundeModel Verweise | Klasse KundeModel
Klasse VertragModel Verweise | Klasse VertragModel
Klasse VertragSparteModel Verweise | Klasse VertragSparteModel
Klasse SchadenModel Verweise | Klasse SchadenModel
Klasse AdressModel Verweise | Klasse AdresseModel
Klasse BriefModel Verweise | Klasse BriefModel
Klasse LinkObjectModel Verweise | Klasse LinkObjectModel
GetKunde, GetVertrag, GetVertragKunde, GetVertragSparten, GetSchaden, GetSchadenVertrag,
GetBrief Verweise | GetKunde, GetVertrag, GetVertragKunde, GetVertragSparten, GetSchaden, GetSchade...
SearchObject Verweise | SearchObject
Klasse AmsTransferContext Verweise | Klasse AmsTransferContext
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.