2019-05-16 16:14:54 +00:00
using System ;
using System.Collections.Generic ;
using System.Drawing ;
using System.Windows.Forms ;
2019-12-02 16:23:35 +00:00
using dezentrale.core ;
2019-05-16 16:14:54 +00:00
using dezentrale.model ;
2019-06-03 23:26:57 +00:00
using dezentrale.model.money ;
2019-05-16 16:14:54 +00:00
namespace dezentrale.view
{
public class frmMain : Form
{
private LVMembers lstMembers ;
2019-06-09 23:33:21 +00:00
private LVMoneyTransfers mtv ;
2021-01-18 07:43:56 +00:00
private LvMv lstMv ;
2019-06-09 23:33:21 +00:00
2022-01-24 21:04:24 +00:00
private MenuItem mnuFileExport , mnuFileImport ;
2019-06-09 23:33:21 +00:00
private void BuildMoneyTransfers ( Control parent )
{
2019-06-26 14:54:45 +00:00
parent . Controls . Add ( mtv = new LVMoneyTransfers ( ) { Dock = DockStyle . Fill , } ) ;
if ( Program . MoneyTransfersLoaded ) mtv . LoadFromList ( Program . MoneyTransfers . Entries ) ;
else mtv . LoadRequest + = ( sender , e ) = > { e . Transfers = Program . MoneyTransfers . Entries ; } ;
2019-06-09 23:33:21 +00:00
}
2019-05-16 16:14:54 +00:00
2020-12-05 17:41:13 +00:00
private bool enforceClosing = false ;
2019-05-16 16:14:54 +00:00
public frmMain ( )
{
this . SuspendLayout ( ) ;
this . Text = $"dezentrale-members Version {Program.VersionString}" ;
this . StartPosition = FormStartPosition . CenterScreen ;
this . Size = new Size ( 640 , 480 ) ;
2020-12-05 17:41:13 +00:00
this . FormClosing + = ( sender , e ) = >
{
2022-01-24 21:04:24 +00:00
if ( ! enforceClosing & & Program . config . DbChangedSinceExport & & Program . config . ImportExport . Enabled )
2020-12-05 17:41:13 +00:00
{
DialogResult dr =
MessageBox . Show ( "Database changed since last export.\r\n\r\n"
+ $"Last Export: {Program.config.LastDbExport}\r\n"
+ $"Last Change: {Program.config.LastDbLocalChange}\r\n\r\n"
+ "Really quit without exporting?" ,
"Quit witout export?" , MessageBoxButtons . YesNo ) ;
if ( dr = = DialogResult . No )
e . Cancel = true ;
}
} ;
2019-06-12 20:52:26 +00:00
this . Menu = new MainMenu ( )
{
MenuItems =
{
new MenuItem ( "File" )
2019-06-13 16:09:12 +00:00
{ MenuItems = {
2019-06-14 15:27:05 +00:00
new MenuItem ( "&Configuration..." , mnuMain_File_Configuration ) { Enabled = true } ,
2019-06-13 16:09:12 +00:00
new MenuItem ( "-" ) ,
2022-01-24 21:04:24 +00:00
( mnuFileExport = new MenuItem ( "&Export database" , mnuMain_File_Export ) ) ,
( mnuFileImport = new MenuItem ( "&Import database" , mnuMain_File_Import ) ) ,
2019-06-12 20:52:26 +00:00
new MenuItem ( "-" ) ,
new MenuItem ( "&Quit" , mnuMain_File_Quit ) ,
} } ,
new MenuItem ( "Members" )
{ MenuItems = {
new MenuItem ( "&Add new member" , mnuMain_Members_Add ) ,
2020-11-17 21:46:03 +00:00
new MenuItem ( "&Cronjob all" , lstMembers_CronjobAll ) ,
new MenuItem ( "-" ) ,
2019-06-12 20:52:26 +00:00
#if DEBUG
2020-11-17 21:46:03 +00:00
new MenuItem ( "Generate &Testdata" , mnuMain_Members_Generate_Testdata ) ,
2019-06-14 15:27:05 +00:00
new MenuItem ( "-" ) ,
#endif
2021-07-18 10:47:57 +00:00
new MenuItem ( "Show numeric &info" , lstMembers_mnuMain_Members_ShowInfo ) ,
new MenuItem ( "Export &CSV (selected)" , lstMembers_mnuMain_Members_CSV_selected ) ,
new MenuItem ( "Export &CSV (all)" , lstMembers_mnuMain_Members_CSV_all ) ,
2020-11-22 21:44:15 +00:00
} } ,
new MenuItem ( "MV" )
2021-02-01 12:49:12 +00:00
{ MenuItems = {
new MenuItem ( "&New MV..." , lstMv_New ) , //Todo: Do we even need this here?
2021-03-01 18:15:18 +00:00
new MenuItem ( "&Edit selected MV..." , lstMv_Edit ) , //Todo: Do we even need this here?
new MenuItem ( "&Cancel/Remove selected MV..." , lstMv_CancelSelected ) , //Todo: Do we even need this here?
2019-06-13 16:09:12 +00:00
} } ,
new MenuItem ( "Payments" )
{ MenuItems = {
2019-06-14 15:27:05 +00:00
new MenuItem ( "&Add new MoneyTransfer" , mnuMain_Payments_Add ) { Enabled = true } ,
2020-08-24 16:48:02 +00:00
new MenuItem ( "Process CSV..." , mnuMain_Payments_ProcessCSV ) ,
new MenuItem ( "Generate payment receipts..." , mnuMain_Payments_Receipts ) ,
2019-06-12 20:52:26 +00:00
} } ,
new MenuItem ( "Help" )
{ MenuItems = {
new MenuItem ( "&About" , mnuMain_Help_About ) ,
} }
}
} ;
2022-01-24 21:04:24 +00:00
mnuFileImport . Enabled = mnuFileExport . Enabled = Program . config . ImportExport . Enabled ;
2019-06-04 15:24:30 +00:00
TabPage tabMembers = new TabPage ( "Members" ) ;
tabMembers . Controls . Add ( lstMembers = new LVMembers ( ) { Dock = DockStyle . Fill } ) ;
2019-06-12 20:52:26 +00:00
//lstMembers.AddMenuItem("Add new member", lstMembers_Add);
2019-06-14 15:27:05 +00:00
lstMembers . AddMenuItem ( "Edit selected member" , lstMembers_Edit ) ;
lstMembers . AddMenuItem ( "Delete selected member" , lstMembers_Delete ) ;
lstMembers . AddMenuItem ( "Add cash payment to member" , lstMembers_AddCashTransfer ) ;
2019-06-03 23:26:57 +00:00
lstMembers . AddMenuItem ( "-" , null ) ;
2019-06-14 15:27:05 +00:00
lstMembers . AddMenuItem ( "Cronjob selected member" , lstMembers_CronjobSelected ) ;
//lstMembers.AddMenuItem("Cronjob checked ones", lstMembers_CronjobChecked);
2019-05-16 16:14:54 +00:00
lstMembers . AddMenuItem ( "Cronjob all" , lstMembers_CronjobAll ) ;
2020-03-04 16:49:33 +00:00
lstMembers . AddMenuItem ( "-" , null ) ;
2020-08-12 10:12:54 +00:00
lstMembers . AddMenuItem ( "Send test mail to member" , lstMembers_TestMail ) ;
lstMembers . AddMenuItem ( "Send account status mail to member" , lstMembers_AccountStatusMail ) ;
2019-06-04 15:24:30 +00:00
//TBD: "Selected users missed an MV"
2019-06-14 15:27:05 +00:00
//lstMembers.AddMenuItem("Main Settings", null);
2019-06-04 15:24:30 +00:00
lstMembers . DoubleClick + = lstMembers_Edit ;
2021-01-18 07:43:56 +00:00
TabPage tabMvList = new TabPage ( "MvList" ) ;
tabMvList . Controls . Add ( lstMv = new LvMv ( ) { Dock = DockStyle . Fill , } ) ;
2021-03-01 18:15:18 +00:00
lstMv . AddMenuItem ( "New MV..." , lstMv_New ) ;
lstMv . AddMenuItem ( "Edit selected MV" , lstMv_Edit ) ;
lstMv . AddMenuItem ( "Cancel/Remove selected MV..." , lstMv_CancelSelected ) ;
2019-06-09 23:33:21 +00:00
TabPage tabMoneyTransfers = new TabPage ( "MoneyTransfers" ) ;
BuildMoneyTransfers ( tabMoneyTransfers ) ;
2019-06-04 15:24:30 +00:00
this . Controls . Add ( new TabControl ( )
{
Dock = DockStyle . Fill ,
2021-01-18 07:43:56 +00:00
TabPages = { tabMembers , tabMvList , tabMoneyTransfers } ,
2019-06-04 15:24:30 +00:00
} ) ;
2019-05-16 16:14:54 +00:00
this . ResumeLayout ( false ) ;
//Fill list with data from members
2021-03-01 18:15:18 +00:00
lstMembers . LoadFromList ( Program . members . Entries ) ;
//Fill mv list with data from mv
lstMv . LoadFromList ( Program . mvList . Entries ) ;
2020-12-05 17:41:13 +00:00
//Check for needed import
2022-01-24 21:04:24 +00:00
if ( Program . config . ImportExport . Enabled )
2021-01-05 00:59:51 +00:00
{
2022-01-24 21:04:24 +00:00
DateTime now = DateTime . Now ;
int totalHours = ( int ) now . Subtract ( Program . config . LastDbImport ) . TotalHours ;
int totalDays = totalHours / 24 ;
if ( totalHours > = 8 )
2020-12-05 17:41:13 +00:00
{
2022-01-24 21:04:24 +00:00
totalHours % = 24 ;
string timeSpan = $"{totalDays} d, {totalHours} h" ;
if ( Program . config . DbChangedSinceExport )
2020-12-05 17:41:13 +00:00
{
2022-01-24 21:04:24 +00:00
MessageBox . Show ( "Warning: There are local changes to DB since last export!\r\n"
+ "Please check if there are changes on the server side and then\r\n"
+ "- perform a manual backup-import-merge\r\n"
+ "- or simply an export if there are no changes.\r\n\r\n"
+ $"Last import was: {Program.config.LastDbImport}\r\n"
+ $"Last export was: {Program.config.LastDbExport}\r\n"
+ $"Last db change was {Program.config.LastDbLocalChange}\r\n" ) ;
2020-12-05 17:41:13 +00:00
}
2022-01-24 21:04:24 +00:00
else
{
if ( totalDays > 365 ) timeSpan = "too long" ;
DialogResult dr = MessageBox . Show ( $"Last Db import was {timeSpan} ago.\r\nImport now?" , "Import database" , MessageBoxButtons . YesNo ) ;
if ( dr = = DialogResult . Yes )
{
mnuMain_File_Import ( null , null ) ;
}
}
2020-12-05 17:41:13 +00:00
}
}
2019-06-20 15:03:02 +00:00
}
2019-06-13 16:09:12 +00:00
private void mnuMain_File_Configuration ( object sender , EventArgs e )
{
2019-06-14 15:27:05 +00:00
frmConfiguration frmConfig = new frmConfiguration ( ) ;
2019-06-13 16:09:12 +00:00
frmConfig . ShowDialog ( ) ;
if ( frmConfig . DialogResult = = DialogResult . OK )
{
2022-01-24 21:04:24 +00:00
frmConfig . FillAndSaveConfig ( ) ;
mnuFileImport . Enabled = mnuFileExport . Enabled = Program . config . ImportExport . Enabled ;
if ( frmConfig . KeylockCombiChanged & & Program . config . Smtp . Enabled )
2019-06-14 23:36:00 +00:00
{
2019-06-17 15:45:15 +00:00
DialogResult dr = MessageBox . Show ( "You've changed the keylock combination.\n Do you want to send an E-Mail to every active member to inform them?" , "Keylock-Combi changed" , MessageBoxButtons . YesNo ) ;
2019-06-14 23:36:00 +00:00
if ( dr = = DialogResult . Yes )
{
2023-05-07 10:22:27 +00:00
FormMail keylockChanged = Program . mailTemplates . KeylockChanged . ReplaceReflect ( Program . config ) ;
2019-06-14 23:36:00 +00:00
foreach ( Member m in Program . members . Entries )
{
if ( m . Status ! = Member . eStatus . Active ) continue ;
2019-06-17 15:45:15 +00:00
m . StartLogEvent ( "New keylock code" , LogEvent . eEventType . EMail ) ;
m . CurrentLog . SubEvents . Add ( keylockChanged . Send ( m ) ) ;
m . SaveToFile ( ) ;
2019-06-14 23:36:00 +00:00
}
}
}
2019-06-13 16:09:12 +00:00
}
}
2019-06-12 20:52:26 +00:00
private void mnuMain_File_Export ( object sender , EventArgs e )
2020-12-05 17:41:13 +00:00
{
if ( ! Program . config . DbChangedSinceExport )
{
DialogResult dr = MessageBox . Show ( "There were no changes to the local DB, exporting may not be necessary.\r\n"
+ "Really proceed with export?" , "Database export" , MessageBoxButtons . YesNo ) ;
if ( dr = = DialogResult . No ) return ;
}
2019-12-03 16:43:02 +00:00
ExportProcess export = new ExportProcess ( )
{
ImportExportSettings = Program . config . ImportExport ,
MemberDir = Program . config . DbDirectory ,
OutputDir = Program . DmDirectory ,
} ;
2021-03-15 16:21:37 +00:00
frmProcessWithLog frmExport = new frmProcessWithLog ( export , false ) ;
frmExport . ShowDialog ( ) ;
2019-06-12 20:52:26 +00:00
}
private void mnuMain_File_Import ( object sender , EventArgs e )
2020-12-05 17:41:13 +00:00
{
DialogResult dr ;
if ( Program . config . DbChangedSinceExport )
dr = MessageBox . Show ( "There were changes to the local DB which WILL BE LOST on import!\r\n"
+ $"Last export: {Program.config.LastDbExport}\r\n"
+ $"Last change: {Program.config.LastDbLocalChange}\r\n"
+ "Really proceed with import?" , "Overwrite local version of the database?" , MessageBoxButtons . YesNo ) ;
else
dr = MessageBox . Show ( "Warning\nImporting database from external source will overwrite all\nlocal changes! Really import?" , "Overwrite local version of the database?" , MessageBoxButtons . YesNo ) ;
2019-06-12 20:52:26 +00:00
if ( dr = = DialogResult . Yes )
2019-12-02 12:15:33 +00:00
{
ImportProcess import = new ImportProcess ( )
{
2019-12-03 16:43:02 +00:00
ImportExportSettings = Program . config . ImportExport ,
2019-12-02 12:15:33 +00:00
MemberDir = Program . config . DbDirectory ,
InputDir = Program . DmDirectory ,
} ;
2019-12-02 16:23:35 +00:00
frmProcessWithLog frmImport = new frmProcessWithLog ( import , true ) ;
2019-12-02 12:15:33 +00:00
dr = frmImport . ShowDialog ( ) ;
2019-12-04 17:49:42 +00:00
if ( dr = = DialogResult . Yes )
{
if ( Program . LoadFiles ( ) ! = 0 )
{
MessageBox . Show ( "Error while loading imported files.\nProgram will close now." ) ;
this . Close ( ) ;
}
lstMembers . LoadFromList ( Program . members . Entries ) ;
2021-04-09 20:41:31 +00:00
lstMv . LoadFromList ( Program . mvList . Entries ) ;
2019-12-04 17:49:42 +00:00
mtv . ClearList ( ) ;
}
2019-06-12 20:52:26 +00:00
}
}
2020-03-04 16:49:33 +00:00
2019-06-12 20:52:26 +00:00
private void mnuMain_File_Quit ( object sender , EventArgs e )
{
this . Close ( ) ;
2019-05-16 16:14:54 +00:00
}
2019-06-12 20:52:26 +00:00
private void mnuMain_Members_Add ( object sender , EventArgs e )
{
Member m = Program . members . CreateMember ( false ) ;
frmEditEntry edit = new frmEditEntry ( m , true ) ;
edit . ShowDialog ( ) ;
if ( edit . DialogResult = = DialogResult . OK )
{
//the edit window already updated the data in the member object
//but it is not added to the data list yet.
Program . members . Entries . Add ( m ) ;
List < Member > toSave = new List < Member > ( ) { m } ;
MemberList . SaveToFiles ( toSave ) ;
lstMembers . AddEntry ( m ) ;
}
2020-11-17 21:46:03 +00:00
}
2021-02-01 12:49:12 +00:00
private void lstMv_New ( object sender , EventArgs e )
2020-11-17 21:46:03 +00:00
{
2021-02-21 15:18:07 +00:00
DialogResult res = MessageBox . Show ( "This will create a new MV and store it in MV list.\n" , "Create new MV?" , MessageBoxButtons . YesNo ) ;
if ( res = = DialogResult . Yes )
{
frmMv newMv = new frmMv ( ) ;
Program . mvList . Entries . Add ( newMv . mv ) ;
Program . mvList . SaveToFile ( ) ;
newMv . ShowDialog ( ) ;
2021-03-01 18:15:18 +00:00
Program . mvList . SaveToFile ( ) ;
lstMv . AddEntry ( newMv . mv ) ;
}
}
2021-02-21 15:18:07 +00:00
2021-03-01 18:15:18 +00:00
private void lstMv_Edit ( object sender , EventArgs e )
{
Mv mv = lstMv . GetFirstSelectedItem ( ) ;
if ( mv = = null )
{
MessageBox . Show ( "No MV entry selected" ) ;
} else
{
frmMv editMv = new frmMv ( mv ) ;
editMv . ShowDialog ( ) ;
Program . mvList . SaveToFile ( ) ;
lstMv . UpdateEntry ( editMv . mv ) ;
2021-02-21 15:18:07 +00:00
}
2021-02-01 12:49:12 +00:00
//if(newMv.DialogResult == DialogResult.OK)
//lstMv.AddEntry(newMv.GetMv());
2020-11-17 21:46:03 +00:00
//This process runs in two steps: First, the GUI will ask the user about all details,
//Second, there will be a @ref BackgroundProcess launched that prepares and sends the e-mails.
2021-02-01 12:49:12 +00:00
/ * frmMvInvitation mvInvitation = new frmMvInvitation ( ) ;
2020-11-17 21:46:03 +00:00
DialogResult dr = mvInvitation . ShowDialog ( ) ;
if ( dr = = DialogResult . Cancel ) return ;
{
//prepare member list
List < Member > lm ;
switch ( mvInvitation . InvitationGroup )
{
case MvInvitationGroup . AllActiveMembers :
lm = new List < Member > ( ) ;
foreach ( Member m in Program . members . Entries )
if ( m . Status = = Member . eStatus . Active ) lm . Add ( m ) ;
break ;
case MvInvitationGroup . AllMembers :
lm = Program . members . Entries ;
break ;
case MvInvitationGroup . AllSelectedFromMainWindow :
lm = lstMembers . GetSelectedItems ( ) ;
break ;
default :
MessageBox . Show ( $"Invalid MvInvitationGroup selected (mvInvitation.InvitationGroup)" ) ;
return ;
}
MvInvitationProcess inv = new MvInvitationProcess ( mvInvitation , lm ) ;
frmProcessWithLog frmInv = new frmProcessWithLog ( inv , true ) ;
dr = frmInv . ShowDialog ( ) ;
2021-02-01 12:49:12 +00:00
}
* /
2019-06-13 16:09:12 +00:00
}
2021-02-01 12:49:12 +00:00
private void lstMv_CancelSelected ( object sender , EventArgs e )
2021-03-01 18:15:18 +00:00
{
Mv mv = lstMv . GetFirstSelectedItem ( ) ;
if ( mv = = null )
{
MessageBox . Show ( "No MV entry selected" ) ;
2021-04-14 11:47:14 +00:00
} else if ( mv . Status = = Mv . MvStatus . Cancelled )
2021-03-01 18:15:18 +00:00
{
MessageBox . Show ( "MV is already cancelled" ) ;
2021-04-14 11:47:14 +00:00
} else if ( mv . Status = = Mv . MvStatus . Ended )
{
MessageBox . Show ( "MV is finished and cannot be cancelled." ) ;
2021-03-01 18:15:18 +00:00
} else
{
DialogResult res ;
if ( mv . Status = = Mv . MvStatus . InPreparation )
{
res = MessageBox . Show ( "MV is in preparation state, do you also want to delete it completely?" , "Also delete MV?" , MessageBoxButtons . YesNoCancel ) ;
} else
{
res = MessageBox . Show ( "Do you really want to cancel this MV?" , "Cancel MV?" , MessageBoxButtons . OKCancel ) ;
}
switch ( res )
{
case DialogResult . Yes : //Delete MV
//mv.Status = Mv.MvStatus.InPreparation
lstMv . RemoveEntry ( mv ) ;
Program . mvList . Entries . Remove ( mv ) ;
Program . mvList . SaveToFile ( ) ;
break ;
case DialogResult . No : //Set status to Cancelled
case DialogResult . OK :
//Send cancellation mails?
if ( mv . Status ! = Mv . MvStatus . InPreparation )
{
res = MessageBox . Show ( "Send cancel mails to previously invited members?" , "Send cancel mails?" , MessageBoxButtons . YesNo ) ;
if ( res = = DialogResult . Yes )
{
2023-05-07 10:22:27 +00:00
FormMail fm = Program . mailTemplates . MvCancelNotification . ReplaceReflect ( mv ) ;
2021-03-01 18:15:18 +00:00
foreach ( MvInvitedMember mvi in mv . Members )
{
if ( ! mvi . Invited ) continue ;
mvi . Member . StartLogEvent ( "MV cancelled" , LogEvent . eEventType . EMail ) ;
mvi . Member . CurrentLog . SubEvents . Add ( fm . Send ( mvi . Member ) ) ;
mvi . Member . SaveToFile ( ) ;
}
}
}
mv . Status = Mv . MvStatus . Cancelled ;
lstMv . UpdateEntry ( mv ) ;
Program . mvList . SaveToFile ( ) ;
break ;
default :
case DialogResult . Cancel : //Do nothing
break ;
}
}
2020-11-17 21:46:03 +00:00
}
2019-06-13 16:09:12 +00:00
#if DEBUG
private void mnuMain_Members_Generate_Testdata ( object sender , EventArgs e )
{
if ( Program . members . Entries . Count > 0 )
{
DialogResult dr = MessageBox . Show ( this , $"Generating testdata will overwrite the current member list.\nUse this on a test system only!\n Really overwrite current member list?" , "Really overwrite list?" , MessageBoxButtons . YesNo ) ;
if ( dr = = DialogResult . No ) return ;
}
Program . members . GenerateTestData ( ) ;
lstMembers . LoadFromList ( Program . members . Entries ) ;
}
#endif
2019-06-14 15:27:05 +00:00
private void lstMembers_mnuMain_Members_ShowInfo ( object sender , EventArgs e )
2019-06-13 16:09:12 +00:00
{
2019-06-14 15:27:05 +00:00
MessageBox . Show ( new MemberReport ( ) . Body ) ;
}
2021-07-18 14:21:42 +00:00
private void MemberCsvExport ( List < Member > list )
{
frmExportCsv < Member > frmCsv = new frmExportCsv < Member > ( list )
{
SelectedProperties = Program . config . MemberCsvExportFields ,
} ;
frmCsv . ShowDialog ( ) ;
Program . config . MemberCsvExportFields = frmCsv . SelectedProperties ;
XmlData . SaveToFile ( Program . ConfigFile , Program . config ) ;
}
2021-07-18 10:47:57 +00:00
private void lstMembers_mnuMain_Members_CSV_selected ( object sender , EventArgs e )
2021-07-18 14:21:42 +00:00
{
MemberCsvExport ( lstMembers . GetSelectedItems ( ) ) ;
2021-07-18 10:47:57 +00:00
}
private void lstMembers_mnuMain_Members_CSV_all ( object sender , EventArgs e )
2021-07-18 14:21:42 +00:00
{
MemberCsvExport ( Program . members . Entries ) ;
2021-07-18 10:47:57 +00:00
}
2019-06-14 15:27:05 +00:00
private void mnuMain_Payments_Add ( object sender , EventArgs e )
{
frmMoneyTransfer addMoney = new frmMoneyTransfer ( ) ;
addMoney . ShowDialog ( ) ;
DialogResult dr = addMoney . DialogResult ;
if ( dr = = DialogResult . OK )
{
try
2019-06-13 16:09:12 +00:00
{
2019-06-14 23:36:00 +00:00
MoneyTransfer mt = addMoney . FillMoneyTransfer ( ) ;
2019-06-14 15:27:05 +00:00
if ( mt . MemberNumber ! = 0 )
{
Member m = Program . members . Find ( mt . MemberNumber ) ;
m . ApplyMoneyTransfer ( mt ) ;
mt . AssignFixed = true ;
//m.SaveToFile(); //automaticly saved in ApplyMoneyTransfer()
}
Program . MoneyTransfers . AddEntry ( mt ) ;
Program . MoneyTransfers . SaveToFile ( ) ;
} catch ( Exception ex )
{
MessageBox . Show ( $"Error while storing MoneyTransfer: {ex.Message}" ) ;
2019-06-13 16:09:12 +00:00
}
2019-06-14 15:27:05 +00:00
}
2019-06-13 16:09:12 +00:00
}
private void mnuMain_Payments_ProcessCSV ( object sender , EventArgs e )
{
OpenFileDialog ofd = new OpenFileDialog ( )
{
Filter = "Spaßkasse-CSV-Dateien (*.csv)|*.csv;*.CSV|Alle Dateien (*.*)|*.*" ,
} ;
DialogResult dr = ofd . ShowDialog ( ) ;
//ofd.FilterIndex
if ( dr = = DialogResult . OK )
2022-01-24 21:04:24 +00:00
{
lstMembers . SuspendLayout ( ) ;
2022-02-18 21:34:28 +00:00
CsvImportProcess csvImport = new CsvImportProcess ( )
{
FileName = ofd . FileName ,
} ;
frmProcessWithLog frmCsvImport = new frmProcessWithLog ( csvImport , true ) ;
dr = frmCsvImport . ShowDialog ( ) ;
2022-01-24 21:04:24 +00:00
foreach ( Member m in Program . members . Entries ) lstMembers . UpdateEntry ( m ) ;
if ( Program . MoneyTransfersLoaded )
{
//This will enforce reloading the moneytransfer list
Program . MoneyTransfersLoaded = false ;
mtv . LoadFromList ( Program . MoneyTransfers . Entries ) ;
}
lstMembers . ResumeLayout ( false ) ;
}
2019-06-13 16:09:12 +00:00
}
2020-08-24 16:48:02 +00:00
private void mnuMain_Payments_Receipts ( object sender , EventArgs e )
{
2020-08-27 15:59:36 +00:00
int year = DateTime . Now . Year - 1 ;
2020-08-31 09:04:38 +00:00
List < Member > sel = lstMembers . GetSelectedItems ( ) ;
2020-08-26 16:18:16 +00:00
frmPaymentReceipts receipts = new frmPaymentReceipts ( )
{
2020-08-31 15:57:17 +00:00
//Defaults that will be edited by the user
2020-08-31 09:04:38 +00:00
MemberList = ( sel ! = null & & sel . Count > 0 ) ? sel : null ,
2020-08-27 15:59:36 +00:00
DataTemplate = "dezentrale-beitragsquittung-template.svg" ,
DataFormat = IntermediateFormat . SvgInkscape092 ,
StartDate = new DateTime ( year , 01 , 01 ) ,
EndDate = new DateTime ( year , 12 , 31 ) ,
FileNamePattern = "Member{MemberNumber}-{ValutaDateString}-{AmountString}{Currency}" ,
2020-08-31 15:57:17 +00:00
OutputDirectory = "." ,
SendEmail = false
2020-08-26 16:18:16 +00:00
} ;
2020-08-24 16:48:02 +00:00
DialogResult dr = receipts . ShowDialog ( ) ;
if ( dr = = DialogResult . OK )
2020-08-26 16:18:16 +00:00
{
2020-08-25 15:37:03 +00:00
PaymentReceiptProcess rec = new PaymentReceiptProcess ( receipts ) ;
frmProcessWithLog frmRec = new frmProcessWithLog ( rec , true ) ;
dr = frmRec . ShowDialog ( ) ;
2020-08-24 16:48:02 +00:00
}
}
2019-06-12 20:52:26 +00:00
private void mnuMain_Help_About ( object sender , EventArgs e )
{
MessageBox . Show ( "mnuMain_Help_About" ) ;
}
2019-05-17 15:53:35 +00:00
private void CronjobMember ( Member m )
2019-05-16 16:14:54 +00:00
{
if ( m ! = null )
{
2019-05-22 16:11:29 +00:00
Cronjob . Run ( m ) ;
2019-05-16 16:14:54 +00:00
lstMembers . UpdateEntry ( m ) ;
}
}
2019-05-17 15:53:35 +00:00
private void lstMembers_CronjobSelected ( object sender , EventArgs e )
{
2019-06-20 15:03:02 +00:00
Member m = lstMembers . GetFirstSelectedItem ( ) ;
2019-05-17 15:53:35 +00:00
CronjobMember ( m ) ;
}
2019-05-16 16:14:54 +00:00
private void lstMembers_CronjobChecked ( object sender , EventArgs e )
{
2019-05-17 15:53:35 +00:00
lstMembers . SuspendLayout ( ) ;
2019-11-09 08:28:07 +00:00
foreach ( Member m in lstMembers . GetCheckedItems ( ) ) CronjobMember ( m ) ;
2019-05-17 15:53:35 +00:00
lstMembers . ResumeLayout ( false ) ;
2019-05-16 16:14:54 +00:00
}
private void lstMembers_CronjobAll ( object sender , EventArgs e )
{
2019-05-17 15:53:35 +00:00
lstMembers . SuspendLayout ( ) ;
2019-06-10 22:13:35 +00:00
//foreach (Member m in Program.members.Entries) CronjobMember(m);
Cronjob . Run ( ) ;
2019-11-09 08:28:07 +00:00
foreach ( Member m in Program . members . Entries ) lstMembers . UpdateEntry ( m ) ;
2019-05-17 15:53:35 +00:00
lstMembers . ResumeLayout ( false ) ;
2019-05-16 16:14:54 +00:00
}
2022-03-29 21:43:03 +00:00
private bool SendMail ( FormMail mail , Member m )
{
try
{
if ( m = = null ) return true ;
mail . Send ( m ) ;
} catch ( Exception ex )
{
string msg = ex . Message ;
while ( ex . InnerException ! = null )
{
ex = ex . InnerException ;
msg + = "\r\n" + ex . Message ;
}
MessageBox . Show ( $"Cannot send mail:\r\n{msg}" ) ;
}
return true ;
}
2020-03-04 16:49:33 +00:00
private void lstMembers_TestMail ( object sender , EventArgs e )
{
2023-05-07 10:22:27 +00:00
SendMail ( Program . mailTemplates . Testmail , lstMembers . GetFirstSelectedItem ( ) ) ;
2020-08-12 10:12:54 +00:00
}
private void lstMembers_AccountStatusMail ( object sender , EventArgs e )
{
2022-03-29 21:43:03 +00:00
Member m = lstMembers . GetFirstSelectedItem ( ) ;
2023-05-07 10:22:27 +00:00
FormMail statusMail = Program . mailTemplates . SingleMemberStatusReport ;
2022-03-29 21:43:03 +00:00
SendMail ( statusMail , m ) ;
2020-03-04 16:49:33 +00:00
}
2019-05-16 16:14:54 +00:00
private void lstMembers_Edit ( object sender , EventArgs e )
{
2019-06-20 15:03:02 +00:00
Member m = lstMembers . GetFirstSelectedItem ( ) ;
2019-05-16 16:14:54 +00:00
if ( m ! = null )
{
frmEditEntry edit = new frmEditEntry ( m ) ;
2019-06-26 14:54:45 +00:00
bool mtvLoadedOld = Program . MoneyTransfersLoaded ;
2019-05-16 16:14:54 +00:00
edit . ShowDialog ( ) ;
2019-06-26 14:54:45 +00:00
if ( ! mtvLoadedOld & & Program . MoneyTransfersLoaded ) mtv . LoadFromList ( Program . MoneyTransfers . Entries ) ;
2019-05-16 16:14:54 +00:00
if ( edit . DialogResult = = DialogResult . OK )
{
//the edit window already updated the data in the member object
lstMembers . UpdateEntry ( m ) ;
}
}
}
private void lstMembers_Delete ( object sender , EventArgs e )
{
2019-06-20 15:03:02 +00:00
Member m = lstMembers . GetFirstSelectedItem ( ) ;
2019-05-16 16:14:54 +00:00
if ( m ! = null )
{
DialogResult dr = MessageBox . Show ( this , $"Deleting a member cannot be undone!\nDo you really want to delete member {m.Number:D3} ({m.Nickname})?" , "Really delete member?" , MessageBoxButtons . YesNo ) ;
if ( dr = = DialogResult . Yes )
{
2019-05-17 15:53:35 +00:00
try
{
if ( ! Program . members . Remove ( m ) ) throw new Exception ( $"Program.members.Remove({m}) returned false." ) ;
} catch ( Exception ex )
{
MessageBox . Show ( $"Cannot remove member:\n{ex.Message}" ) ;
return ;
}
2019-05-16 16:14:54 +00:00
lstMembers . RemoveEntry ( m ) ;
}
}
}
2019-06-03 23:26:57 +00:00
private void lstMembers_AddCashTransfer ( object sender , EventArgs e )
{
2019-06-20 15:03:02 +00:00
Member m = lstMembers . GetFirstSelectedItem ( ) ;
2019-06-03 23:26:57 +00:00
if ( m ! = null )
{
2019-06-14 23:36:00 +00:00
//MoneyTransfer ct = new CashTransfer();
CashTransfer ct = new CashTransfer ( ) ;
ct . MemberNumber = m . Number ;
ct . TransferType = MoneyTransfer . eTransferType . MembershipPayment ;
ct . AssignFixed = true ;
frmMoneyTransfer addMoney = new frmMoneyTransfer ( ct ) ;
2019-06-03 23:26:57 +00:00
addMoney . ShowDialog ( ) ;
DialogResult dr = addMoney . DialogResult ;
if ( dr = = DialogResult . OK )
2019-06-14 23:36:00 +00:00
{
addMoney . FillMoneyTransfer ( ) ;
//MoneyTransfer mt = addMoney.GetMoneyTransfer();
m . ApplyMoneyTransfer ( ct ) ;
2019-06-14 15:27:05 +00:00
//m.SaveToFile(); //automaticly saved in ApplyMoneyTransfer()
2019-06-14 23:36:00 +00:00
//ct.AssignFixed = true;
Program . MoneyTransfers . AddEntry ( ct ) ;
2019-06-05 15:46:17 +00:00
Program . MoneyTransfers . SaveToFile ( ) ;
2019-11-09 08:28:07 +00:00
lstMembers . UpdateEntry ( m ) ;
2019-06-03 23:26:57 +00:00
}
}
}
2019-05-16 16:14:54 +00:00
}
}