Programm_Wirl/FormDeckungsbeitrag.cs
2025-04-28 08:31:23 +02:00

419 lines
15 KiB
C#

using DatenDB;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Collections;
namespace Deckungsbeitrag
{
public partial class FormDeckungsbeitrag : Form
{
private ListViewColumnSorter lvwColumnSorter = new ListViewColumnSorter(true);
public Kunde kunde = new Kunde();
public List<Umsatz> umsatzliste = new List<Umsatz>();
double fixlohnkosten; double variablekosten; double fixmietkosten; double gesamtumsatz; double filterumsatz; double filterumsatzVP;
int? id = null; int year = 2019; int itemsinlistview; int Mietbetten; int Gesamtbetten;
bool filter = false;
int[] months = null;
string order = "asc";
string[] selection = null;
public FormDeckungsbeitrag()
{
InitializeComponent();
this.dTPJahr.Checked = true;
dTPJahr_ValueChanged(this, null);
this.dTPVergleich.Checked = true;
Mietbetten = Kunde.GetBettenAnzahl("Miete");
Gesamtbetten = Kunde.GetBettenAnzahl("Lohn");
this.listViewDeckungsbeitrag.ListViewItemSorter = lvwColumnSorter;
buttonOK_Click(this, null);
}
private void FormDeckungsbeitrag_Load(object sender, EventArgs e)
{
Lade_ListView();
}
private void Lade_ListView()
{
listViewDeckungsbeitrag.SuspendLayout();
listViewDeckungsbeitrag.BeginUpdate();
listViewDeckungsbeitrag.Items.Clear();
itemsinlistview = 0;
filterumsatz = 0;
filterumsatzVP = 0;
double leer = 0;
//ERST KUNDENLISTE VON KUNDENLISTE DANN UMSÄTZE!!
foreach (Umsatz ums in umsatzliste)
{
kunde = Kunde.GetKunde(null, ums.KundeID, null);
ListViewItem item = new ListViewItem();
item.UseItemStyleForSubItems = false;
item.Tag = kunde;
item.Text = kunde.KundeNummer;
item.SubItems.Add(kunde.KundeName);
item.SubItems.Add(kunde.Region);
item.SubItems.Add(kunde.Waescheart);
item.SubItems.Add(kunde.Service);
item.SubItems.Add(kunde.Bettenanzahl.ToString());
item.SubItems.Add(Umsatz.GetUmsatz(ums.KundeID, dTPVergleich.Value.Year, ums.Year, months).ToString("C2", CultureInfo.CurrentCulture));//UMSATZ VORPERIODE
item.SubItems.Add(ums.Betrag.ToString("C2", CultureInfo.CurrentCulture));//UMSATZ WUNSCHPERIODE
//ANFANG //UMSATZDIFFERENZ BERECHNEN IN EUR UND %
if (Differenz_berechnen(ums.Betrag, Umsatz.GetUmsatz(ums.KundeID, dTPVergleich.Value.Year, ums.Year, months))[0] > 0) item.SubItems.Add(Differenz_berechnen(ums.Betrag, Umsatz.GetUmsatz(ums.KundeID, dTPVergleich.Value.Year, ums.Year, months))[0].ToString("C2", CultureInfo.CurrentCulture), Color.Green, item.BackColor, item.Font);//DIFFERENZ IN EUR
else item.SubItems.Add(Differenz_berechnen(ums.Betrag, Umsatz.GetUmsatz(ums.KundeID, dTPVergleich.Value.Year, ums.Year, months))[0].ToString("C2", CultureInfo.CurrentCulture), Color.Green, item.BackColor, item.Font);
if (Differenz_berechnen(ums.Betrag, Umsatz.GetUmsatz(ums.KundeID, dTPVergleich.Value.Year, ums.Year, months))[1] > 0) item.SubItems.Add("+" + Differenz_berechnen(ums.Betrag, Umsatz.GetUmsatz(ums.KundeID, dTPVergleich.Value.Year, ums.Year, months))[1].ToString("P2"), Color.Green, item.BackColor, item.Font);//DIFFERENZ IN %
else item.SubItems.Add(Differenz_berechnen(ums.Betrag, Umsatz.GetUmsatz(ums.KundeID, dTPVergleich.Value.Year, ums.Year, months))[1].ToString("P2"), Color.Red, item.BackColor, item.Font);
//ENDE //UMSATZDIFFERENZ BERECHNEN IN EUR UND %
if (kunde.Bettenanzahl > 0)
{
item.SubItems.Add(GetBewertung((double)ums.Betrag, (int)kunde.Bettenanzahl)[0].ToString("P2"));//UMSATZANTEIL
item.SubItems.Add(GetBewertung((double)ums.Betrag, (int)kunde.Bettenanzahl)[1].ToString("C2", CultureInfo.CurrentCulture));//KOSTENANTEIL
item.SubItems.Add(GetBewertung((double)ums.Betrag, (int)kunde.Bettenanzahl)[2].ToString("C2", CultureInfo.CurrentCulture));//UMSATZ/GAST
item.SubItems.Add(GetBewertung((double)ums.Betrag, (int)kunde.Bettenanzahl)[3].ToString("C2", CultureInfo.CurrentCulture));//BEWERTUNG IN EURO
}//BEWERTUNG IN ZAHLEN
else
{
item.SubItems.Add(leer.ToString("P2"));
item.SubItems.Add(leer.ToString("C2", CultureInfo.CurrentCulture));
item.SubItems.Add(leer.ToString("C2", CultureInfo.CurrentCulture));
item.SubItems.Add(leer.ToString("C2", CultureInfo.CurrentCulture));
item.SubItems.Add("Z");
}
if(kunde.Waescheart.Contains("Miet") && kunde.Waescheart != null)
{
if (GetBewertung((double)ums.Betrag, (int)kunde.Bettenanzahl)[3] < Kosten_Pro_Gast()[2] * -1) item.SubItems.Add("C");
if (GetBewertung((double)ums.Betrag, (int)kunde.Bettenanzahl)[3] < Kosten_Pro_Gast()[2] * -1 * 2) item.SubItems.Add("B");
if (GetBewertung((double)ums.Betrag, (int)kunde.Bettenanzahl)[3] > Kosten_Pro_Gast()[2] * -1 * 2) item.SubItems.Add("A");
}//BEWERTUNG IN WORTEN
else
{
if (GetBewertung((double)ums.Betrag, (int)kunde.Bettenanzahl)[3] < Kosten_Pro_Gast()[1] * -1) item.SubItems.Add("C");
if (GetBewertung((double)ums.Betrag, (int)kunde.Bettenanzahl)[3] < Kosten_Pro_Gast()[1] * -1 * 2) item.SubItems.Add("B");
if (GetBewertung((double)ums.Betrag, (int)kunde.Bettenanzahl)[3] > Kosten_Pro_Gast()[1] * -1 * 2) item.SubItems.Add("A");
}
if (ums.Betrag != 0)
{
this.listViewDeckungsbeitrag.Items.Add(item);
filterumsatz += ums.Betrag;
++itemsinlistview;
}
else if (!checkBox0ausblenden.Checked)
{
this.listViewDeckungsbeitrag.Items.Add(item);
++itemsinlistview;
}//ERGEBNIS 0 AUSBLENDEN VIA CHECKBOX
filterumsatz += Umsatz.GetUmsatz(ums.KundeID, dTPVergleich.Value.Year, ums.Year, null);
}
this.listViewDeckungsbeitrag.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
ListView.ColumnHeaderCollection cc = listViewDeckungsbeitrag.Columns;
for (int i = 0; i < cc.Count; i++)
{
int colWidth = TextRenderer.MeasureText(cc[i].Text, listViewDeckungsbeitrag.Font).Width + 10;
if (colWidth > cc[i].Width)
{
cc[i].Width = colWidth;
}
}//COLUMNS BREITE CONTENT ODER HEADER SIZE
this.listViewDeckungsbeitrag.AllowColumnReorder = true;
//ANFANG //STATUSSTRIP UND KOSTEN/GAST ANZEIGE
this.labelAbschGast.Text = (Kosten_Pro_Gast()[0] * -1).ToString("C2");
this.labelFixGastEW.Text = (Kosten_Pro_Gast()[1] * -1).ToString("C2");
this.labelFixGastMW.Text = (Kosten_Pro_Gast()[2] * -1).ToString("C2");
this.toolStripStatusLabelKundegef.Text = itemsinlistview.ToString();
this.toolStripStatusLabelGesamtbetten.Text = Gesamtbetten.ToString();
this.toolStripStatusLabelMietbetten.Text = Mietbetten.ToString();
this.toolStripStatusLabelGesamtumsatz.Text = gesamtumsatz.ToString("C2");
this.toolStripStatusLabelFilterumsatz.Text = filterumsatz.ToString("C2");
this.toolStripStatusLabelFilterumsatzVP.Text = filterumsatzVP.ToString("C2");
this.toolStripStatusLabelSteigerung.Text = ((filterumsatz - filterumsatzVP) / filterumsatz).ToString("P2");
//ENDE //STATUSSTRIP UND KOSTEN/GAST ANZEIGE
ListView_Design();
listViewDeckungsbeitrag.EndUpdate();
listViewDeckungsbeitrag.ResumeLayout();
}
private void ListView_Design()
{
foreach (ListViewItem item in this.listViewDeckungsbeitrag.Items)
{
if (item.Index % 2 == 0) item.BackColor = Color.LightSteelBlue;
else item.BackColor = Color.White;//BACKCOLOR FÜR JEDES ZWEITE AUF BLAU
for (int i = 0; i < item.SubItems.Count; i++)
{
if (item.SubItems[i].Text.Equals("C")) item.SubItems[i].BackColor = Color.Red;
else
{
if (item.SubItems[i].Text.Equals("B")) item.SubItems[i].BackColor = Color.Yellow;
else
{
if (item.SubItems[i].Text.Equals("A")) item.SubItems[i].BackColor = Color.Green;
else item.SubItems[i].BackColor = item.BackColor;
}
}
item.SubItems[i].Font = item.Font;
}//INDIVIDUELLE BACKCOLOR FÜR SUBITEMS
}
}
private double[] GetBewertung(double kndums, int betten)
{
double[] bewertung = new double[4];
bewertung[0] = kndums / gesamtumsatz; //UMSATZANTEIL
bewertung[1] = variablekosten * -1 * bewertung[0] / betten; //KOSTENANTEIL
bewertung[2] = kndums / betten; //UMSATZ/GAST
bewertung[3] = bewertung[2] - bewertung[1]; //BEWERTUNG IN EURO
return bewertung;
}
private double[] Kosten_Pro_Gast()
{
double[] kosten = new double[3];
kosten[0] = fixmietkosten / (double)Mietbetten; //ABSCHREIBUNG MIETWÄSCHE
kosten[1] = fixlohnkosten / (double)Gesamtbetten; //FIXGAST EIGENWÄSCHE
kosten[2] = kosten[0] + kosten[1]; //FIXGAST MIETWÄSCHE
return kosten;
}
private double[] Differenz_berechnen(double zahl1, double zahl2)
{
double[] diff = new double[2];
diff[0] = zahl1 - zahl2; //DIFFERENZ IN EUR
diff[1] = diff[0] / zahl1; //DIFFERENZ IN %
return diff;
}
private void listViewDeckungsbeitrag_ColumnClick(object sender, ColumnClickEventArgs e)
{
if (e.Column == lvwColumnSorter.SortColumn)
{
// Reverse the current sort direction for this column.
if (lvwColumnSorter.Order == SortOrder.Ascending) lvwColumnSorter.Order = SortOrder.Descending;
else lvwColumnSorter.Order = SortOrder.Ascending;
}
else
{
// Set the column number that is to be sorted; default to ascending.
lvwColumnSorter.SortColumn = e.Column;
lvwColumnSorter.Order = SortOrder.Ascending;
}
// Perform the sort with these new sort options.
this.listViewDeckungsbeitrag.Sort();
ListView_Design();
}
private void pictureBoxFilter_Click(object sender, EventArgs e)
{
if (filter == false)
{
filter = true;
this.groupBoxFilter.Height = 100;
}//CLICK AUF FILTERPFEIL
else
{
filter = false;
this.groupBoxFilter.Height = 20;
}
foreach (string region in Kunde.GetListSelection(1)) this.comboBoxregion.Items.Add(region); //COMBOBOX REGION BEFÜLLEN
foreach (string art in Kunde.GetListSelection(2)) this.comboBoxwaescheart.Items.Add(art); //COMBOBOX WÄSCHEART BEFÜLLEN
}
private void buttonOK_Click(object sender, EventArgs e)
{
if (dTPMonat.Checked)
{
months = new int[1];
months[0] = dTPMonat.Value.Month;
}
else months = null;//FILTER NACH MONAT
if (dTPJahr.Checked) year = dTPJahr.Value.Year;//FILTER NACH JAHR
if (comboBoxregion.SelectedIndex >= 0)
{
selection = new string[2];
selection[0] = comboBoxregion.Name.Substring(8);
selection[1] = comboBoxregion.SelectedItem.ToString();
}//FILTER NACH REGION
if (comboBoxwaescheart.SelectedIndex >= 0)
{
selection = new string[2];
selection[0] = comboBoxwaescheart.Name.Substring(8);
selection[1] = comboBoxwaescheart.SelectedItem.ToString();
}//FILTER NACH WÄSCHEART (MIETE, LOHN)
if (checkBox1.Checked)
{
months = new int[2];
months[0] = 1;
months[1] = 3;
}//QUARTAL 1 GEWÄHLT
if (checkBox2.Checked)
{
months = new int[2];
months[0] = 4;
months[1] = 6;
}//QUARTAL 2 GEWÄHLT
if (checkBox3.Checked)
{
months = new int[2];
months[0] = 7;
months[1] = 9;
}//QUARTAL 3 GEWÄHLT
if (checkBox4.Checked)
{
months = new int[2];
months[0] = 10;
months[1] = 12;
}//QUARTAL 4 GEWÄHLT
if (comboBoxregion.SelectedIndex >= 0 && comboBoxwaescheart.SelectedIndex >= 0)
{
Array.Resize<string>(ref selection, 4);
selection[0] = comboBoxregion.Name.Substring(8);
selection[1] = comboBoxregion.SelectedItem.ToString();
selection[2] = comboBoxwaescheart.Name.Substring(8);
selection[3] = comboBoxwaescheart.SelectedItem.ToString();
}//BEIDE SELECTIONS AUSGEWÄHLT!!
if (!string.IsNullOrEmpty(textBoxkunde_nr.Text)) //FITERN NACH KUNDENNUMMER
if (kunde.CheckKndNr(textBoxkunde_nr.Text) != 0) id = kunde.CheckKndNr(textBoxkunde_nr.Text);
getUmsatz();
getKosten();
Lade_ListView();
}
private void getUmsatz()
{
umsatzliste = Umsatz.GetList(id, year, months, order, selection, filter);
gesamtumsatz = Umsatz.GetUmsatz(null, year, null, months);
}
private void getKosten()
{
fixlohnkosten = Kosten.GetKosten(year, months, 0);
variablekosten = Kosten.GetKosten(year, months, 1);
fixmietkosten = Kosten.GetKosten(year, months, 2);
}
private void buttonFilterCl_Click(object sender, EventArgs e)
{
foreach (Control ctl in this.groupBoxFilter.Controls)
{
Type t = ctl.GetType();
if(t == typeof(ComboBox))
{
ComboBox cb = (ComboBox)ctl;
cb.SelectedIndex = -1;
}
if(t == typeof(TextBox))
{
TextBox tb = (TextBox)ctl;
tb.Clear();
}
if(t == typeof(DateTimePicker))
{
DateTimePicker dtp = (DateTimePicker)ctl;
if(dtp.Name == "dTPMonat")dtp.Checked = false;
months = null;
}
if(t == typeof(CheckBox))
{
CheckBox chb = (CheckBox)ctl;
chb.Checked = false;
}
}
foreach (Control ctl in this.groupBoxQuartal.Controls)
{
Type t = ctl.GetType();
if (t == typeof(ComboBox))
{
ComboBox cb = (ComboBox)ctl;
cb.SelectedIndex = -1;
}
if (t == typeof(TextBox))
{
TextBox tb = (TextBox)ctl;
tb.Clear();
}
if (t == typeof(DateTimePicker))
{
DateTimePicker dtp = (DateTimePicker)ctl;
if (dtp.Name == "dTPMonat") dtp.Checked = false;
months = null;
}
if (t == typeof(CheckBox))
{
CheckBox chb = (CheckBox)ctl;
chb.Checked = false;
}
}
foreach (Control ctl in this.groupBoxBettenanzahl.Controls)
{
Type t = ctl.GetType();
if (t == typeof(ComboBox))
{
ComboBox cb = (ComboBox)ctl;
cb.SelectedIndex = -1;
}
if (t == typeof(TextBox))
{
TextBox tb = (TextBox)ctl;
tb.Clear();
}
if (t == typeof(DateTimePicker))
{
DateTimePicker dtp = (DateTimePicker)ctl;
if (dtp.Name == "dTPMonat") dtp.Checked = false;
months = null;
}
if (t == typeof(CheckBox))
{
CheckBox chb = (CheckBox)ctl;
chb.Checked = false;
}
}
foreach (Control ctl in this.groupBoxUmsatzZeit.Controls)
{
Type t = ctl.GetType();
if (t == typeof(ComboBox))
{
ComboBox cb = (ComboBox)ctl;
cb.SelectedIndex = -1;
}
if (t == typeof(TextBox))
{
TextBox tb = (TextBox)ctl;
tb.Clear();
}
if (t == typeof(DateTimePicker))
{
DateTimePicker dtp = (DateTimePicker)ctl;
if (dtp.Name == "dTPMonat") dtp.Checked = false;
months = null;
}
if (t == typeof(CheckBox))
{
CheckBox chb = (CheckBox)ctl;
chb.Checked = false;
}
}
}
private void checkBox0ausblenden_Click(object sender, EventArgs e)
{
Lade_ListView();
}
private void dTPJahr_ValueChanged(object sender, EventArgs e)
{
this.dTPVergleich.Value = dTPJahr.Value.AddYears(-1);
}//VERGLEICHSJAHR AUTOMATISCH MINUS 1 JAHR
}
}