Dakota Sender erstellt Fehler XML
This commit is contained in:
@@ -6,6 +6,7 @@
|
||||
<appSettings>
|
||||
<add key="GkvAbrechnungResultFolderPath" value="C:\GkvAbrechnung\Results\" />
|
||||
<add key="GkvAbrechnungQueueFolderPath" value="C:\GkvAbrechnung\Queue\" />
|
||||
<add key="GkvAbrechnungFailedFolderPath" value="C:\GkvAbrechnung\Failed\" />
|
||||
<add key="DakotaExePath" value="C:\Program Files (x86)\ITSG\dakotale\dakota30.exe" />
|
||||
<add key="DakotaFolder" value="C:\dakotale\" />
|
||||
<add key="ProcessWaitForExitMs" value="10000" />
|
||||
|
||||
@@ -45,8 +45,10 @@
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="DakotaSystemFile.cs" />
|
||||
<Compile Include="FehlerXml.cs" />
|
||||
<Compile Include="Program.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="XmlFileConverter.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="App.config" />
|
||||
|
||||
@@ -12,12 +12,10 @@ namespace DakotaSender
|
||||
public string Tenant { get; set; }
|
||||
public long ProtokollOid { get; set; }
|
||||
public string Datenannahmestelle { get; set; }
|
||||
public string Transfernummer { get; set; }
|
||||
public string Transfername { get; set; }
|
||||
public string TransfernameAuf => Transfername + ".auf";
|
||||
|
||||
public FileInfo SourceAuftragsdatei { get; set; }
|
||||
public FileInfo SourceNutzdatendatei { get; set; }
|
||||
|
||||
public FileInfo DestinationAuftragsdatei { get; set; }
|
||||
public FileInfo DestinationNutzdatendatei { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
30
DakotaSender/FehlerXml.cs
Normal file
30
DakotaSender/FehlerXml.cs
Normal file
@@ -0,0 +1,30 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Xml.Linq;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace DakotaSender
|
||||
{
|
||||
[Serializable()]
|
||||
[XmlRoot("Fehler")]
|
||||
public class FehlerXml
|
||||
{
|
||||
[XmlAttribute("Oid")]
|
||||
public long Oid { get; set; }
|
||||
|
||||
[XmlElement("Titel")]
|
||||
public string Titel { get; set; }
|
||||
|
||||
[XmlElement("Datum")]
|
||||
public DateTime? Datum { get; set; }
|
||||
|
||||
[XmlElement("Nachricht")]
|
||||
public string Nachricht { get; set; }
|
||||
|
||||
[XmlElement("Level")]
|
||||
public int Level { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -12,6 +12,8 @@ namespace DakotaSender
|
||||
{
|
||||
class Program
|
||||
{
|
||||
const int RC_DAKOTA_ALREADY_LOADED = 18;
|
||||
|
||||
static readonly string TEST_TENANT = "7375324044";
|
||||
|
||||
static int[] AcceptStatusCodes = new int[] { 0 };
|
||||
@@ -46,7 +48,7 @@ namespace DakotaSender
|
||||
|
||||
static void PrintTitle()
|
||||
{
|
||||
PrintLine();
|
||||
PrintWithTime("\n", false);
|
||||
PrintLine("-------------------");
|
||||
PrintLine("Dakota Sender Modul");
|
||||
PrintLine("-------------------");
|
||||
@@ -114,31 +116,9 @@ namespace DakotaSender
|
||||
|
||||
foreach (var file in files)
|
||||
{
|
||||
var protokoll_oid = file.ProtokollOid;
|
||||
TryProcessFile(file);
|
||||
|
||||
PrintLine($"Verarbeite Datei: {file.SourceNutzdatendatei.Name}");
|
||||
PrintLine($"- Tenant: {file.Tenant}");
|
||||
PrintLine($"- Protokoll Oid: {protokoll_oid}");
|
||||
PrintLine($"- Datenannahmestelle: {file.Datenannahmestelle}");
|
||||
|
||||
CopyFile(file);
|
||||
|
||||
Print("Sende via Dakota. ");
|
||||
|
||||
var code = ExecuteDakota("-x");
|
||||
|
||||
if (AcceptSendCodes.Contains(code))
|
||||
{
|
||||
PrintLine($"Ok.");
|
||||
|
||||
DeleteSourceFile(file);
|
||||
}
|
||||
else
|
||||
{
|
||||
PrintLine($"Verarbeitung fehlgeschlagen. Statuscode {code} wird nicht akzeptiert.");
|
||||
|
||||
DeleteDestinationFile(file);
|
||||
}
|
||||
CheckDakotaStatus();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -166,7 +146,7 @@ namespace DakotaSender
|
||||
var tenant = split[0];
|
||||
var p_oid = long.Parse(split[1]);
|
||||
var datenannahmestelle = split[2];
|
||||
var transfernummer = split[3];
|
||||
var transfername = split[3];
|
||||
|
||||
if (tenant != TEST_TENANT && tenant != "demo")
|
||||
{
|
||||
@@ -178,11 +158,6 @@ namespace DakotaSender
|
||||
tenant = TEST_TENANT;
|
||||
}
|
||||
|
||||
var destination = GetDakotaFolderDatenannahmestelle(datenannahmestelle).FullName;
|
||||
var dest_file = Path.Combine(destination, transfernummer);
|
||||
var dest_auft = new FileInfo(dest_file + ".auf");
|
||||
var dest_nutz = new FileInfo(dest_file);
|
||||
|
||||
var file = new DakotaSystemFile()
|
||||
{
|
||||
SourceAuftragsdatei = auft,
|
||||
@@ -190,9 +165,7 @@ namespace DakotaSender
|
||||
Tenant = tenant,
|
||||
ProtokollOid = p_oid,
|
||||
Datenannahmestelle = datenannahmestelle,
|
||||
Transfernummer = transfernummer,
|
||||
DestinationAuftragsdatei = dest_auft,
|
||||
DestinationNutzdatendatei = dest_nutz
|
||||
Transfername = transfername,
|
||||
};
|
||||
|
||||
if (!toCheck.ContainsKey(tenant))
|
||||
@@ -203,39 +176,142 @@ namespace DakotaSender
|
||||
|
||||
return toCheck.Any() ? toCheck : null;
|
||||
}
|
||||
|
||||
static void CopyFile(DakotaSystemFile file)
|
||||
static void TryProcessFile(DakotaSystemFile file)
|
||||
{
|
||||
var sour_auftrags = file.SourceAuftragsdatei.FullName;
|
||||
var dest_auftrags = file.DestinationAuftragsdatei.FullName;
|
||||
var sour_nutz = file.SourceNutzdatendatei.FullName;
|
||||
var dest_nutz = file.DestinationNutzdatendatei.FullName;
|
||||
bool copied = false;
|
||||
try
|
||||
{
|
||||
var protokoll_oid = file.ProtokollOid;
|
||||
|
||||
Print($"Kopiere \"{sour_auftrags}\" nach \"{dest_auftrags}\". ");
|
||||
PrintLine($"Verarbeite Datei: {file.SourceNutzdatendatei.Name}");
|
||||
PrintLine($"- Tenant: {file.Tenant}");
|
||||
PrintLine($"- Protokoll Oid: {protokoll_oid}");
|
||||
PrintLine($"- Datenannahmestelle: {file.Datenannahmestelle}");
|
||||
|
||||
File.Copy(sour_auftrags, dest_auftrags);
|
||||
copied = true;
|
||||
CopyFileToDestination(file);
|
||||
|
||||
PrintLine("Ok.");
|
||||
Print("Sende via Dakota. ");
|
||||
|
||||
Print($"Kopiere \"{sour_nutz}\" nach \"{dest_nutz}\". ");
|
||||
var code = ExecuteDakota("-x");
|
||||
|
||||
File.Copy(sour_nutz, dest_nutz);
|
||||
if (AcceptSendCodes.Contains(code))
|
||||
{
|
||||
PrintLine($"Ok.");
|
||||
|
||||
DeleteQueueFile(file);
|
||||
}
|
||||
else
|
||||
{
|
||||
if(code == RC_DAKOTA_ALREADY_LOADED)
|
||||
{
|
||||
PrintLine($"Verarbeitung fehlgeschlagen. Dakota läuft bereits.");
|
||||
|
||||
PrintLine("Ignoriere Verarbeitung aktuell. Versuche im nächsten Programm Aufruf erneut.");
|
||||
|
||||
DeleteDakotaFile(file);
|
||||
}
|
||||
else
|
||||
{
|
||||
var error = $"Verarbeitung fehlgeschlagen. Statuscode {code} wird nicht akzeptiert.";
|
||||
|
||||
PrintLine(error);
|
||||
|
||||
MoveQueueToFailed(file);
|
||||
|
||||
DeleteDakotaFile(file);
|
||||
|
||||
CreateResultXmlFile(file, error);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
PrintLine($"Verarbeitung fehlgeschlagen. Exception: {e}");
|
||||
|
||||
if (copied)
|
||||
DeleteDakotaFile(file);
|
||||
}
|
||||
}
|
||||
|
||||
static void CreateResultXmlFile(DakotaSystemFile file, string error)
|
||||
{
|
||||
Print("Speichere Fehler als Xml. ");
|
||||
|
||||
var fehler = new FehlerXml();
|
||||
|
||||
fehler.Datum = DateTime.Now;
|
||||
fehler.Titel = "Dakota Fehler";
|
||||
fehler.Nachricht = error;
|
||||
fehler.Level = 1;
|
||||
fehler.Oid = file.ProtokollOid;
|
||||
|
||||
var folder = GetResultFolderTenant(file.Tenant).FullName;
|
||||
var path = Path.Combine(folder, $"P{file.ProtokollOid}.xml");
|
||||
|
||||
Print($"Path: {path}");
|
||||
|
||||
XmlFileConverter.Save(fehler, path);
|
||||
|
||||
PrintLine("Ok.");
|
||||
}
|
||||
static void DeleteSourceFile(DakotaSystemFile file)
|
||||
|
||||
static void MoveQueueToFailed(DakotaSystemFile file)
|
||||
{
|
||||
PrintLine($"Lösche {file.SourceAuftragsdatei.FullName}.");
|
||||
File.Delete(file.SourceAuftragsdatei.FullName);
|
||||
PrintLine($"Lösche {file.SourceNutzdatendatei.FullName}.");
|
||||
File.Delete(file.SourceNutzdatendatei.FullName);
|
||||
CopyFileToFailed(file);
|
||||
|
||||
DeleteQueueFile(file);
|
||||
}
|
||||
static void DeleteDestinationFile(DakotaSystemFile file)
|
||||
|
||||
static void CopyFileToFailed(DakotaSystemFile file)
|
||||
{
|
||||
PrintLine($"Lösche {file.DestinationAuftragsdatei.FullName}.");
|
||||
File.Delete(file.DestinationAuftragsdatei.FullName);
|
||||
PrintLine($"Lösche {file.DestinationNutzdatendatei.FullName}.");
|
||||
File.Delete(file.DestinationNutzdatendatei.FullName);
|
||||
var failed_folder = GetFailedFolder();
|
||||
|
||||
CopyFileTo(file.SourceAuftragsdatei, failed_folder.FullName);
|
||||
CopyFileTo(file.SourceNutzdatendatei, failed_folder.FullName);
|
||||
}
|
||||
static void CopyFileToDestination(DakotaSystemFile file)
|
||||
{
|
||||
var folder = GetDakotaFolderDatenannahmestelle(file.Datenannahmestelle);
|
||||
|
||||
CopyFileTo(file.SourceAuftragsdatei, folder.FullName, file.TransfernameAuf);
|
||||
CopyFileTo(file.SourceNutzdatendatei, folder.FullName, file.Transfername);
|
||||
}
|
||||
static void CopyFileTo(FileSystemInfo file, string destination_folder, string file_name = null)
|
||||
{
|
||||
if (file_name is null)
|
||||
file_name = file.Name;
|
||||
|
||||
CopyFile(file.FullName, Path.Combine(destination_folder, file_name));
|
||||
}
|
||||
static void CopyFile(string source, string destination)
|
||||
{
|
||||
Print($"Kopiere \"{source}\" nach \"{destination}\". ");
|
||||
|
||||
File.Copy(source, destination);
|
||||
|
||||
PrintLine("Ok.");
|
||||
}
|
||||
|
||||
static void DeleteQueueFile(DakotaSystemFile file)
|
||||
{
|
||||
DeleteFile(file.SourceAuftragsdatei.FullName);
|
||||
DeleteFile(file.SourceNutzdatendatei.FullName);
|
||||
}
|
||||
static void DeleteDakotaFile(DakotaSystemFile file)
|
||||
{
|
||||
var folder = GetDakotaFolderDatenannahmestelle(file.Datenannahmestelle).FullName;
|
||||
|
||||
DeleteFile(Path.Combine(folder, file.TransfernameAuf));
|
||||
DeleteFile(Path.Combine(folder, file.Transfername));
|
||||
}
|
||||
static void DeleteFile(string file)
|
||||
{
|
||||
Print($"Lösche {file}. ");
|
||||
|
||||
File.Delete(file);
|
||||
|
||||
PrintLine("Ok.");
|
||||
}
|
||||
|
||||
static int ExecuteDakota(string arg)
|
||||
@@ -274,7 +350,16 @@ namespace DakotaSender
|
||||
|
||||
return folder;
|
||||
}
|
||||
static DirectoryInfo GetResultFolderTenant(string tenant)
|
||||
{
|
||||
var dirinfo = new DirectoryInfo(Path.Combine(GetResultFolder().FullName, tenant));
|
||||
|
||||
if (!dirinfo.Exists)
|
||||
dirinfo.Create();
|
||||
|
||||
return dirinfo;
|
||||
}
|
||||
|
||||
static string GetLogPath()
|
||||
=> ConfigurationManager.AppSettings.Get("LogPath") ?? @"C:\GkvAbrechnung\Sender\log.txt";
|
||||
static int GetProcessWaitForExitMs()
|
||||
@@ -287,5 +372,7 @@ namespace DakotaSender
|
||||
=> new DirectoryInfo(ConfigurationManager.AppSettings.Get("GkvAbrechnungQueueFolderPath") ?? @"C:\GkvAbrechnung\Queue\");
|
||||
static DirectoryInfo GetResultFolder()
|
||||
=> new DirectoryInfo(ConfigurationManager.AppSettings.Get("GkvAbrechnungResultFolderPath") ?? @"C:\GkvAbrechnung\Results\");
|
||||
static DirectoryInfo GetFailedFolder()
|
||||
=> new DirectoryInfo(ConfigurationManager.AppSettings.Get("GkvAbrechnungFailedFolderPath") ?? @"C:\GkvAbrechnung\Failed\");
|
||||
}
|
||||
}
|
||||
|
||||
40
DakotaSender/XmlFileConverter.cs
Normal file
40
DakotaSender/XmlFileConverter.cs
Normal file
@@ -0,0 +1,40 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace DakotaSender
|
||||
{
|
||||
public static class XmlFileConverter
|
||||
{
|
||||
/// <summary>
|
||||
/// Saves to an xml file
|
||||
/// </summary>
|
||||
/// <param name="FileName">File path of the new xml file</param>
|
||||
public static void Save<T>(T obj, string FileName) where T : class
|
||||
{
|
||||
using (var writer = new System.IO.StreamWriter(FileName))
|
||||
{
|
||||
var serializer = new XmlSerializer(obj.GetType());
|
||||
serializer.Serialize(writer, obj);
|
||||
writer.Flush();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Load an object from an xml file
|
||||
/// </summary>
|
||||
/// <param name="FileName">Xml file name</param>
|
||||
/// <returns>The object created from the xml file</returns>
|
||||
public static T Load<T>(string FileName) where T : class
|
||||
{
|
||||
using (var stream = System.IO.File.OpenRead(FileName))
|
||||
{
|
||||
var serializer = new XmlSerializer(typeof(T));
|
||||
return serializer.Deserialize(stream) as T;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user