207 lines
9.6 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
}
|