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
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.