dmdb/Program.cs

207 lines
9.6 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Windows.Forms;
using dezentrale.model;
using dezentrale.view;
namespace dezentrale
{
public class Program
{
public static uint VersionNumber { get; private set; } = 0x19052700;
public static string VersionString { get; private set; } = $"{VersionNumber:x}";
public static string AppData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
public static string DmDirectory = Path.Combine(AppData, "dezentrale-members");
public static string ConfigFile = Path.Combine(DmDirectory, "configuration.xml");
public static Configuration config = new Configuration();
public static MemberList members = new MemberList();
public static BankTransferList bankTransfers = new BankTransferList();
public enum eMode
{
CommandLine = 0,
Gui = 1,
Cronjob = 2,
Export = 3,
}
public static eMode ProgramMode = eMode.Gui;
[STAThread]
static int Main(string[] args)
{
bool printHelp = false;
Console.WriteLine($"dezentrale-members, Version {VersionString}");
Console.WriteLine($"Working directory: {DmDirectory}");
List<string> clArgs = new List<string>();
foreach(string argIt in args)
{
string argn;
string argv;
if (argIt.Contains("="))
{
argn = argIt.Substring(0, argIt.IndexOf('='));
argv = argIt.Substring(argIt.IndexOf('=') + 1);
} else
{
argn = argIt;
argv = "";
}
if (argn.StartsWith("-")) argn = argn.Substring(1);
if (argn.StartsWith("/") || argn.StartsWith("-")) argn = argn.Substring(1);
switch(argn.ToLower())
{
case "help": printHelp = true; break;
case "mode":
switch(argv.ToLower())
{
case "cl": ProgramMode = eMode.CommandLine; Console.WriteLine($"Setting Mode to {ProgramMode}"); break;
case "gui": ProgramMode = eMode.Gui; Console.WriteLine($"Setting Mode to {ProgramMode}"); break;
case "cronjob":
case "auto": ProgramMode = eMode.Cronjob; Console.WriteLine($"Setting Mode to {ProgramMode}"); break;
case "export": ProgramMode = eMode.Export; Console.WriteLine($"Setting Mode to {ProgramMode}"); break;
default:
Console.WriteLine("Invalid mode.");
printHelp = true;
break;
}
break;
default:
Console.WriteLine($"Invalid command({argn})");
printHelp = true;
break;
}
}
if (printHelp)
{
Console.WriteLine("command line arguments:");
Console.WriteLine("--help Display this help message");
Console.WriteLine("--mode=<mode> Starts the program in given mode. Supported modes are:");
Console.WriteLine(" cl (default) Manual/interactive use from command line.");
Console.WriteLine(" gui Start in GUI mode (not implemented yet)");
Console.WriteLine(" auto, cronjob Check and perform pending required membership actions");
Console.WriteLine();
return 1;
}
try { Directory.CreateDirectory(DmDirectory); }
catch (Exception ex) { Console.WriteLine($"Error while creating data directory:\n{ex.Message}"); return 1; }
try
{
config = (Configuration)XmlData.LoadFromFile(ConfigFile, typeof(Configuration));
}
catch (FileNotFoundException)
{
config.MemberDirectory = Path.Combine(DmDirectory, "member-data");
XmlData.SaveToFile(ConfigFile, config); Console.WriteLine("Created new configuration file.");
}
catch (Exception ex)
{
Console.WriteLine("Error while accessing program data:");
Console.WriteLine(ex.Message);
return 1;
}
try { Directory.CreateDirectory(config.MemberDirectory); }
catch (Exception ex) { Console.WriteLine($"Error while creating member data directory:\n{ex.Message}"); return 1; }
try
{
string[] memberFiles = Directory.GetFiles(config.MemberDirectory, "member-*.xml");
//foreach (string s in memberFiles) Console.WriteLine(s);
members = MemberList.LoadFromFiles(memberFiles);
Console.WriteLine($"Loaded {members.Entries.Count} member entries");
}
catch (Exception ex)
{
Console.WriteLine("Error while loading member files:");
Console.WriteLine(ex.Message);
return 1;
}
switch (ProgramMode)
{
case eMode.Gui:
frmMain w = new frmMain();
Application.Run(w);
break;
case eMode.CommandLine:
Console.WriteLine("Not implemented yet");
break;
case eMode.Cronjob:
//Console.WriteLine("Not implemented yet");
Cronjob.Run();
break;
case eMode.Export:
return ImportExport.ZipExport(Path.Combine(DmDirectory, config.ImportExportFile), config.ImportExportPassword) != false ? 0 : 1;
}
return 0;
}
public static void ProcessCSV(string fileName)
{
CsvFile csv = new CsvFile();
try
{
csv.ReadFile(fileName);
bool headline = true;
List<string> headlineFields = new List<string>();
foreach(List<string> l in csv.FileContents)
{
if(headline)
{
//The first line is expected to have the headline field first, describing the contents
headlineFields = l;
headline = false;
continue;
}
BankTransfer bt = new BankTransfer();
int lc = l.Count;
if (lc > headlineFields.Count) lc = headlineFields.Count;
for (int i = 0; i < lc; i++)
{
switch (headlineFields[i])
{
case "Auftragskonto": bt.AccountInCharge = l[i]; break;
case "Buchungstag": bt.BookingDate = DateTime.Parse(l[i]); break; //TBD this will crash because of date format
case "Valutadatum": bt.ValutaDate = DateTime.Parse(l[i]); break; //TBD this will crash because of date format
case "Buchungstext": bt.BookingText = l[i]; break;
case "Verwendungszweck": bt.TransferReason = l[i]; break;
case "Glaeubiger ID": bt.CreditorID = l[i]; break;
case "Mandatsreferenz": bt.MandateReference = l[i]; break;
case "Kundenreferenz (End-to-End)": bt.ClientReference = l[i]; break;
case "Sammlerreferenz": bt.Sammlerreferenz = l[i]; break;
case "Lastschrift Ursprungsbetrag": bt.LastschriftUrsprungsbetrag = l[i]; break;
case "Auslagenersatz Ruecklastschrift": bt.AuslagenersatzRuecklastschrift = l[i]; break;
case "Beguenstigter/Zahlungspflichtiger": bt.RecipientOrDebitor = l[i]; break;
case "Kontonummer/IBAN":
case "Kontonummer": bt.IBAN = l[i]; break;
case "BIC (SWIFT-Code)":
case "BLZ": bt.BIC = l[i]; break;
case "Betrag": bt.Amount = Convert.ToInt32(l[i]) * 100; break;
case "Waehrung": bt.Currency = l[i]; break;
case "Info": bt.Info = l[i]; break;
default:
break;
}
}
}
} catch(Exception ex)
{
Console.WriteLine($"Error while processing csv file \"{fileName}\":");
Console.WriteLine(ex.Message);
}
}
}
}