190609PX Added program version to data files, brought CSV import to life

This commit is contained in:
phantomix 2019-06-10 01:33:21 +02:00
parent c9972308aa
commit 84ae43c4e2
13 changed files with 226 additions and 124 deletions

View File

@ -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)

View File

@ -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";

View File

@ -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";

View File

@ -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"

View File

@ -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); }

View File

@ -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);

View File

@ -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;

View File

@ -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:

View File

@ -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()

View File

@ -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 });

View File

@ -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);
}
}
}
}

View File

@ -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();

View File

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