Briefe/Dokumente zum Kunden hochladen
Inhaltsverzeichnis:
Ausgangssituation
Sie möchten einen Brief zum Kunden hochladen.
Vorgehen
Sie können zum Kunden 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 Kunde 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 Kunde-Brief verloren
Wenn man einen Brief (oder ein neuer Brief/Schaden/Termin/Aufgabe) zu einem bestehenden Kunden per API anlegt, so muss mit dem Kunden-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 Kunde gleichzeitig mit einem neuen zugeordneten Dokument hochgeladen werden. Siehe ApiDokumentNeuerKundeUpload() https://assfinet.atlassian.net/wiki/spaces/KNOW/pages/1457619034
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 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). Kunden selbst sollten KEINE Schlagworte haben, sondern gegebenenfalls dessen SADRESS.
Der 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# :
// mit ClientId und ClientSecret und Username+Passwort anmelden und ein Dokument zum Kunden neu hochladen
public static async Task ApiDokumentKundenUpload ()
{
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 kundeGuid = "2936E523-4D79-4668-9D80-xxxx"; // meinen Vater - Datensatz über die Guid lesen. Hier Kunde.Id eintragen
bool adminAccessMode = true; //darf der Benutzer AdminZugriff? Sonst false
//der Kunde zum Dokument muss gelesen werden, damit beides gemeinsam im Transfer enthalten ist:
var myKunde = await GetKunde(httpClient, bearerToken, baseUriApi, kundeGuid, adminAccessMode); //den Kunden lesen
if (myKunde.Amsidnr.IndexOf(KundePreAmsidnr) >= 0 || myKunde.Amsidnr.IndexOf(VertragPreAmsidnr) >= 0 || myKunde.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 = 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);
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("KundeTransfer_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 = myKunde.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 = myKunde.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 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 = "AMS52000001xxxxxx", // 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 (!("|" + (myKunde.Schlagwoerter ?? "").Trim() + "|").Contains("AMS52000001xxxxxx"))
// myKunde.Schlagwoerter += (myKunde.Schlagwoerter?.Length > 2 ? "|" : "") + "AMS52000001xxxxxx"; //extra redundant: in kunde.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 = myKunde.Amsidnr,
SArt = LinkObjectArt.Kunde, // ACHTUNG: Hier ENUM-Ziffer übergeben z.B. 2
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 = myKunde.License, //nehme License wie im Vater-Datensatz
};
AmsTransferContext myExport = new AmsTransferContext
{ Kunden = new List<KundeModel> { myKunde },
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:
{"Kunden":[{"Id":"6ac6b506-d037-4d04-94c7-xxxx","Bearbeitet":"2021-02-10T17:25:03+01:00","License":"DEMO_xxx","LastSynchronisation":"0001-01-01T00:00:00","Adrid":"032370018335327","Amsidnr":"032370018335312","Anrede":"Sehr geehrte Frau Muster","Bearbeiter":"cloudtransfer","BelegteSparten":"EVDUMS|HPV|HRV|KFZ|KRV|","EmailPrivat":"Eddy2021@posteo.de","Geburtstag":"1962-05-21T00:00:00","Geschlecht":"Weiblich","GueltigAb":"2017-03-24T00:00:00","IsHistorie":false,"IsZukunft":false,"Klasse":"PK","Kundenname":"Muster, Musterine","KundennamePhonetisch":"MUSTA MUSTERINE","KundeSeit":"2019-03-15T00:00:00","Land":"DE","Mandant":"Edeka Versicherungsdienst","MandantAmsidnr":"032370008746648","Mobiltelefon":"0172-9094736","Name":"Muster","Name1":"Musterine Muster","Ort":"Jork","OrtPhonetisch":"IÖRK","Plz":"21635","Staatsangehoerigkeit":"D","Status":"KUNDE","Strasse":"Musterstraße 6f","StrassePhonetisch":"MUSTASTRASE 6F","TelefonPrivat":"040-63773243","Vnnummer":"100000115639","Vorname":"Musterine","Zuordnung":"PRIVAT","Sachbearbeiter":"deinEVD","Draft":false,"LastSynchronisation":"2021-02-10T16:34:51.091201Z"}],"Briefe":[{"Id":"d78f8a35-b59b-4eb9-ac11-xxx","Erstellt":"2021-03-21T15:12:55.3457619+01:00","Links":[{"Ordner":"ROOT/Sonstiges"}],"FileGuid":"956f4900-7620-415a-8642-9b54f316e80a","License":"DEMO_xxx","LastSynchronisation":"0001-01-01T00:00:00","Amsidnr":"D-7334c103-d459-40a4-ab2b-19982c950756","ArchiviertAm":"2021-03-21T15:12:55.3457619+01:00","Auslagerungsschutz":false,"Bearbeiter":"MeinFirma","Brieftyp":"DMS-JPG","Compression":0,"Key":"032370018335312","Titel":"mein Brief Titel:21.03.2021 15:12:55"}],"LinkObjekte":[{"Id":"202c2542-3d69-4bbf-8f7e-xxx","KeyArt":0,"SArt":2,"License":"DEMO_xxx","LastSynchronisation":"0001-01-01T00:00:00","Amsidnr":"L-5cf761c9-82b0-4de6-bd17-02847b9354e9","Bearbeiter":"MeinFirma","Key":"D-7334c103-d459-40a4-ab2b-19982c950756","Ordner":"ROOT/Sonstiges","SId":"032370018335312"}],"ImportFlags":{"ImportAction":"iaNoKDVTUpdate","EnableOptVnrOnly":false,"Identity":"AMSPK"},"Options":{"Synchron":true,"TransferMode":"SaveAndTransport","License":"DEMO_xxx"}}Neuer Kunde und neues Dokument gleichzeitig
Es kann auch ein neuer Kunde gleichzeitig mit einem neuen zugeordneten Dokument hochgeladen werden
Kunde und Brief und LinkObject müssen dann im gleichen Transfer hochgeladen werden
Als ImportAction: ImportAction.iaNewKD
// zu einem neuen Kunden ein Dokument hochladen
public static async Task ApiDokumentNeuerKundeUpload( )
{
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 kundenId = Guid.NewGuid();
var myKunde = new KundeModel
{
Id = kundenId,
Amsidnr = KundePreAmsidnr + kundenId, // Zwangsfeld, meine eindeutige interne Kundenummer
Vm1 = MeineFirmaVm1, // Freigabe für welchen Vermittler? Feld "Code" in api/v1/Ams/Vermittler
Aenderung = DateTime.Now,
IsHistorie = false, // Zwangsfeld, false
Bearbeiter = "Mustermann 2",
Kundenname = "xxx1 Test upload " + DateTime.Now, // Zwangsfeld
KundennamePhonetisch = "Test",
Kundenverbindung = "Test",
Name = "Test upload " + DateTime.Now, // Zwangsfeld
Zuordnung = "FIRMA", // Zwangsfeld, 'PRIVAT' , 'FIRMA'
Mandant = MeineFirmaMandant,
MandantAmsidnr = MeineFirmaMandantAmsidnr,
Status = "KUNDE", // Zwangsfeld, 'KUNDE' , 'INTERESSENT'
License = license, //nehme meine Lizenz/Mandant
};
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 = 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("KundeTransfer_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 = myKunde.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 = 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"
};
//myBrief.Id =new Guid( "22b75016-720d-4438-9a05-602c347694f8");
//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 = "AMS5200000xxx", // 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.
//};
//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 = myKunde.Amsidnr,
SArt = LinkObjectArt.Kunde, // ACHTUNG: Hier ENUM-Ziffer übergeben z.B. 2
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 },
Briefe = new List<BriefModel> { myBrief },
LinkObjekte = new List<LinkObjectModel> { myLinkObject },
//TagSettings = new List<TagSettingModel> { myTagSettings, myTagSettings2 },
};
await GetTransferToken(httpClient, baseUriApi, bearerToken, license, myExport, ImportAction.iaNewKD); // Ihre Lizenz/Mandant eintragen und ImportFlags und TransferOptions in Parameter myExport als Rückgabewert zurückerhalten
//neuen Kunden mit neuem 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,
SearchObject https://assfinet.atlassian.net/wiki/spaces/KNOW/pages/1460994132/Verweise#SearchObject
Klasse AmsTransferContext https://assfinet.atlassian.net/wiki/spaces/KNOW/pages/1460994132/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.