190609PX Added program version to data files, brought CSV import to life
This commit is contained in:
parent
c9972308aa
commit
84ae43c4e2
64
Program.cs
64
Program.cs
|
@ -11,7 +11,7 @@ namespace dezentrale
|
|||
{
|
||||
public class Program
|
||||
{
|
||||
public static uint VersionNumber { get; private set; } = 0x19060600;
|
||||
public static uint VersionNumber { get; private set; } = 0x19060900;
|
||||
public static string VersionString { get; private set; } = $"{VersionNumber:x}";
|
||||
|
||||
public static string AppData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
|
||||
|
@ -146,39 +146,6 @@ namespace dezentrale
|
|||
Console.WriteLine(ex.Message);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*string mtlFile = Path.Combine(config.DbDirectory, "moneytransfers.xml");
|
||||
List<string> attach = new List<string>() { mtlFile };
|
||||
Member m = new Member() { Nickname = "phantomix", EMail = "phantomix@macht-albern.de", Number = 2 };
|
||||
Console.WriteLine(m.Nickname);
|
||||
FormMail.GenerateMemberAccountActivated().Send(m, attach);*/
|
||||
/*moneyTransfers.Entries.Add(new MoneyTransfer()
|
||||
{
|
||||
MemberNumber = 123,
|
||||
ValutaDate = DateTime.Now,
|
||||
Amount = 2303,
|
||||
});
|
||||
moneyTransfers.Entries.Add(new BankTransfer()
|
||||
{
|
||||
MemberNumber = 123,
|
||||
ValutaDate = DateTime.Now,
|
||||
Amount = 2304,
|
||||
});
|
||||
|
||||
moneyTransfers.Entries.Add(new CashTransfer()
|
||||
{
|
||||
MemberNumber = 123,
|
||||
ValutaDate = DateTime.Now,
|
||||
Amount = 2305,
|
||||
RecipeNumber = "2019-06-02-123",
|
||||
});
|
||||
XmlData.SaveToFile(mtlFile, moneyTransfers); //, new Type[] { typeof(MoneyTransfer), typeof(CashTransfer), typeof(BankTransfer)}
|
||||
moneyTransfers = new MoneyTransferList();
|
||||
moneyTransfers = (MoneyTransferList)XmlData.LoadFromFile(mtlFile, typeof(MoneyTransferList));
|
||||
foreach(MoneyTransfer mt in moneyTransfers.Entries)
|
||||
{
|
||||
Console.WriteLine($"{mt.ToString()} - {mt.GetType()}");
|
||||
}*/
|
||||
|
||||
switch (ProgramMode)
|
||||
{
|
||||
|
@ -219,12 +186,14 @@ namespace dezentrale
|
|||
{
|
||||
|
||||
CsvFile csv = new CsvFile();
|
||||
csv.FieldSeparator = ';';
|
||||
try
|
||||
{
|
||||
List<BankTransfer> tmpList = new List<BankTransfer>();
|
||||
|
||||
csv.ReadFile(fileName);
|
||||
List<string> headlineFields = null;
|
||||
List<Member> changedMembers = new List<Member>();
|
||||
foreach (List<string> l in csv.FileContents)
|
||||
{
|
||||
if (headlineFields == null)
|
||||
|
@ -238,27 +207,36 @@ namespace dezentrale
|
|||
//TBD: search for duplicates
|
||||
MoneyTransfers.Entries.Add(bt);
|
||||
tmpList.Add(bt);
|
||||
}
|
||||
}
|
||||
|
||||
//try to assign transfers to the members
|
||||
foreach (Member m in members.Entries)
|
||||
foreach (BankTransfer bt in tmpList)
|
||||
{
|
||||
foreach (BankTransfer bt in tmpList)
|
||||
if (bt.Amount < 0)
|
||||
{
|
||||
bt.TransferType = MoneyTransfer.eTransferType.RunningCost;
|
||||
Console.WriteLine($"{bt.Id}: Amount = {bt.AmountString} --> RunningCost");
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach (Member m in members.Entries)
|
||||
{
|
||||
if (m.CheckBankTransfer(bt))
|
||||
{
|
||||
{
|
||||
bt.TransferType = MoneyTransfer.eTransferType.MembershipPayment;
|
||||
changedMembers.Add(m);
|
||||
m.StartLogEvent("Incoming bank transfer", LogEvent.eEventType.MembershipPayment, "automatic");
|
||||
m.ApplyMoneyTransfer(bt);
|
||||
m.ApplyMoneyTransfer(bt);
|
||||
break; //this is important. We don't want to assign this to multiple members.
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Store bank transfer list
|
||||
Console.WriteLine("ProcessCSV(): Storing money transfers...");
|
||||
if (!MoneyTransfers.SaveToFile())
|
||||
return false;
|
||||
bool ret = true;
|
||||
foreach (Member m in members.Entries)
|
||||
foreach (Member m in changedMembers)
|
||||
{
|
||||
if (m.CurrentLog != null)
|
||||
{
|
||||
|
@ -273,7 +251,9 @@ namespace dezentrale
|
|||
ret = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//TBD: mail to schatzmeister if there are unassigned transfers
|
||||
|
||||
return ret;
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
|
|
@ -6,7 +6,7 @@ using System.Xml.Serialization;
|
|||
|
||||
namespace dezentrale.model
|
||||
{
|
||||
public class ConfigSmtp : XmlData
|
||||
public class ConfigSmtp
|
||||
{
|
||||
[XmlElement] public bool Enabled { get; set; } = false;
|
||||
[XmlElement] public string Host { get; set; } = "localhost";
|
||||
|
|
|
@ -6,7 +6,7 @@ using System.Xml.Serialization;
|
|||
|
||||
namespace dezentrale.model
|
||||
{
|
||||
public class ConfigVSMail : XmlData
|
||||
public class ConfigVSMail
|
||||
{
|
||||
[XmlElement] public string VSName { get; set; } = "dezentrale Vorstand";
|
||||
[XmlElement] public string VSEmail { get; set; } = "vorstand@dezentrale.space";
|
||||
|
|
|
@ -307,13 +307,13 @@ namespace dezentrale.model
|
|||
return new FormMail()
|
||||
{
|
||||
To = "{Nickname} <{EMail}>",
|
||||
Subject = "Zahlung erhalten",
|
||||
Body = "Hallo {Nickname},!\n"
|
||||
Subject = "dezentrale - Mitgliedsbeitrag erhalten",
|
||||
Body = "Hallo {Nickname}!\n"
|
||||
+ "\n"
|
||||
+ "Dein Mitgliedsbeitrag ist angekommen. Vielen Dank.\n"
|
||||
+ "\n"
|
||||
+ "\nEingangsdatum: {ValutaDate}\n"
|
||||
+ "Betrag {AmountString} {Currency}\n"
|
||||
+ "Betrag: {AmountString} {Currency}\n"
|
||||
+ (odd ? "Hinweis: Der Betrag passt nicht zum eingestellten Mitgliedsbeitrag ({PaymentAmountString} " + Program.config.RegularPaymentCurrency + ")\n" : "\n")
|
||||
+ "\n"
|
||||
+ "Der nächste Mitgliedsbeitrag ist damit fällig am Anfang des Monats {PaymentDueMonth} (AccountBalance = {AccountBalanceString})\n"
|
||||
|
|
106
model/Member.cs
106
model/Member.cs
|
@ -50,7 +50,8 @@ namespace dezentrale.model
|
|||
private uint mvMiss = 0;
|
||||
private Int64 accountBalance = 0;
|
||||
private bool evaluateAccountInCharge = false;
|
||||
private string accountInCharge = "";
|
||||
private string bankAccountInCharge = ""; //CSV Import: this bank account is associated with the member
|
||||
private string bankTransferRegEx = "";
|
||||
private string nickname = "";
|
||||
private string firstName = "";
|
||||
private string lastName = "";
|
||||
|
@ -81,7 +82,8 @@ namespace dezentrale.model
|
|||
[XmlElement] public uint MvMissCounter { get { return mvMiss; } set { LogPropertyChange("MvMissCounter", mvMiss, value); mvMiss = value; } }
|
||||
[XmlElement] public Int64 AccountBalance { get { return accountBalance;} set{LogPropertyChange("AccountBalance",accountBalance,value);accountBalance=value;}}
|
||||
[XmlElement] public bool EvaluateAccountInCharge { get { return evaluateAccountInCharge; } set { LogPropertyChange("EvaluateAccountInCharge", evaluateAccountInCharge, value); evaluateAccountInCharge = value; } }
|
||||
[XmlElement] public string AccountInCharge { get { return accountInCharge;}set{LogPropertyChange("AccountInCharge",accountInCharge,value); accountInCharge = value;}}
|
||||
[XmlElement] public string BankAccountInCharge { get { return bankAccountInCharge; }set{LogPropertyChange("BankAccountInCharge", bankAccountInCharge, value); bankAccountInCharge = value;} }
|
||||
[XmlElement] public string BankTransferRegEx { get { return bankTransferRegEx; } set { LogPropertyChange("BankTransferRegEx", bankTransferRegEx, value); bankTransferRegEx = value; } }
|
||||
|
||||
//personal data
|
||||
[XmlAttribute] public string Nickname { get { return nickname; } set { LogPropertyChange("NickName", nickname, value); nickname = value; } }
|
||||
|
@ -111,7 +113,6 @@ namespace dezentrale.model
|
|||
[XmlElement] public uint PaymentsTotal { get; set; }
|
||||
[XmlElement] public DateTime LastBalanceDegrade { get; set; } = DateTime.Now;
|
||||
[XmlElement("MoneyTransferId")] public List<string> MoneyTransfersIds { get; set; } = new List<string>();
|
||||
[XmlElement] public string BankTransferRegEx { get; set; } = "";
|
||||
|
||||
[XmlElement("LogEvent")] public List<LogEvent> Log { get; set; } = new List<LogEvent>();
|
||||
|
||||
|
@ -177,9 +178,6 @@ namespace dezentrale.model
|
|||
}
|
||||
public void FinishLogEvent()
|
||||
{
|
||||
if (CurrentLog == null) return;
|
||||
|
||||
this.LastChanged = CurrentLog.Timestamp;
|
||||
CurrentLog = null;
|
||||
}
|
||||
public bool SaveToFile(bool finishLog = true)
|
||||
|
@ -193,16 +191,22 @@ namespace dezentrale.model
|
|||
|
||||
public bool CheckBankTransfer(BankTransfer t)
|
||||
{
|
||||
if (evaluateAccountInCharge && !accountInCharge.Equals(t.AccountInCharge))
|
||||
if (!evaluateAccountInCharge) return false;
|
||||
if (!bankAccountInCharge.Equals(t.IBAN))
|
||||
//on banktransfers, AccountInCharge is the receiver IBAN, we need the sender IBAN here
|
||||
return false;
|
||||
|
||||
if(!string.IsNullOrEmpty(BankTransferRegEx))
|
||||
{
|
||||
if (Regex.IsMatch(t.TransferReason, BankTransferRegEx))
|
||||
return true;
|
||||
}
|
||||
if (string.IsNullOrEmpty(BankTransferRegEx))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
try
|
||||
{
|
||||
return Regex.IsMatch(t.TransferReason, BankTransferRegEx);
|
||||
} catch(Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Member {this.Number:D3} invalid RegEx: {ex.Message}");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private void PaymentAdjustBalance(Int64 amount, string user = null)
|
||||
|
@ -220,7 +224,7 @@ namespace dezentrale.model
|
|||
public void ApplyMoneyTransfer(MoneyTransfer t, string user = null)
|
||||
{
|
||||
Console.WriteLine($"Member.ApplyMoneyTransfer(): {t.Amount} to member {Number}");
|
||||
if (CurrentLog == null) StartLogEvent($"MoneyTransfer ({((float) t.Amount / 100)} {t.Currency})", LogEvent.eEventType.MembershipPayment, user);
|
||||
if (CurrentLog == null) StartLogEvent($"MoneyTransfer ({t.AmountString} {t.Currency})", LogEvent.eEventType.MembershipPayment, user);
|
||||
|
||||
LogEvent.eEventType evt = LogEvent.eEventType.Generic;
|
||||
switch(t.TransferType)
|
||||
|
@ -237,46 +241,50 @@ namespace dezentrale.model
|
|||
{
|
||||
Topic = $"{t.GetType().Name} {t.Id}",
|
||||
Type = evt,
|
||||
Details = $"Amount = {((float) t.Amount / 100)} {t.Currency}",
|
||||
Details = $"Amount = {t.AmountString} {t.Currency}",
|
||||
});
|
||||
MoneyTransfersIds.Add(t.Id);
|
||||
if (t.TransferType == MoneyTransfer.eTransferType.MembershipPayment) PaymentAdjustBalance(t.Amount);
|
||||
t.MemberNumber = Number;
|
||||
|
||||
//find out if we need to send a mail to Schatzmeister (i.e. amount is odd in respect to the monthly fee)
|
||||
Int64 months = t.Amount / (Int64) PaymentAmount;
|
||||
bool odd = months * (Int64)PaymentAmount != t.Amount;
|
||||
if (odd)
|
||||
{
|
||||
Member sm = Program.members.Find(eRole.Schatzmeister);
|
||||
if(sm == null)
|
||||
Console.WriteLine("Member.ApplyMoneyTransfer(): Error - Schatzmeister account not found!");
|
||||
else
|
||||
t.MemberNumber = Number;
|
||||
if (t.TransferType == MoneyTransfer.eTransferType.MembershipPayment)
|
||||
{
|
||||
PaymentAdjustBalance(t.Amount);
|
||||
|
||||
|
||||
//find out if we need to send a mail to Schatzmeister (i.e. amount is odd in respect to the monthly fee)
|
||||
Int64 months = t.Amount / (Int64)PaymentAmount;
|
||||
bool odd = months * (Int64)PaymentAmount != t.Amount;
|
||||
if (odd)
|
||||
{
|
||||
Console.WriteLine($"Member.ApplyMoneyTransfer(): sm={sm.Nickname}");
|
||||
FormMail fm = new FormMail()
|
||||
Member sm = Program.members.Find(eRole.Schatzmeister);
|
||||
if (sm == null)
|
||||
Console.WriteLine("Member.ApplyMoneyTransfer(): Error - Schatzmeister account not found!");
|
||||
else
|
||||
{
|
||||
To = $"{sm.Nickname} <{sm.EMail}>",
|
||||
Subject = $"Schiefe Zahlung von Mitglied {Number} ({Nickname}, {((float)t.Amount / 100)} {t.Currency})",
|
||||
Body = "s. Betreff.\n"
|
||||
+ $"Type = {t.GetType()}"
|
||||
+ $"TransferAmount = {((float)t.Amount / 100)}"
|
||||
+ $"PaymentAmount = {PaymentAmountString } (monthly fee)"
|
||||
+ $"accountBalance = {AccountBalanceString} (new)\n"
|
||||
+ $"Next payment for this member is due at {PaymentDueMonth}"
|
||||
+ "\n\n(automatische mail)"
|
||||
};
|
||||
LogSubEvent lse = fm.Send();
|
||||
CurrentLog.SubEvents.Add(lse);
|
||||
//if(lse.Type == LogEvent.eEventType.Error) { }
|
||||
Console.WriteLine($"Member.ApplyMoneyTransfer(): sm={sm.Nickname}");
|
||||
FormMail fm = new FormMail()
|
||||
{
|
||||
To = $"{sm.Nickname} <{sm.EMail}>",
|
||||
Subject = $"Schiefe Zahlung von Mitglied {Number} ({Nickname}, {t.AmountString} {t.Currency})",
|
||||
Body = "s. Betreff.\n"
|
||||
+ $"Type = {t.GetType()}\n"
|
||||
+ $"TransferAmount = {t.AmountString}\n"
|
||||
+ $"PaymentAmount = {PaymentAmountString } (monthly fee)\n"
|
||||
+ $"accountBalance = {AccountBalanceString} (new)\n"
|
||||
+ $"Next payment for this member is due at {PaymentDueMonth}\n"
|
||||
+ "\n\n--\n(automatische mail)"
|
||||
};
|
||||
LogSubEvent lse = fm.Send();
|
||||
CurrentLog.SubEvents.Add(lse);
|
||||
//if(lse.Type == LogEvent.eEventType.Error) { }
|
||||
}
|
||||
}
|
||||
}
|
||||
if (paymentNotify) //TBD: Send Payment Notify
|
||||
{
|
||||
FormMail notify = FormMail.GenerateMemberPaymentNotify(odd).ReplaceReflect(t);
|
||||
|
||||
LogSubEvent lse = notify.Send(this);
|
||||
CurrentLog.SubEvents.Add(lse);
|
||||
if (paymentNotify)
|
||||
{
|
||||
FormMail notify = FormMail.GenerateMemberPaymentNotify(odd).ReplaceReflect(t);
|
||||
|
||||
LogSubEvent lse = notify.Send(this);
|
||||
CurrentLog.SubEvents.Add(lse);
|
||||
}
|
||||
}
|
||||
|
||||
try { SaveToFile(false); }
|
||||
|
|
|
@ -98,7 +98,7 @@ namespace dezentrale.model
|
|||
m.City = "Musterstadt";
|
||||
m.CountryCode = Country.eCountry.Germany;
|
||||
m.Birthday = new DateTime(1980, 1, 1);
|
||||
m.EMail = "John Doe <john.doe@example.com>";
|
||||
m.EMail = "john.doe@example.com";
|
||||
m.PgpFingerprint = "";
|
||||
m.MvInvitationByPost = false;
|
||||
m.SpawnDate = new DateTime(2019, 6, 1);
|
||||
|
@ -123,7 +123,7 @@ namespace dezentrale.model
|
|||
m.City = "Moskau";
|
||||
m.CountryCode = Country.eCountry.RussianFederation;
|
||||
m.Birthday = new DateTime(1960, 12, 24);
|
||||
m.EMail = "putin <h4x0r@kgb.ru@example.com>";
|
||||
m.EMail = "h4x0r@kgb.ru@example.com";
|
||||
m.PgpFingerprint = "encrypted ;-)";
|
||||
m.MvInvitationByPost = false;
|
||||
m.SpawnDate = new DateTime(2019, 6, 1);
|
||||
|
@ -173,7 +173,7 @@ namespace dezentrale.model
|
|||
m.City = "Pittsburgh";
|
||||
m.CountryCode = Country.eCountry.UnitedStatesOfAmerica;
|
||||
m.Birthday = new DateTime(1900, 1, 1);// = new DateTime(1876, 12, 31);
|
||||
m.EMail = "heinz <quetschab@example.com>";
|
||||
m.EMail = "quetschab@example.com";
|
||||
m.PgpFingerprint = "";
|
||||
m.MvInvitationByPost = false;
|
||||
m.SpawnDate = new DateTime(2019, 5, 1);
|
||||
|
@ -197,7 +197,7 @@ namespace dezentrale.model
|
|||
m.City = "Musterstadt";
|
||||
m.CountryCode = Country.eCountry.Germany;
|
||||
m.Birthday = new DateTime(1980, 1, 1);
|
||||
m.EMail = "joshua <joshua@wopr.gov@example.com>";
|
||||
m.EMail = "joshua@wopr.gov@example.com";
|
||||
m.PgpFingerprint = "";
|
||||
m.MvInvitationByPost = false;
|
||||
m.SpawnDate = new DateTime(2019, 5, 1);
|
||||
|
|
|
@ -10,6 +10,7 @@ namespace dezentrale.model
|
|||
public class XmlData
|
||||
{
|
||||
[XmlAttribute] public DateTime LastChanged { get; set; } = DateTime.Now;
|
||||
[XmlAttribute] public string ProgramVersion { get; set; } = "";
|
||||
|
||||
public static XmlData LoadFromFile(string fileName, Type type = null)
|
||||
{
|
||||
|
@ -21,6 +22,15 @@ namespace dezentrale.model
|
|||
fs = new FileStream(fileName, FileMode.Open);
|
||||
XmlData ds = (XmlData)ser.Deserialize(fs);
|
||||
fs.Close();
|
||||
if (ds.ProgramVersion != Program.VersionString)
|
||||
{
|
||||
Console.WriteLine($"Object of type {ds.GetType()} was stored in Version {ds.ProgramVersion:X8}, Re-Storing with {Program.VersionNumber:X8}");
|
||||
//backup file
|
||||
string backupName = $"{fileName}.v{ds.ProgramVersion:X8}.bak";
|
||||
if (File.Exists(backupName)) File.Delete(backupName);
|
||||
File.Move(fileName, backupName);
|
||||
if (!SaveToFile(fileName, ds)) throw new Exception("Saving returned false");
|
||||
}
|
||||
return ds;
|
||||
}
|
||||
catch (Exception e)
|
||||
|
@ -41,8 +51,11 @@ namespace dezentrale.model
|
|||
string backupName = $"{fileName}.bak";
|
||||
if (File.Exists(backupName)) File.Delete(backupName);
|
||||
File.Move(fileName, backupName);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
ds.ProgramVersion = Program.VersionString;
|
||||
ds.LastChanged = DateTime.Now;
|
||||
|
||||
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
|
||||
ns.Add("", "");
|
||||
XmlSerializer ser;
|
||||
|
|
|
@ -50,7 +50,12 @@ namespace dezentrale.model.money
|
|||
case "Kontonummer": IBAN = csvEntry[i]; break;
|
||||
case "BIC (SWIFT-Code)":
|
||||
case "BLZ": BIC = csvEntry[i]; break;
|
||||
case "Betrag": Amount = Convert.ToInt32(csvEntry[i]) * 100; break;
|
||||
case "Betrag":
|
||||
{
|
||||
string sAmount = csvEntry[i].Replace(',', '.');
|
||||
float fAmount = float.Parse(sAmount, System.Globalization.CultureInfo.InvariantCulture.NumberFormat);
|
||||
Amount = Convert.ToInt64(fAmount * 100);
|
||||
} break;
|
||||
case "Waehrung": Currency = csvEntry[i]; break;
|
||||
case "Info": Info = csvEntry[i]; break;
|
||||
default:
|
||||
|
|
|
@ -24,7 +24,6 @@ namespace dezentrale.model.money
|
|||
public static bool SaveToFile(MoneyTransferList list)
|
||||
{
|
||||
string mtlFile = Path.Combine(Program.config.DbDirectory, FileName);
|
||||
list.LastChanged = DateTime.Now;
|
||||
return XmlData.SaveToFile(mtlFile, list);
|
||||
}
|
||||
public bool SaveToFile()
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
using dezentrale.model;
|
||||
|
||||
|
@ -19,7 +17,7 @@ namespace dezentrale.view
|
|||
this.FullRowSelect = true;
|
||||
|
||||
this.Columns.Add(new ColumnHeader() { Text = "[x]", Width = 24 }); //Checkbox
|
||||
this.Columns.Add(new ColumnHeader() { Text = "number", Width = 50 });
|
||||
this.Columns.Add(new ColumnHeader() { Text = "Member", Width = 57 });
|
||||
this.Columns.Add(new ColumnHeader() { Text = "name / nickname", Width = 160 });
|
||||
this.Columns.Add(new ColumnHeader() { Text = "type", Width = 40 });
|
||||
this.Columns.Add(new ColumnHeader() { Text = "status", Width = 100 });
|
||||
|
|
|
@ -22,11 +22,11 @@ namespace dezentrale.view
|
|||
this.FullRowSelect = true;
|
||||
|
||||
this.Columns.Add(new ColumnHeader() { Text = "", Width = 0 }); //Checkbox: hide
|
||||
this.Columns.Add(new ColumnHeader() { Text = "Id", Width = 160 });
|
||||
this.Columns.Add(new ColumnHeader() { Text = "Member", Width = 50 });
|
||||
this.Columns.Add(new ColumnHeader() { Text = "Type", Width = 100 });
|
||||
this.Columns.Add(new ColumnHeader() { Text = "Date", Width = 100 });
|
||||
this.Columns.Add(new ColumnHeader() { Text = "Amount", Width = 40 });
|
||||
this.Columns.Add(new ColumnHeader() { Text = "Id", Width = 90 });
|
||||
this.Columns.Add(new ColumnHeader() { Text = "Member", Width = 57 });
|
||||
this.Columns.Add(new ColumnHeader() { Text = "Type", Width = 130 });
|
||||
this.Columns.Add(new ColumnHeader() { Text = "Date", Width = 130 });
|
||||
this.Columns.Add(new ColumnHeader() { Text = "Amount", Width = 70, TextAlign = HorizontalAlignment.Right, });
|
||||
this.ContextMenu = cm;
|
||||
|
||||
LoadFromList();
|
||||
|
@ -39,7 +39,7 @@ namespace dezentrale.view
|
|||
lvi.Tag = t;
|
||||
lvi.SubItems.Clear();
|
||||
lvi.SubItems.Add(new ListViewItem.ListViewSubItem() { Text = $"{t.Id}" });
|
||||
lvi.SubItems.Add(new ListViewItem.ListViewSubItem() { Text = (t.MemberNumber > 0 ? $"{t.MemberNumber}" : "-") });
|
||||
lvi.SubItems.Add(new ListViewItem.ListViewSubItem() { Text = (t.MemberNumber > 0 ? $"{t.MemberNumber:D3}" : "-") });
|
||||
lvi.SubItems.Add(new ListViewItem.ListViewSubItem() { Text = $"{t.TransferType}" });
|
||||
lvi.SubItems.Add(new ListViewItem.ListViewSubItem() { Text = $"{t.ValutaDate}" });
|
||||
lvi.SubItems.Add(new ListViewItem.ListViewSubItem() { Text = $"{((float) t.Amount / 100)} {t.Currency}" });
|
||||
|
@ -76,6 +76,6 @@ namespace dezentrale.view
|
|||
}
|
||||
|
||||
this.ResumeLayout(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,6 +32,10 @@ namespace dezentrale.view
|
|||
private ComboBoxKV cbRole;
|
||||
private TextBox tbMvMiss;
|
||||
private TextBox tbAccountBalance;
|
||||
private CheckBox cbEvaluateAccountInCharge;
|
||||
private TextBox tbBankAccountInCharge;
|
||||
private CheckBox cbPaymentNotification;
|
||||
private TextBox tbBankTransferRegEx;
|
||||
private TextBox tbRemarks;
|
||||
private DateTimePicker dateMemberForm;
|
||||
|
||||
|
@ -325,12 +329,59 @@ namespace dezentrale.view
|
|||
TextAlign = HorizontalAlignment.Right,
|
||||
ReadOnly = true,
|
||||
});
|
||||
/*
|
||||
[XmlElement] public DateTime GreetedDate { get; set; }
|
||||
[XmlElement] public DateTime LastPaymentProcessed { get; set; }
|
||||
[XmlElement] public uint PaymentsTotal { get; set; }
|
||||
[XmlElement] public DateTime LastBalanceDegrade { get; set; }
|
||||
*/
|
||||
parent.Controls.Add(new Label()
|
||||
{
|
||||
Text = "AccountInCharge:",
|
||||
Location = new Point(lm, 4 * line + tm + 5),
|
||||
Size = new Size(110, 12),
|
||||
TextAlign = ContentAlignment.BottomRight,
|
||||
});
|
||||
parent.Controls.Add(cbEvaluateAccountInCharge = new CheckBox()
|
||||
{
|
||||
Location = new Point(lm + 118, 4 * line + tm),
|
||||
Width = 20,
|
||||
Anchor = AnchorStyles.Top | AnchorStyles.Left,
|
||||
});
|
||||
parent.Controls.Add(tbBankAccountInCharge = new TextBox()
|
||||
{
|
||||
Location = new Point(lm + 138, 4 * line + tm),
|
||||
Width = 160,
|
||||
Anchor = AnchorStyles.Top | AnchorStyles.Left,
|
||||
});
|
||||
parent.Controls.Add(cbPaymentNotification = new CheckBox()
|
||||
{
|
||||
Text = "Send payment notification via E-Mail",
|
||||
Location = new Point(lm + 308, 4 * line + tm),
|
||||
Width = 240,
|
||||
Anchor = AnchorStyles.Top | AnchorStyles.Left,
|
||||
});
|
||||
|
||||
|
||||
parent.Controls.Add(new Label()
|
||||
{
|
||||
Text = "BankRegEx:",
|
||||
Location = new Point(lm, 5 * line + tm + 5),
|
||||
Size = new Size(110, 12),
|
||||
TextAlign = ContentAlignment.BottomRight,
|
||||
});
|
||||
parent.Controls.Add(tbBankTransferRegEx = new TextBox()
|
||||
{
|
||||
Location = new Point(lm + 118, 5 * line + tm),
|
||||
Width = 160,
|
||||
Anchor = AnchorStyles.Top | AnchorStyles.Left,
|
||||
});
|
||||
cbEvaluateAccountInCharge.CheckedChanged += (sender, e) =>
|
||||
{
|
||||
tbBankAccountInCharge.ReadOnly = !cbEvaluateAccountInCharge.Checked;
|
||||
tbBankTransferRegEx.ReadOnly = !cbEvaluateAccountInCharge.Checked;
|
||||
};
|
||||
|
||||
/*
|
||||
[XmlElement] public DateTime GreetedDate { get; set; }
|
||||
[XmlElement] public DateTime LastPaymentProcessed { get; set; }
|
||||
[XmlElement] public uint PaymentsTotal { get; set; }
|
||||
[XmlElement] public DateTime LastBalanceDegrade { get; set; }
|
||||
*/
|
||||
parent.Controls.Add(new Label()
|
||||
{
|
||||
Text = "Remarks:",
|
||||
|
@ -359,9 +410,16 @@ namespace dezentrale.view
|
|||
|
||||
Location = new Point( (parent.ClientSize.Width - 250) / 2, (parent.ClientSize.Height - 50) / 2),
|
||||
};
|
||||
parent.Controls.Add(LoadMT);
|
||||
parent.Controls.Add(LoadMT);
|
||||
LoadMT.Click += (sender, e) =>
|
||||
{
|
||||
Console.WriteLine($"Loaded {Program.MoneyTransfers.Entries.Count} Money transfers.");
|
||||
mtv.LoadFromList();
|
||||
LoadMT.Visible = false;
|
||||
};
|
||||
}
|
||||
parent.Controls.Add(mtv = new LVMoneyTransfers()
|
||||
List<string> mti = (member != null) ? member.MoneyTransfersIds : null;
|
||||
parent.Controls.Add(mtv = new LVMoneyTransfers(mti)
|
||||
{
|
||||
Size = parent.ClientSize,
|
||||
Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom,
|
||||
|
@ -520,6 +578,12 @@ namespace dezentrale.view
|
|||
|
||||
tbMvMiss.Text = $"{member.MvMissCounter}";
|
||||
tbAccountBalance.Text = Int64FPToString(member.AccountBalance);
|
||||
cbEvaluateAccountInCharge.Checked = member.EvaluateAccountInCharge;
|
||||
tbBankAccountInCharge.ReadOnly = !cbEvaluateAccountInCharge.Checked;
|
||||
tbBankAccountInCharge.Text = member.BankAccountInCharge;
|
||||
cbPaymentNotification.Checked = member.PaymentNotify;
|
||||
tbBankTransferRegEx.ReadOnly = !cbEvaluateAccountInCharge.Checked;
|
||||
tbBankTransferRegEx.Text = member.BankTransferRegEx;
|
||||
tbRemarks.Text = member.Remarks;
|
||||
this.ResumeLayout(false);
|
||||
}
|
||||
|
@ -588,6 +652,10 @@ namespace dezentrale.view
|
|||
{
|
||||
Console.WriteLine($"Cannot convert Account balance to fixed point value:\n{ex.Message}");
|
||||
}
|
||||
member.EvaluateAccountInCharge = cbEvaluateAccountInCharge.Checked;
|
||||
member.BankAccountInCharge = tbBankAccountInCharge.Text;
|
||||
member.PaymentNotify = cbPaymentNotification.Checked;
|
||||
member.BankTransferRegEx = tbBankTransferRegEx.Text;
|
||||
member.Remarks = tbRemarks.Text;
|
||||
|
||||
member.FinishLogEvent();
|
||||
|
|
|
@ -13,6 +13,34 @@ namespace dezentrale.view
|
|||
public class frmMain : Form
|
||||
{
|
||||
private LVMembers lstMembers;
|
||||
private LVMoneyTransfers mtv;
|
||||
|
||||
private void BuildMoneyTransfers(Control parent)
|
||||
{
|
||||
if (!Program.MoneyTransfersLoaded)
|
||||
{
|
||||
Button LoadMT = new Button()
|
||||
{
|
||||
Text = "Load money transfers from disk",
|
||||
Anchor = AnchorStyles.None,
|
||||
Size = new Size(250, 50),
|
||||
|
||||
Location = new Point((parent.ClientSize.Width - 250) / 2, (parent.ClientSize.Height - 50) / 2),
|
||||
};
|
||||
parent.Controls.Add(LoadMT);
|
||||
LoadMT.Click += (sender, e) =>
|
||||
{
|
||||
Console.WriteLine($"Loaded {Program.MoneyTransfers.Entries.Count} Money transfers.");
|
||||
mtv.LoadFromList();
|
||||
LoadMT.Visible = false;
|
||||
};
|
||||
}
|
||||
parent.Controls.Add(mtv = new LVMoneyTransfers()
|
||||
{
|
||||
Size = parent.ClientSize,
|
||||
Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Bottom,
|
||||
});
|
||||
}
|
||||
|
||||
public frmMain()
|
||||
{
|
||||
|
@ -44,10 +72,13 @@ namespace dezentrale.view
|
|||
lstMembers.AddMenuItem("Main Settings", null);
|
||||
lstMembers.DoubleClick += lstMembers_Edit;
|
||||
|
||||
TabPage tabMoneyTransfers = new TabPage("MoneyTransfers");
|
||||
BuildMoneyTransfers(tabMoneyTransfers);
|
||||
|
||||
this.Controls.Add(new TabControl()
|
||||
{
|
||||
Dock = DockStyle.Fill,
|
||||
TabPages = { tabMembers },
|
||||
TabPages = { tabMembers, tabMoneyTransfers },
|
||||
});
|
||||
this.ResumeLayout(false);
|
||||
|
||||
|
@ -84,7 +115,7 @@ namespace dezentrale.view
|
|||
{
|
||||
OpenFileDialog ofd = new OpenFileDialog()
|
||||
{
|
||||
Filter = "Spaßkasse-CSV-Dateien (*.csv)|*.csv|Alle Dateien (*.*)|*.*",
|
||||
Filter = "Spaßkasse-CSV-Dateien (*.csv)|*.csv;*.CSV|Alle Dateien (*.*)|*.*",
|
||||
};
|
||||
DialogResult dr = ofd.ShowDialog();
|
||||
//ofd.FilterIndex
|
||||
|
|
Loading…
Reference in New Issue