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 |
|---|---|
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:
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
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":"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
Mitarbeiterzugriff über AccessMode https://assfinet.atlassian.net/wiki/spaces/KNOW/pages/1451294773/API+anmelden+Entwicklungsphase+und+Produktionsphase#API-Mitarbeiterzugriff-%C3%BCber-AccessMode
BearerToken ermitteln GetBearerToken() https://assfinet.atlassian.net/wiki/spaces/KNOW/pages/1460994132/Verweise#BearerToken-ermitteln
Meine Konstanten ForeignTable/LinkAdresseKeyArt Neue-AmsNr https://assfinet.atlassian.net/wiki/spaces/KNOW/pages/1460994132/Verweise#Meine-Konstanten
Klasse KundeModel https://assfinet.atlassian.net/wiki/spaces/KNOW/pages/1460994132/Verweise#Klasse-KundeModel
Klasse VertragModel https://assfinet.atlassian.net/wiki/spaces/KNOW/pages/1460994132/Verweise#Klasse-VertragModel
Klasse VertragSparteModel https://assfinet.atlassian.net/wiki/spaces/KNOW/pages/1460994132/Verweise#Klasse-VertragSparteModel
Klasse SchadenModel https://assfinet.atlassian.net/wiki/spaces/KNOW/pages/1460994132/Verweise#Klasse-SchadenModel
Klasse AdressModel https://assfinet.atlassian.net/wiki/spaces/KNOW/pages/1460994132/Verweise#Klasse-AdresseModel
Klasse BriefModel https://assfinet.atlassian.net/wiki/spaces/KNOW/pages/1460994132/Verweise#Klasse-BriefModel
Klasse LinkObjectModel https://assfinet.atlassian.net/wiki/spaces/KNOW/pages/1460994132/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.