Trello Implementiert, Unterbinden von 2 Instanzen, Unterbinden von Programstart nach Update.

This commit is contained in:
Kilian Wirl 2026-06-08 14:53:59 +02:00
parent 7e25ee150a
commit 32f6702d8f
37 changed files with 1594 additions and 605 deletions

View File

@ -54,6 +54,7 @@ namespace Deckungsbeitrag.AA_Forms
}
private void TextBoxText_Enter(object sender, EventArgs e)
{
this.textBoxText.Clear();
this.textBoxText.SelectAll();
}
@ -83,7 +84,7 @@ namespace Deckungsbeitrag.AA_Forms
{
MessageBox.Show("Bitte nur ganze Zahlen eingeben.", "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
e.Cancel = true;
this.textBoxText.SelectAll();
this.textBoxText.Clear();
}
}
else

View File

@ -252,7 +252,7 @@
this.comboBoxPriority.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.comboBoxPriority.FormattingEnabled = true;
this.comboBoxPriority.Location = new System.Drawing.Point(121, 249);
this.comboBoxPriority.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.comboBoxPriority.Margin = new System.Windows.Forms.Padding(4);
this.comboBoxPriority.Name = "comboBoxPriority";
this.comboBoxPriority.Size = new System.Drawing.Size(348, 37);
this.comboBoxPriority.TabIndex = 41;
@ -263,11 +263,12 @@
this.comboBoxFahrer.Font = new System.Drawing.Font("Microsoft Sans Serif", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.comboBoxFahrer.FormattingEnabled = true;
this.comboBoxFahrer.Location = new System.Drawing.Point(121, 192);
this.comboBoxFahrer.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.comboBoxFahrer.Margin = new System.Windows.Forms.Padding(4);
this.comboBoxFahrer.Name = "comboBoxFahrer";
this.comboBoxFahrer.Size = new System.Drawing.Size(348, 37);
this.comboBoxFahrer.TabIndex = 42;
this.comboBoxFahrer.SelectedValueChanged += new System.EventHandler(this.ComboBox_SelectedValueChanged);
this.comboBoxFahrer.Leave += new System.EventHandler(this.ComboBoxFahrer_Leave);
//
// pictureBoxDirtMinus
//
@ -353,7 +354,7 @@
this.oLVArtikel.GridLines = true;
this.oLVArtikel.HideSelection = false;
this.oLVArtikel.Location = new System.Drawing.Point(493, 78);
this.oLVArtikel.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.oLVArtikel.Margin = new System.Windows.Forms.Padding(4);
this.oLVArtikel.Name = "oLVArtikel";
this.oLVArtikel.ShowImagesOnSubItems = true;
this.oLVArtikel.Size = new System.Drawing.Size(601, 521);
@ -375,7 +376,7 @@
this.buttonKundeInfo.Font = new System.Drawing.Font("Microsoft Sans Serif", 15.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.buttonKundeInfo.ForeColor = System.Drawing.Color.White;
this.buttonKundeInfo.Location = new System.Drawing.Point(21, 620);
this.buttonKundeInfo.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4);
this.buttonKundeInfo.Margin = new System.Windows.Forms.Padding(4);
this.buttonKundeInfo.MinimumSize = new System.Drawing.Size(51, 50);
this.buttonKundeInfo.Name = "buttonKundeInfo";
this.buttonKundeInfo.Size = new System.Drawing.Size(51, 50);

View File

@ -35,6 +35,8 @@ namespace Deckungsbeitrag
bool etikettgedruckt = false;
bool zahlenChanged = false;
bool infoOpen = false;
private Saison saison = Saison.GetAktivSaison();
//WENN AUFTRAG SPEICHERN
@ -83,7 +85,6 @@ namespace Deckungsbeitrag
this.auftrag = auftrag;
this.benutzer = benutzer;
}
public FormAuftragDetail(Auftrag auftrag, Benutzer benutzer, List<KundeArtikel> kndartListe) : this(auftrag, benutzer)
{
this.kndartListe = kndartListe;
@ -101,8 +102,10 @@ namespace Deckungsbeitrag
this.labelContainer.Text = auftrag.ContainerClean.ToString();
this.labelContDirt.Text = auftrag.Container.ToString();
this.textBoxZusatz.Text = $"{auftrag.ZusatzInfo}\n{this.kunde.Anmerkung}\n{Aufgabe.GetAufgabe(null, this.kunde.Aufgabe).Bezeichnung}";
if (auftrag.Fahrer == null) this.comboBoxFahrer.SelectedIndex = -1;
else this.comboBoxFahrer.SelectedValue = auftrag.Fahrer;
//if (auftrag.Fahrer == null) this.comboBoxFahrer.SelectedIndex = -1;
//else this.comboBoxFahrer.SelectedValue = auftrag.Fahrer;
if (auftrag.TourID == null) this.comboBoxFahrer.SelectedIndex = -1;
else this.comboBoxFahrer.SelectedValue = auftrag.TourID;
this.comboBoxPriority.SelectedItem = auftrag.Priority;
// Events nach dem Laden der Daten wieder den ComboBoxen zuweisen.
@ -113,15 +116,16 @@ namespace Deckungsbeitrag
{
case AuftragTyp.Inventur:
{
if (this.auftrag.Status == AuftragStatus.Herrichten) Load_OLV();
else
{
if (this.auftrag.Status == AuftragStatus.Warten)
{
buttonFertig.Visible = false; //TODO: Speichern der Inventur prüfen wenn Button nicht Visible ist.
Load_UCInventur(this.auftrag);
}
}
Load_OLV();
//if (this.auftrag.Status == AuftragStatus.Herrichten) Load_OLV();
//else
//{
// if (this.auftrag.Status == AuftragStatus.Warten)
// {
// buttonFertig.Visible = false; //TODO: Speichern der Inventur prüfen wenn Button nicht Visible ist.
// Load_UCInventur(this.auftrag);
// }
//}
}
break;
case AuftragTyp.SOLL_Erhoehung: Load_OLV();
@ -210,9 +214,14 @@ namespace Deckungsbeitrag
this.comboBoxFahrer.SelectedValueChanged -= ComboBox_SelectedValueChanged;
this.comboBoxPriority.SelectedValueChanged -= ComboBox_SelectedValueChanged;
List<Benutzer> benutzerliste = Benutzer.GetFahrerList();
this.comboBoxFahrer.DataSource = benutzerliste;
this.comboBoxFahrer.ValueMember = "BenutzerName";
List<Tour> liste = Tour.GetSaisonListe(saison);
this.comboBoxFahrer.DataSource = liste;
this.comboBoxFahrer.DisplayMember = "Bezeichnung";
this.comboBoxFahrer.ValueMember = "TourID";
//List<Benutzer> benutzerliste = Benutzer.GetFahrerList();
//this.comboBoxFahrer.DataSource = benutzerliste;
//this.comboBoxFahrer.ValueMember = "BenutzerName";
this.comboBoxPriority.DataSource = Enum.GetValues(typeof(Priority));
}
@ -232,7 +241,8 @@ namespace Deckungsbeitrag
auftrag.Liefertag = dTPLiefertag.Value;
auftrag.ContainerClean = int.Parse(this.labelContainer.Text);
auftrag.Container = int.Parse(this.labelContDirt.Text);
auftrag.ArbeiterID = this.comboBoxFahrer.SelectedIndex == -1 ? null : ((Benutzer)this.comboBoxFahrer.SelectedItem).BenutzerID;
//auftrag.ArbeiterID = this.comboBoxFahrer.SelectedIndex == -1 ? null : ((Benutzer)this.comboBoxFahrer.SelectedItem).BenutzerID;
auftrag.TourID = this.comboBoxFahrer.SelectedIndex == -1 ? null : (int?)this.comboBoxFahrer.SelectedValue;
auftrag.Priority = this.comboBoxPriority.SelectedIndex == -1 ? Priority.None : ((Priority)this.comboBoxPriority.SelectedItem);
auftrag.ZusatzInfo = this.textBoxZusatz.Text;
auftrag.Save();
@ -251,15 +261,15 @@ namespace Deckungsbeitrag
{
KundeArtikel kndart = KundeArtikel.GetItem(kvp.Key);
if (kndart.Korrektur > 0 & kvp.Value[3] > 0)
if (kndart.Korrektur > 0)
{
kndart.Korrektur -= kvp.Value[3];
kndart.KorrekturBearbeitet = this.benutzer.BenutzerName + " am " + DateTime.Now.ToString();
}
kndart.Save();
}
goto default;
}
break;
case AuftragTyp.SOLL_Verminderung:
{
foreach (var kvp in dictionary)
@ -420,6 +430,11 @@ namespace Deckungsbeitrag
//AUFTRAG ABSCHLIESSEN
private void ButtonFertig_Click(object sender, EventArgs e)
{
if (!this.dTPLiefertag.Checked)
{
MessageBox.Show("Liefertag muss ausgewählt und angehakt werden.", "FEHLER", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (this.kndartListe != null)
{
foreach (OLVListItem item in this.oLVArtikel.Items)
@ -527,7 +542,11 @@ namespace Deckungsbeitrag
this.DialogResult = DialogResult.OK;
this.Close();
}
else this.Close();
else
{
this.DialogResult = DialogResult.OK;
this.Close();
}
}
@ -869,6 +888,13 @@ namespace Deckungsbeitrag
}
e.Cancel = true;
}
private void ComboBoxFahrer_Leave(object sender, EventArgs e)
{
if (this.comboBoxFahrer.SelectedIndex == -1) return;
Tour tour = Tour.FindeTour((int?)this.comboBoxFahrer.SelectedValue, null, null);
this.comboBoxPriority.SelectedItem = tour.Priority;
}
}
}
//CHANGES: 1. Es wird ab sofort nur ein Button zum Speichern und Abschließen bereitgestellt. System entscheidet was getan wird.

File diff suppressed because it is too large Load Diff

View File

@ -11,6 +11,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using TrelloIntegration;
namespace Deckungsbeitrag
{
@ -232,5 +233,14 @@ namespace Deckungsbeitrag
if (MessageBox.Show("Möchtest du die Änderungen verwerfen?", "Frage", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) this.Close();
else return;
}
private void buttonSaveCredentials_Click(object sender, EventArgs e)
{
TrelloConfig.CreateEncryptedConfigValues(
textBoxApiKey.Text,
textBoxToken.Text);
MessageBox.Show("Verschlüsselte Werte wurden in der Console ausgegeben.");
}
}
}

View File

@ -444,6 +444,7 @@
//
// objectListViewSonder
//
this.objectListViewSonder.AllowColumnReorder = true;
this.objectListViewSonder.AlternateRowBackColor = System.Drawing.Color.LightBlue;
this.objectListViewSonder.CellEditActivation = BrightIdeasSoftware.ObjectListView.CellEditActivateMode.DoubleClick;
this.objectListViewSonder.CellEditUseWholeCell = false;

View File

@ -22,6 +22,7 @@ using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Forms.DataVisualization.Charting;
using System.Xml.Resolvers;
using TrelloIntegration;
using ZXing;
namespace Deckungsbeitrag
@ -65,6 +66,8 @@ namespace Deckungsbeitrag
private List<View_Auftrag_Expedit> listVorbereitet;
private List<View_Auftrag_Expedit> listSonderAuftrag;
private List<View_Auftrag_Expedit> listRampe;
public TrelloCardClient _trelloClient;
private bool TrelloKarte = true;
#endregion
public FormExpedit(Benutzer benutzer)
{
@ -95,8 +98,12 @@ namespace Deckungsbeitrag
this.SuspendLayout();
_settings.Load();
if (TrelloConfig.HasCredentials())
{
var apiKey = TrelloConfig.GetApiKey();
var token = TrelloConfig.GetToken();
_trelloClient = new TrelloCardClient(apiKey, token);
}
UCFeedback fb = new UCFeedback(this.benutzer);
this.Controls.Add(fb);
@ -137,7 +144,13 @@ namespace Deckungsbeitrag
}
private void FormExpedit_FormClosing(object sender, FormClosingEventArgs e)
{
// === SPEICHERN DES OLV-STATUS ===
_settings.OLV_State = this.objectListViewAuftrag.SaveState();
_settings.OLV_Rampe_State = this.objectListViewRampe.SaveState();
_settings.OLV_Geschaeft_State = this.objectListViewGeschaeft.SaveState();
_settings.OLV_Sonder_State = this.objectListViewSonder.SaveState();
_settings.OLV_Vorbereitet_State = this.objectListViewVorbereitet.SaveState();
_settings.Save();
}
private void FormExpedit_Resize(object sender, EventArgs e)
@ -228,8 +241,8 @@ namespace Deckungsbeitrag
if (fahrer != null)
{
List<Auftrag> auftragliste = Auftrag.GetTourenListe(fahrer);
if (auftragliste.Count > 0) Funktionen.TourenListe_Drucken(auftragliste, fahrer, this, this.benutzer);
//List<Auftrag> auftragliste = Auftrag.GetTourenListe(fahrer);
//if (auftragliste.Count > 0) Funktionen.TourenListe_Drucken(auftragliste, fahrer, this, this.benutzer);
}
}
@ -268,6 +281,7 @@ namespace Deckungsbeitrag
if (olv.SelectedItem != null)
{
TrelloKarte = true;
int idx = col.Index;
olv.StartCellEdit(olv.SelectedItem, idx);
}
@ -412,6 +426,13 @@ namespace Deckungsbeitrag
// === SPALTEN JE NACH TAB/ROLLE ===
GetUnvisibleColumns(olv);
// === RESTORE OLV-STATUS ===
if (olv.Name.Contains("Auftrag")) this.objectListViewAuftrag.RestoreState(_settings.OLV_State);
if (olv.Name.Contains("Rampe")) this.objectListViewRampe.RestoreState(_settings.OLV_Rampe_State);
if (olv.Name.Contains("Vorbereitet")) this.objectListViewVorbereitet.RestoreState(_settings.OLV_Vorbereitet_State);
if (olv.Name.Contains("Sonder")) this.objectListViewSonder.RestoreState(_settings.OLV_Sonder_State);
if (olv.Name.Contains("Geschaeft")) this.objectListViewGeschaeft.RestoreState(_settings.OLV_Geschaeft_State);
// === SPALTENBREITE ANPASSEN ===
olv = Funktionen.Columns_Resize(null, olv).olv;
@ -516,7 +537,6 @@ namespace Deckungsbeitrag
default:
break;
}
}
}
private void Olv_CellToolTipShowing(object sender, ToolTipShowingEventArgs e)
@ -694,7 +714,11 @@ namespace Deckungsbeitrag
if (_auftrag == null) return;
FormKundeVW kndVW = new FormKundeVW(_kunde, this.benutzer);
kndVW.ShowDialog();
if (kndVW.ShowDialog() == DialogResult.OK)
{
if (kndVW.aufgabeErledigt) Aufgabe_erledigt(_auftrag, _kunde, _kunde.Suchtext ?? _kunde.KundeName);
}
return;
}
else
@ -870,20 +894,43 @@ namespace Deckungsbeitrag
if (meldung.GetAchtung(this, text, false) == DialogResult.No) return;
else
{
Kunde _kunde = Kunde.GetKunde(null, this.auftrag.KundeID, null);
string name;
if (string.IsNullOrWhiteSpace(_kunde.Suchtext)) name = _kunde.KundeName;
else name = _kunde.Suchtext;
this.auftrag.Erledigt = DateTime.Now;
this.auftrag.ErledigtVon = (int)this.benutzer.BenutzerID;
Aufgabe_erledigt(this.auftrag, _kunde, name);
}
}
if (this.auftrag.Typ < AuftragTyp.Inventur || (this.auftrag.Typ >= AuftragTyp.Inventur && this.auftrag.ContainerClean > 0))
{
var rslt = DialogResult.None;
PrepareContainerCleanForEtikett();
var result = Funktionen.Etikett_Drucken(auftrag, nocont);
if (result == DialogResult.OK)
if (this.auftrag.ContainerClean == 0)
{
this.auftrag.Gedruckt = DateTime.Now;
this.auftrag.GedrucktVon = (int)this.benutzer.BenutzerID;
rslt = MessageBox.Show("Der Auftrag hat 0 saubere Container. Möchtest du ein Etikett drucken?", "FRAGE", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
}
switch (rslt)
{
case DialogResult.Cancel:
return;
case DialogResult.Yes:
goto default;
case DialogResult.No:
break;
default:
var result = Funktionen.Etikett_Drucken(auftrag, nocont);
if (result == DialogResult.OK)
{
this.auftrag.Gedruckt = DateTime.Now;
this.auftrag.GedrucktVon = (int)this.benutzer.BenutzerID;
}
break;
}
}
@ -993,8 +1040,8 @@ namespace Deckungsbeitrag
//Für FrotteeExpedit Etiketten drucken ausblenden.
if (this.benutzer.Rolle == BenutzerRolle.Frottee) if (col.Text == "Etikett" & col.IsButton) col.IsVisible = false;
}
olv.RebuildColumns();
}
@ -1003,7 +1050,7 @@ namespace Deckungsbeitrag
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ObjectListViewAuftrag_CellEditFinished(object sender, CellEditEventArgs e)
private async void ObjectListViewAuftrag_CellEditFinished(object sender, CellEditEventArgs e)
{
ObjectListView olv = (ObjectListView)sender;
this.auftrag = Auftrag.GetAuftrag(((View_Auftrag_Expedit)e.RowObject).AuftragID);
@ -1052,6 +1099,61 @@ namespace Deckungsbeitrag
{
if (int.TryParse(e.NewValue.ToString(), out int i)) this.auftrag.Container = i;
else return;
}
break;
case var t when t == "Liefertag":
{
if (this.benutzer.Rolle == BenutzerRolle.Verwaltung || this.benutzer.Rolle == BenutzerRolle.Admin)
{
if (!TrelloKarte) return;
if (_trelloClient == null)
{
MessageBox.Show("Bitte zuerst Credentials speichern.", "Fehler",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
if (MessageBox.Show("Möchtest du eine Trello-Karte für die Änderung erstellen?", "FRAGE", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) { TrelloKarte = false; goto default; }
try
{
DateTime oldDate = DateTime.Parse(e.Value.ToString());
DateTime newDate = DateTime.Parse(e.NewValue.ToString());
Benutzer _fahrer = Benutzer.GetBenutzer(null, this.auftrag.ErstelltVon);
Kunde _kunde = Kunde.GetKunde(null, this.auftrag.KundeID, null);
string kndName = _kunde.KundeName?? _kunde.Suchtext;
// Wenn kein Fahrer hinterlegt oder keine Tour(Trello-Listen-ID) beim Fahrer wird die Allgmeine-Listen_ID verwendet.
string listID = _fahrer?.Tour?? "69cf1a3adfbfd598e8d98be9";
this.auftrag.Liefertag = newDate;
var options = new CreateCardOptions
{
Name = $"Der Liefertag von {kndName} wurde von {oldDate.Date:d} zu {newDate.Date:d} verschoben.",
Desc = "Diese Karte wurde automatisch erstellt. Bitte gegebenenfalls korrigieren.",
IdList = $"{listID}",
Pos = "top",
DueDate = newDate
};
var card = _trelloClient.CreateCardAndParseAsync(options);
TrelloKarte = false;
//MessageBox.Show(
// $"Karte erstellt:\nID: {card.Id}\nName: {card.Name}\nURL: {card.ShortUrl}",
// "Erfolg",
// MessageBoxButtons.OK,
// MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show($"Fehler beim Erstellen der Karte:\n{ex.Message}", "Fehler",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
else goto default;
}
break;
@ -1414,7 +1516,7 @@ namespace Deckungsbeitrag
Status = AuftragStatus.Vorbereitet,
};
_auftrag.Save();
FormAuftragDetail detail = new FormAuftragDetail(_auftrag, this.benutzer, kndartListe);
detail.Show();
@ -1426,7 +1528,8 @@ namespace Deckungsbeitrag
}
}
}
//TODO: Lösung zum Löschen von Aufträgen überlegen. (Kevin fragen)
//DONE: Lösung zum Löschen von Aufträgen überlegen. (Kevin fragen)
//CHANGES: Trello-Karte nach Liefertagänderung kann von Admin oder Verwaltung erstellt werden.
//CHANGES: Im Tab Vorbereitet wird beim Ändern der sauberen Containeranzahl gefragt ob die Etiketten neu gedruckt werden sollen.
//CHANGES: Im Tab Rampe wird bei DoppelClick der Auftrag als gewaschen markiert und im Tab Aufträge heute sichtbar.
//CHANGES: Wenn ein anderer Fahrer ausgewählt wird, wird auch die Priority laut dem Fahrer geändert.

View File

@ -22,6 +22,7 @@ namespace Deckungsbeitrag
{
public partial class FormFehlmengeCount : Form
{
int[] artZahl = new int[8];
private FilterInfoCollection videoDevices;
Kunde kunde;
Auftrag auftrag;
@ -310,7 +311,7 @@ namespace Deckungsbeitrag
}
}
int i = 0;
// Button mit Tag bearbeiten. Buttons ohne Tag werden deaktiviert.
foreach(Button btn in this.tableLayoutPanelArtikel.Controls)
{
@ -319,11 +320,12 @@ namespace Deckungsbeitrag
{
KundeArtikel art = (KundeArtikel)btn.Tag;
int index = art.ArtikelName.IndexOf(" ");
btn.Text = art.ArtikelName;
btn.Text = art.ArtikelName + "\n" + artZahl[i].ToString();
btn.Font = new Font(btn.Font.Name, 18);
btn.BackColor = Color.Turquoise;
btn.Enabled = true;
}
i++;
}
}
@ -342,6 +344,8 @@ namespace Deckungsbeitrag
};
this.groupBoxArtikel.Controls.Add(flowPanel);
artZahl = new int[artikelListe.Count];
int i = 0;
foreach (KundeArtikel artikel in artikelListe)
{
int index = artikel.ArtikelName.IndexOf(" ");
@ -350,9 +354,9 @@ namespace Deckungsbeitrag
else name = artikel.ArtikelName;
Button btn = new Button
{
Text = name,
Text = name + "\n" + artZahl[i].ToString(),
Tag = artikel,
Name = $"btn_{artikel.ArtikelNR}",
Name = $"buttonArt{i + 1}",
AutoSize = true,
Margin = new Padding(0),
BackColor = Color.Turquoise,
@ -363,6 +367,7 @@ namespace Deckungsbeitrag
btn.MouseDown += Button_MouseDown;
flowPanel.Controls.Add(btn);
i++;
}
int buttons = flowPanel.Controls.OfType<Button>().Count();
@ -571,7 +576,7 @@ namespace Deckungsbeitrag
}
if ((userid != null && userid.Contains("reklamation")) || (this.benutzer != null && this.benutzer.Rolle == BenutzerRolle.Expedit) || (this.benutzer != null && this.benutzer.Rolle == BenutzerRolle.Frottee))
{
{
artnw.Reklamation++;
kndart.Reklamation++;
if (auftragDictionary.TryGetValue((int)kndart.KundeArtikelID, out int val))
@ -579,13 +584,27 @@ namespace Deckungsbeitrag
auftragDictionary[(int)kndart.KundeArtikelID] = kndart.Reklamation;
}
else auftragDictionary.Add((int)kndart.KundeArtikelID, kndart.Reklamation);
}
else { kndart.Fehlmenge++; artnw.Nachwaesche++; }
else
{
kndart.Fehlmenge++;
artnw.Nachwaesche++;
}
// Session NW oder Rekl Zahlen werden angezeigt
if (int.TryParse(btn.Name.Substring(9, 1), out int x)) artZahl[x - 1]++;
btn.Text = AktualisiereButtonText(btn.Text, artZahl[x - 1]);
// Wenn speichern nicht möglich, wird darauf hingewiesen.
if (kndart.Save() != 1 || artnw.Save() != 1) meldung.FehlmengeCount();
}
private string AktualisiereButtonText(string button, int zahl)
{
int index = button.LastIndexOf('\n');
button = button.Substring(0, index + 1) + $"{zahl}";
return button;
}
}
}
//DONE: Wenn Frottee-Expedit auch Reklamation bearbeitet, muss BenutzerRolle abgefragt werden. siehe CHANGES.

View File

@ -3,6 +3,7 @@ using BrightIdeasSoftware;
using DatenDB;
using Deckungsbeitrag.AA_Forms;
using Deckungsbeitrag.AA_Klassen;
using Deckungsbeitrag.UserControls;
using Spire.Barcode;
using System;
using System.Collections.Generic;
@ -35,6 +36,7 @@ namespace Deckungsbeitrag
int beforeedit = 0;
private bool formloading = false;
private DataGridView.HitTestInfo _hitInfo;
public bool aufgabeErledigt = false;
public bool _tosave = false;
private bool _tosaveInventur = false;
public bool TosaveInventur
@ -89,6 +91,7 @@ namespace Deckungsbeitrag
this.labelAnzahlChars.Location = new Point(this.textBoxAnmerkung.Right - this.labelAnzahlChars.Width, this.labelAnzahlChars.Location.Y);
this.tabControlKunde.Location = new Point(this.textBoxAnmerkung.Right + 10, 11);
this.tabControlKunde.TabPages.Remove(tabPageArtikel);
ComboBox_Laden();
@ -151,47 +154,48 @@ namespace Deckungsbeitrag
//kundeid ist falls bereits ein Stand existiert und die Artikel gespeichert wurden.
string kundeid = this.kunde.KundeID.ToString();
// Wenn bereits ein Stand gespeichert ist, kommt er aus der DB. Wenn kein Stand gespeichert kommt Liste aus Sortiment.
if (KundeArtikel.GetList(kundeid).Count > 0)
{
this.standListe = KundeArtikel.GetList(kundeid);
if (this.standListe[0].ArtikelID == null || this.standListe[0].Reihung == 0)
{
CompareToSortiment();
}
Load_Gridview(this.standListe);
}
else
{
//Jedes Innsbrucker Soziale Dienste Sortiment ist gleich.
if (this.kunde.KundeNummer == "010069" | this.kunde.KundeNummer == "010071") sortNr = "010068";
else sortNr = this.kunde.KundeNummer;
// Wenn bereits ein Stand gespeichert ist, kommt er aus der DB. Wenn kein Stand gespeichert kommt Liste aus Sortiment.
//if (KundeArtikel.GetList(kundeid).Count > 0)
//{
// this.standListe = KundeArtikel.GetList(kundeid);
// if (this.standListe[0].ArtikelID == null || this.standListe[0].Reihung == 0)
// {
// CompareToSortiment();
// }
// Load_Gridview(this.standListe);
//Sortiment holen und Standliste filtern.
standListe = new List<KundeArtikel>();
int reihung = 1;
foreach(Sortiment sort in sortimentListe.FindAll(Sortiment => Sortiment.KundeNummer == sortNr))
{
if (sort.ArtName.Contains("*EK")) continue;
KundeArtikel item = new KundeArtikel
{
ArtikelNR = sort.ArtNr,
ArtikelName = sort.ArtName,
KundeID = Kunde.GetKundeID(sort.KundeNummer, null),
ArtikelID = Artikel.GetArtikelID(sort.ArtNr),
Reihung = reihung
};
standListe.Add(item);
//}
//else
//{
// //Jedes Innsbrucker Soziale Dienste Sortiment ist gleich.
// if (this.kunde.KundeNummer == "010069" | this.kunde.KundeNummer == "010071") sortNr = "010068";
// else sortNr = this.kunde.KundeNummer;
reihung++;
}
if (standListe.Count == 0) this.tabControlKunde.Controls.Remove(tabPageArtikel);
standListe = standListe.OrderBy(x => x.Reihung).ToList();
// //Sortiment holen und Standliste filtern.
// standListe = new List<KundeArtikel>();
// int reihung = 1;
// foreach (Sortiment sort in sortimentListe.FindAll(Sortiment => Sortiment.KundeNummer == sortNr))
// {
// if (sort.ArtName.Contains("*EK")) continue;
// KundeArtikel item = new KundeArtikel
// {
// ArtikelNR = sort.ArtNr,
// ArtikelName = sort.ArtName,
// KundeID = Kunde.GetKundeID(sort.KundeNummer, null),
// ArtikelID = Artikel.GetArtikelID(sort.ArtNr),
// Reihung = reihung
// };
// standListe.Add(item);
//GridView mit der jeweiligen Liste füllen.
Load_Gridview(standListe);
}
// reihung++;
// }
// if (standListe.Count == 0) this.tabControlKunde.Controls.Remove(tabPageArtikel);
// standListe = standListe.OrderBy(x => x.Reihung).ToList();
// //GridView mit der jeweiligen Liste füllen.
// Load_Gridview(standListe);
//}
// QR-Code wird erstellt
BarcodeWriter code = new BarcodeWriter
@ -980,23 +984,69 @@ namespace Deckungsbeitrag
}
private void ButtonFreigeben_Click(object sender, EventArgs e)
{
Aufgabe _aufgabe = Aufgabe.GetAufgabe(null, this.kunde.Aufgabe);
string savePath = Path.Combine(ConfigurationManager.AppSettings["DateiSavePfad"], "Listen\\Inventuren") ?? "Inventuren";
if (ConfigurationManager.AppSettings["ConnectionString"].Split(';')[4].Split('=')[1] == "Test_Wirl") savePath = Path.Combine(ConfigurationManager.AppSettings["DateiSavePfad"], "Test\\Inventuren") ?? "Inventuren";
string delPath = Path.Combine(savePath, $"Warten-{this.kunde.KundeNummer}.csv");
SaveInventurToCSV("Speichern", null);
// Überprüfen ob die Datei existiert.
if (File.Exists(delPath))
{
// Wenn gespeichert wurde und die Datei existiert wird gefragt ob die Inventur abgeschlossen werden soll.
if (MessageBox.Show("Möchtest du die Inventur abschließen?", "FRAGE", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
// Wenn die Aufgabe INV enthält und AufgabeCount größer 0 ist, kann die Inventur nicht abgeschlossen werden.
if (_aufgabe.Bezeichnung != null && _aufgabe.Bezeichnung.Contains("INV") && this.kunde.AufgabeCount > 0)
{
if (this.kunde.AufgabeCount > 0)
{
if (MessageBox.Show("Es ist noch eine Aufgabe zu erledigen. Hast du diese gerade erledigt?", "FRAGE", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return;
}
else
{
aufgabeErledigt = true;
}
}
int auftragID = ErstelleInventurAuftrag();
SaveInventurToCSV("Abschließen", auftragID);
}
else
{
// Wenn nicht Abgeschlossen werden soll.
if (!((Aufgabe)comboBoxAufgabe.SelectedItem).Bezeichnung.Contains("INV") || numericUpDownAufgabeCount.Value == 0)
{
// Wenn die Aufgabe nicht INV enthält oder der Aufgaben-Zähler auf 0 steht, wird abgefragt ob noch Zahlen notwendig sind.
if (MessageBox.Show("Die Inventur wurde gespeichert. Brauchst du noch Zahlen von Expedit? Dann erstelle die Aufgabe mit der notwendigen Anzahl.", "FRAGE", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
return;
}
}
else
{
// Wenn alles passt wird gesucht ob ein Auftrag
List<Auftrag> _auftragListe = Auftrag.FindeAuftragVonKunde(this.kunde, string.Empty, "Inventur", dateTimePickerInventur.Value.Date);
if (_auftragListe.Count > 0)
{
int? i = this.kunde.AufgabeCount;
foreach (Auftrag _auftrag in _auftragListe)
{
if (i > 0)
{
_auftrag.AufgabeID = this.kunde.Aufgabe;
_auftrag.Save();
}
i--;
}
}
}
}
}
else
{
Program.AddFehler(this.benutzer, $"Inventur konnte nicht gesoeichert werden.", $"KundeNr: {this.kunde.KundeNummer} Liefertag: {dateTimePickerLiefertag}", null);
Program.AddFehler(this.benutzer, $"Inventur konnte nicht gespeichert werden.", $"KundeNr: {this.kunde.KundeNummer} Liefertag: {dateTimePickerLiefertag}", null);
MessageBox.Show("Die Inventur konnte nicht gespeichert werden. Der Fehler wurde gemeldet.", "FEHLER", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
TabControlKunde_SelectedIndexChanged(this.tabControlKunde, null);

View File

@ -153,7 +153,7 @@ namespace Deckungsbeitrag
this.textBoxKndNr.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.textBoxKndNr.Location = new System.Drawing.Point(13, 99);
this.textBoxKndNr.Name = "textBoxKndNr";
this.textBoxKndNr.Size = new System.Drawing.Size(102, 35);
this.textBoxKndNr.Size = new System.Drawing.Size(102, 30);
this.textBoxKndNr.TabIndex = 0;
//
// labelKundeNummer
@ -163,7 +163,7 @@ namespace Deckungsbeitrag
this.labelKundeNummer.ForeColor = System.Drawing.Color.White;
this.labelKundeNummer.Location = new System.Drawing.Point(9, 76);
this.labelKundeNummer.Name = "labelKundeNummer";
this.labelKundeNummer.Size = new System.Drawing.Size(105, 29);
this.labelKundeNummer.Size = new System.Drawing.Size(86, 25);
this.labelKundeNummer.TabIndex = 2;
this.labelKundeNummer.Text = "KND NR";
//
@ -174,7 +174,7 @@ namespace Deckungsbeitrag
this.labelKundeName.ForeColor = System.Drawing.Color.White;
this.labelKundeName.Location = new System.Drawing.Point(9, 128);
this.labelKundeName.Name = "labelKundeName";
this.labelKundeName.Size = new System.Drawing.Size(78, 29);
this.labelKundeName.Size = new System.Drawing.Size(64, 25);
this.labelKundeName.TabIndex = 3;
this.labelKundeName.Text = "Name";
//
@ -184,7 +184,7 @@ namespace Deckungsbeitrag
this.textBoxKundeName.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.textBoxKundeName.Location = new System.Drawing.Point(13, 151);
this.textBoxKundeName.Name = "textBoxKundeName";
this.textBoxKundeName.Size = new System.Drawing.Size(263, 35);
this.textBoxKundeName.Size = new System.Drawing.Size(263, 30);
this.textBoxKundeName.TabIndex = 4;
//
// textBoxStraße
@ -193,7 +193,7 @@ namespace Deckungsbeitrag
this.textBoxStraße.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.textBoxStraße.Location = new System.Drawing.Point(13, 255);
this.textBoxStraße.Name = "textBoxStraße";
this.textBoxStraße.Size = new System.Drawing.Size(352, 35);
this.textBoxStraße.Size = new System.Drawing.Size(352, 30);
this.textBoxStraße.TabIndex = 5;
//
// labelStraße
@ -203,7 +203,7 @@ namespace Deckungsbeitrag
this.labelStraße.ForeColor = System.Drawing.Color.White;
this.labelStraße.Location = new System.Drawing.Point(9, 232);
this.labelStraße.Name = "labelStraße";
this.labelStraße.Size = new System.Drawing.Size(141, 29);
this.labelStraße.Size = new System.Drawing.Size(116, 25);
this.labelStraße.TabIndex = 6;
this.labelStraße.Text = "Straße/HNr.";
//
@ -213,7 +213,7 @@ namespace Deckungsbeitrag
this.textBoxPLZ.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.textBoxPLZ.Location = new System.Drawing.Point(13, 307);
this.textBoxPLZ.Name = "textBoxPLZ";
this.textBoxPLZ.Size = new System.Drawing.Size(102, 35);
this.textBoxPLZ.Size = new System.Drawing.Size(102, 30);
this.textBoxPLZ.TabIndex = 9;
//
// labelPLZ
@ -223,7 +223,7 @@ namespace Deckungsbeitrag
this.labelPLZ.ForeColor = System.Drawing.Color.White;
this.labelPLZ.Location = new System.Drawing.Point(9, 284);
this.labelPLZ.Name = "labelPLZ";
this.labelPLZ.Size = new System.Drawing.Size(56, 29);
this.labelPLZ.Size = new System.Drawing.Size(48, 25);
this.labelPLZ.TabIndex = 10;
this.labelPLZ.Text = "PLZ";
//
@ -233,7 +233,7 @@ namespace Deckungsbeitrag
this.textBoxOrt.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.textBoxOrt.Location = new System.Drawing.Point(121, 307);
this.textBoxOrt.Name = "textBoxOrt";
this.textBoxOrt.Size = new System.Drawing.Size(244, 35);
this.textBoxOrt.Size = new System.Drawing.Size(244, 30);
this.textBoxOrt.TabIndex = 11;
//
// labelOrt
@ -243,7 +243,7 @@ namespace Deckungsbeitrag
this.labelOrt.ForeColor = System.Drawing.Color.White;
this.labelOrt.Location = new System.Drawing.Point(117, 284);
this.labelOrt.Name = "labelOrt";
this.labelOrt.Size = new System.Drawing.Size(46, 29);
this.labelOrt.Size = new System.Drawing.Size(39, 25);
this.labelOrt.TabIndex = 12;
this.labelOrt.Text = "Ort";
//
@ -254,7 +254,7 @@ namespace Deckungsbeitrag
this.labelKdnName2.ForeColor = System.Drawing.Color.White;
this.labelKdnName2.Location = new System.Drawing.Point(9, 180);
this.labelKdnName2.Name = "labelKdnName2";
this.labelKdnName2.Size = new System.Drawing.Size(147, 29);
this.labelKdnName2.Size = new System.Drawing.Size(123, 25);
this.labelKdnName2.TabIndex = 25;
this.labelKdnName2.Text = "NameZusatz";
//
@ -264,7 +264,7 @@ namespace Deckungsbeitrag
this.textBoxKndName2.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.textBoxKndName2.Location = new System.Drawing.Point(13, 203);
this.textBoxKndName2.Name = "textBoxKndName2";
this.textBoxKndName2.Size = new System.Drawing.Size(352, 35);
this.textBoxKndName2.Size = new System.Drawing.Size(352, 30);
this.textBoxKndName2.TabIndex = 26;
//
// buttonBewertung
@ -298,7 +298,7 @@ namespace Deckungsbeitrag
this.textBoxSuchtext.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.textBoxSuchtext.Location = new System.Drawing.Point(122, 99);
this.textBoxSuchtext.Name = "textBoxSuchtext";
this.textBoxSuchtext.Size = new System.Drawing.Size(154, 35);
this.textBoxSuchtext.Size = new System.Drawing.Size(154, 30);
this.textBoxSuchtext.TabIndex = 38;
//
// label1
@ -308,7 +308,7 @@ namespace Deckungsbeitrag
this.label1.ForeColor = System.Drawing.Color.White;
this.label1.Location = new System.Drawing.Point(118, 76);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(145, 29);
this.label1.Size = new System.Drawing.Size(122, 25);
this.label1.TabIndex = 39;
this.label1.Text = "SUCHTEXT";
//
@ -319,7 +319,7 @@ namespace Deckungsbeitrag
this.comboBoxAufgabe.FormattingEnabled = true;
this.comboBoxAufgabe.Location = new System.Drawing.Point(13, 498);
this.comboBoxAufgabe.Name = "comboBoxAufgabe";
this.comboBoxAufgabe.Size = new System.Drawing.Size(263, 37);
this.comboBoxAufgabe.Size = new System.Drawing.Size(263, 33);
this.comboBoxAufgabe.TabIndex = 41;
this.comboBoxAufgabe.SelectedIndexChanged += new System.EventHandler(this.ComboBoxAufgabe_SelectedIndexChanged);
this.comboBoxAufgabe.DropDownClosed += new System.EventHandler(this.ComboBoxAufgabe_DropDownClosed);
@ -331,7 +331,7 @@ namespace Deckungsbeitrag
this.label2.ForeColor = System.Drawing.Color.White;
this.label2.Location = new System.Drawing.Point(9, 475);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(183, 29);
this.label2.Size = new System.Drawing.Size(152, 25);
this.label2.TabIndex = 42;
this.label2.Text = "Kundenaufgabe";
//
@ -341,14 +341,14 @@ namespace Deckungsbeitrag
this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.nächsterKundeToolStripMenuItem});
this.contextMenuStrip1.Name = "contextMenuStrip1";
this.contextMenuStrip1.Size = new System.Drawing.Size(250, 36);
this.contextMenuStrip1.Size = new System.Drawing.Size(217, 28);
//
// nächsterKundeToolStripMenuItem
//
this.nächsterKundeToolStripMenuItem.Name = "nächsterKundeToolStripMenuItem";
this.nächsterKundeToolStripMenuItem.ShortcutKeyDisplayString = "[F9]";
this.nächsterKundeToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.F9;
this.nächsterKundeToolStripMenuItem.Size = new System.Drawing.Size(249, 32);
this.nächsterKundeToolStripMenuItem.Size = new System.Drawing.Size(216, 24);
this.nächsterKundeToolStripMenuItem.Text = "Nächster Kunde";
this.nächsterKundeToolStripMenuItem.Click += new System.EventHandler(this.NaechsterKundeToolStripMenuItem_Click);
//
@ -376,9 +376,9 @@ namespace Deckungsbeitrag
this.tabPageVorschau.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(1)))), ((int)(((byte)(53)))), ((int)(((byte)(101)))));
this.tabPageVorschau.Controls.Add(this.buttonSWS_Drucken);
this.tabPageVorschau.Controls.Add(this.pictureBoxEntwurf);
this.tabPageVorschau.Location = new System.Drawing.Point(4, 38);
this.tabPageVorschau.Location = new System.Drawing.Point(4, 34);
this.tabPageVorschau.Name = "tabPageVorschau";
this.tabPageVorschau.Size = new System.Drawing.Size(1001, 730);
this.tabPageVorschau.Size = new System.Drawing.Size(1001, 734);
this.tabPageVorschau.TabIndex = 2;
this.tabPageVorschau.Text = "SWS-Vorschau";
//
@ -389,7 +389,7 @@ namespace Deckungsbeitrag
this.buttonSWS_Drucken.FlatAppearance.BorderSize = 0;
this.buttonSWS_Drucken.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.buttonSWS_Drucken.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.buttonSWS_Drucken.Location = new System.Drawing.Point(698, 686);
this.buttonSWS_Drucken.Location = new System.Drawing.Point(698, 690);
this.buttonSWS_Drucken.Name = "buttonSWS_Drucken";
this.buttonSWS_Drucken.Size = new System.Drawing.Size(300, 41);
this.buttonSWS_Drucken.TabIndex = 36;
@ -407,7 +407,7 @@ namespace Deckungsbeitrag
this.pictureBoxEntwurf.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.pictureBoxEntwurf.Location = new System.Drawing.Point(0, 0);
this.pictureBoxEntwurf.Name = "pictureBoxEntwurf";
this.pictureBoxEntwurf.Size = new System.Drawing.Size(1001, 680);
this.pictureBoxEntwurf.Size = new System.Drawing.Size(1001, 684);
this.pictureBoxEntwurf.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
this.pictureBoxEntwurf.TabIndex = 16;
this.pictureBoxEntwurf.TabStop = false;
@ -424,11 +424,11 @@ namespace Deckungsbeitrag
this.tabPageUmsatz.Controls.Add(this.labelJahresumsatz);
this.tabPageUmsatz.Controls.Add(this.chartJahresumsatz);
this.tabPageUmsatz.Controls.Add(this.olvJahresumsatz);
this.tabPageUmsatz.Location = new System.Drawing.Point(4, 38);
this.tabPageUmsatz.Location = new System.Drawing.Point(4, 34);
this.tabPageUmsatz.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.tabPageUmsatz.Name = "tabPageUmsatz";
this.tabPageUmsatz.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.tabPageUmsatz.Size = new System.Drawing.Size(1001, 730);
this.tabPageUmsatz.Size = new System.Drawing.Size(1001, 734);
this.tabPageUmsatz.TabIndex = 0;
this.tabPageUmsatz.Text = "Umsatz";
//
@ -439,7 +439,7 @@ namespace Deckungsbeitrag
this.labelMonatsumsatz.ForeColor = System.Drawing.Color.White;
this.labelMonatsumsatz.Location = new System.Drawing.Point(615, 53);
this.labelMonatsumsatz.Name = "labelMonatsumsatz";
this.labelMonatsumsatz.Size = new System.Drawing.Size(193, 29);
this.labelMonatsumsatz.Size = new System.Drawing.Size(164, 25);
this.labelMonatsumsatz.TabIndex = 46;
this.labelMonatsumsatz.Text = "Monatsumsätze";
//
@ -495,7 +495,7 @@ namespace Deckungsbeitrag
this.labelQuartalsumsatz.ForeColor = System.Drawing.Color.White;
this.labelQuartalsumsatz.Location = new System.Drawing.Point(309, 53);
this.labelQuartalsumsatz.Name = "labelQuartalsumsatz";
this.labelQuartalsumsatz.Size = new System.Drawing.Size(207, 29);
this.labelQuartalsumsatz.Size = new System.Drawing.Size(175, 25);
this.labelQuartalsumsatz.TabIndex = 43;
this.labelQuartalsumsatz.Text = "Quartalsumsätze";
//
@ -551,7 +551,7 @@ namespace Deckungsbeitrag
this.labelJahresumsatz.ForeColor = System.Drawing.Color.White;
this.labelJahresumsatz.Location = new System.Drawing.Point(7, 55);
this.labelJahresumsatz.Name = "labelJahresumsatz";
this.labelJahresumsatz.Size = new System.Drawing.Size(187, 29);
this.labelJahresumsatz.Size = new System.Drawing.Size(159, 25);
this.labelJahresumsatz.TabIndex = 40;
this.labelJahresumsatz.Text = "Jahresumsätze";
//
@ -605,11 +605,11 @@ namespace Deckungsbeitrag
this.tabPageArtikel.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(1)))), ((int)(((byte)(53)))), ((int)(((byte)(101)))));
this.tabPageArtikel.Controls.Add(this.buttonSpeichern);
this.tabPageArtikel.Controls.Add(this.dGArtikel);
this.tabPageArtikel.Location = new System.Drawing.Point(4, 38);
this.tabPageArtikel.Location = new System.Drawing.Point(4, 34);
this.tabPageArtikel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.tabPageArtikel.Name = "tabPageArtikel";
this.tabPageArtikel.Padding = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.tabPageArtikel.Size = new System.Drawing.Size(1001, 730);
this.tabPageArtikel.Size = new System.Drawing.Size(1001, 734);
this.tabPageArtikel.TabIndex = 1;
this.tabPageArtikel.Text = "Artikelliste";
//
@ -617,11 +617,12 @@ namespace Deckungsbeitrag
//
this.buttonSpeichern.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.buttonSpeichern.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(192)))), ((int)(((byte)(0)))));
this.buttonSpeichern.Enabled = false;
this.buttonSpeichern.FlatAppearance.BorderSize = 0;
this.buttonSpeichern.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.buttonSpeichern.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.buttonSpeichern.ForeColor = System.Drawing.Color.White;
this.buttonSpeichern.Location = new System.Drawing.Point(694, 681);
this.buttonSpeichern.Location = new System.Drawing.Point(694, 685);
this.buttonSpeichern.Name = "buttonSpeichern";
this.buttonSpeichern.Size = new System.Drawing.Size(300, 41);
this.buttonSpeichern.TabIndex = 37;
@ -651,7 +652,7 @@ namespace Deckungsbeitrag
this.dGArtikel.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.dGArtikel.Name = "dGArtikel";
this.dGArtikel.RowHeadersWidth = 51;
this.dGArtikel.Size = new System.Drawing.Size(989, 668);
this.dGArtikel.Size = new System.Drawing.Size(989, 672);
this.dGArtikel.TabIndex = 11;
this.dGArtikel.CellBeginEdit += new System.Windows.Forms.DataGridViewCellCancelEventHandler(this.DGArtikel_CellBeginEdit);
this.dGArtikel.CellValueChanged += new System.Windows.Forms.DataGridViewCellEventHandler(this.DGArtikel_CellValueChanged);
@ -738,9 +739,9 @@ namespace Deckungsbeitrag
// tabPageInventur
//
this.tabPageInventur.Controls.Add(this.tabControlInventur);
this.tabPageInventur.Location = new System.Drawing.Point(4, 38);
this.tabPageInventur.Location = new System.Drawing.Point(4, 34);
this.tabPageInventur.Name = "tabPageInventur";
this.tabPageInventur.Size = new System.Drawing.Size(1001, 730);
this.tabPageInventur.Size = new System.Drawing.Size(1001, 734);
this.tabPageInventur.TabIndex = 3;
this.tabPageInventur.Text = "Inventuren";
this.tabPageInventur.UseVisualStyleBackColor = true;
@ -752,7 +753,7 @@ namespace Deckungsbeitrag
this.tabControlInventur.Location = new System.Drawing.Point(0, 0);
this.tabControlInventur.Name = "tabControlInventur";
this.tabControlInventur.SelectedIndex = 0;
this.tabControlInventur.Size = new System.Drawing.Size(1001, 730);
this.tabControlInventur.Size = new System.Drawing.Size(1001, 734);
this.tabControlInventur.TabIndex = 0;
//
// tabPageNeueInventur
@ -762,10 +763,10 @@ namespace Deckungsbeitrag
this.tabPageNeueInventur.Controls.Add(this.dGVZahlen);
this.tabPageNeueInventur.Controls.Add(this.panelButtons);
this.tabPageNeueInventur.Controls.Add(this.panelDaten);
this.tabPageNeueInventur.Location = new System.Drawing.Point(4, 38);
this.tabPageNeueInventur.Location = new System.Drawing.Point(4, 34);
this.tabPageNeueInventur.Name = "tabPageNeueInventur";
this.tabPageNeueInventur.Padding = new System.Windows.Forms.Padding(3);
this.tabPageNeueInventur.Size = new System.Drawing.Size(993, 688);
this.tabPageNeueInventur.Size = new System.Drawing.Size(993, 696);
this.tabPageNeueInventur.TabIndex = 0;
this.tabPageNeueInventur.Text = "Neue Inventur";
//
@ -782,7 +783,7 @@ namespace Deckungsbeitrag
this.dGVZahlen.RowHeadersBorderStyle = System.Windows.Forms.DataGridViewHeaderBorderStyle.Single;
this.dGVZahlen.RowHeadersWidth = 51;
this.dGVZahlen.RowTemplate.Height = 24;
this.dGVZahlen.Size = new System.Drawing.Size(977, 516);
this.dGVZahlen.Size = new System.Drawing.Size(977, 524);
this.dGVZahlen.TabIndex = 3;
this.dGVZahlen.CellEndEdit += new System.Windows.Forms.DataGridViewCellEventHandler(this.DGVZahlen_CellEndEdit);
this.dGVZahlen.MouseDown += new System.Windows.Forms.MouseEventHandler(this.DGVZahlen_MouseDown);
@ -793,14 +794,14 @@ namespace Deckungsbeitrag
this.contextMenuStripGridView.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.deleteRowToolStripMenuItem});
this.contextMenuStripGridView.Name = "contextMenuStripGridView";
this.contextMenuStripGridView.Size = new System.Drawing.Size(194, 36);
this.contextMenuStripGridView.Size = new System.Drawing.Size(173, 30);
this.contextMenuStripGridView.Opening += new System.ComponentModel.CancelEventHandler(this.ContextMenuStripGridView_Opening);
//
// deleteRowToolStripMenuItem
//
this.deleteRowToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("deleteRowToolStripMenuItem.Image")));
this.deleteRowToolStripMenuItem.Name = "deleteRowToolStripMenuItem";
this.deleteRowToolStripMenuItem.Size = new System.Drawing.Size(193, 32);
this.deleteRowToolStripMenuItem.Size = new System.Drawing.Size(172, 26);
this.deleteRowToolStripMenuItem.Text = "Zeile Löschen";
this.deleteRowToolStripMenuItem.Click += new System.EventHandler(this.DeleteRowToolStripMenuItem_Click);
//
@ -809,7 +810,7 @@ namespace Deckungsbeitrag
this.panelButtons.Controls.Add(this.buttonFreigeben);
this.panelButtons.Controls.Add(this.buttonDelete);
this.panelButtons.Dock = System.Windows.Forms.DockStyle.Bottom;
this.panelButtons.Location = new System.Drawing.Point(3, 631);
this.panelButtons.Location = new System.Drawing.Point(3, 639);
this.panelButtons.Name = "panelButtons";
this.panelButtons.Padding = new System.Windows.Forms.Padding(5);
this.panelButtons.Size = new System.Drawing.Size(983, 50);
@ -872,7 +873,7 @@ namespace Deckungsbeitrag
this.labelAddRow.AutoSize = true;
this.labelAddRow.Location = new System.Drawing.Point(765, 63);
this.labelAddRow.Name = "labelAddRow";
this.labelAddRow.Size = new System.Drawing.Size(195, 29);
this.labelAddRow.Size = new System.Drawing.Size(161, 25);
this.labelAddRow.TabIndex = 42;
this.labelAddRow.Text = "Zeile hinzufügen:";
//
@ -895,7 +896,7 @@ namespace Deckungsbeitrag
this.labelLiefertag.AutoSize = true;
this.labelLiefertag.Location = new System.Drawing.Point(18, 63);
this.labelLiefertag.Name = "labelLiefertag";
this.labelLiefertag.Size = new System.Drawing.Size(113, 29);
this.labelLiefertag.Size = new System.Drawing.Size(93, 25);
this.labelLiefertag.TabIndex = 3;
this.labelLiefertag.Text = "Liefertag:";
//
@ -904,7 +905,7 @@ namespace Deckungsbeitrag
this.labelInventur.AutoSize = true;
this.labelInventur.Location = new System.Drawing.Point(18, 13);
this.labelInventur.Name = "labelInventur";
this.labelInventur.Size = new System.Drawing.Size(169, 29);
this.labelInventur.Size = new System.Drawing.Size(142, 25);
this.labelInventur.TabIndex = 2;
this.labelInventur.Text = "Inventurdatum:";
//
@ -915,7 +916,7 @@ namespace Deckungsbeitrag
this.dateTimePickerLiefertag.Location = new System.Drawing.Point(166, 60);
this.dateTimePickerLiefertag.Name = "dateTimePickerLiefertag";
this.dateTimePickerLiefertag.ShowCheckBox = true;
this.dateTimePickerLiefertag.Size = new System.Drawing.Size(200, 35);
this.dateTimePickerLiefertag.Size = new System.Drawing.Size(200, 30);
this.dateTimePickerLiefertag.TabIndex = 1;
this.dateTimePickerLiefertag.ValueChanged += new System.EventHandler(this.DateTimePicker_ValueChanged);
//
@ -926,7 +927,7 @@ namespace Deckungsbeitrag
this.dateTimePickerInventur.Location = new System.Drawing.Point(166, 11);
this.dateTimePickerInventur.Name = "dateTimePickerInventur";
this.dateTimePickerInventur.ShowCheckBox = true;
this.dateTimePickerInventur.Size = new System.Drawing.Size(200, 35);
this.dateTimePickerInventur.Size = new System.Drawing.Size(200, 30);
this.dateTimePickerInventur.TabIndex = 0;
this.dateTimePickerInventur.ValueChanged += new System.EventHandler(this.DateTimePicker_ValueChanged);
//
@ -952,7 +953,7 @@ namespace Deckungsbeitrag
this.label3.ForeColor = System.Drawing.Color.White;
this.label3.Location = new System.Drawing.Point(9, 336);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(94, 29);
this.label3.Size = new System.Drawing.Size(78, 25);
this.label3.TabIndex = 47;
this.label3.Text = "Service";
//
@ -963,7 +964,7 @@ namespace Deckungsbeitrag
this.comboBoxService.Location = new System.Drawing.Point(13, 361);
this.comboBoxService.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.comboBoxService.Name = "comboBoxService";
this.comboBoxService.Size = new System.Drawing.Size(315, 37);
this.comboBoxService.Size = new System.Drawing.Size(315, 33);
this.comboBoxService.TabIndex = 48;
this.comboBoxService.SelectedValueChanged += new System.EventHandler(this.ComboBoxService_SelectedValueChanged);
//
@ -988,7 +989,7 @@ namespace Deckungsbeitrag
this.label4.ForeColor = System.Drawing.Color.White;
this.label4.Location = new System.Drawing.Point(9, 529);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(162, 29);
this.label4.Size = new System.Drawing.Size(135, 25);
this.label4.TabIndex = 51;
this.label4.Text = "Anmerkungen";
//
@ -999,7 +1000,7 @@ namespace Deckungsbeitrag
this.labelAnzahlChars.ForeColor = System.Drawing.Color.White;
this.labelAnzahlChars.Location = new System.Drawing.Point(312, 532);
this.labelAnzahlChars.Name = "labelAnzahlChars";
this.labelAnzahlChars.Size = new System.Drawing.Size(84, 25);
this.labelAnzahlChars.Size = new System.Drawing.Size(68, 20);
this.labelAnzahlChars.TabIndex = 52;
this.labelAnzahlChars.Text = "000/000";
//
@ -1013,7 +1014,7 @@ namespace Deckungsbeitrag
0,
0});
this.numericUpDownAufgabeCount.Name = "numericUpDownAufgabeCount";
this.numericUpDownAufgabeCount.Size = new System.Drawing.Size(46, 40);
this.numericUpDownAufgabeCount.Size = new System.Drawing.Size(46, 34);
this.numericUpDownAufgabeCount.TabIndex = 53;
this.numericUpDownAufgabeCount.ValueChanged += new System.EventHandler(this.NumericUpDownAufgabeCount_ValueChanged);
this.numericUpDownAufgabeCount.Leave += new System.EventHandler(this.NumericUpDownAufgabeCount_Leave);
@ -1025,7 +1026,7 @@ namespace Deckungsbeitrag
this.comboBoxLRSommer.Location = new System.Drawing.Point(13, 435);
this.comboBoxLRSommer.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.comboBoxLRSommer.Name = "comboBoxLRSommer";
this.comboBoxLRSommer.Size = new System.Drawing.Size(170, 37);
this.comboBoxLRSommer.Size = new System.Drawing.Size(170, 33);
this.comboBoxLRSommer.TabIndex = 55;
this.comboBoxLRSommer.SelectedIndexChanged += new System.EventHandler(this.ComboBoxLieferrhythmus_SelectedIndexChanged);
//
@ -1036,7 +1037,7 @@ namespace Deckungsbeitrag
this.label5.ForeColor = System.Drawing.Color.White;
this.label5.Location = new System.Drawing.Point(9, 397);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(170, 29);
this.label5.Size = new System.Drawing.Size(140, 25);
this.label5.TabIndex = 54;
this.label5.Text = "Lieferrhythmus";
//
@ -1047,7 +1048,7 @@ namespace Deckungsbeitrag
this.comboBoxLRWinter.Location = new System.Drawing.Point(195, 435);
this.comboBoxLRWinter.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
this.comboBoxLRWinter.Name = "comboBoxLRWinter";
this.comboBoxLRWinter.Size = new System.Drawing.Size(170, 37);
this.comboBoxLRWinter.Size = new System.Drawing.Size(170, 33);
this.comboBoxLRWinter.TabIndex = 56;
this.comboBoxLRWinter.SelectedIndexChanged += new System.EventHandler(this.ComboBoxLieferrhythmus_SelectedIndexChanged);
//
@ -1058,7 +1059,7 @@ namespace Deckungsbeitrag
this.label6.ForeColor = System.Drawing.Color.White;
this.label6.Location = new System.Drawing.Point(10, 417);
this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(72, 20);
this.label6.Size = new System.Drawing.Size(60, 17);
this.label6.TabIndex = 57;
this.label6.Text = "Sommer";
//
@ -1069,7 +1070,7 @@ namespace Deckungsbeitrag
this.label7.ForeColor = System.Drawing.Color.White;
this.label7.Location = new System.Drawing.Point(192, 417);
this.label7.Name = "label7";
this.label7.Size = new System.Drawing.Size(58, 20);
this.label7.Size = new System.Drawing.Size(49, 17);
this.label7.TabIndex = 58;
this.label7.Text = "Winter";
//
@ -1110,7 +1111,7 @@ namespace Deckungsbeitrag
this.checkBoxNW.ForeColor = System.Drawing.Color.White;
this.checkBoxNW.Location = new System.Drawing.Point(297, 152);
this.checkBoxNW.Name = "checkBoxNW";
this.checkBoxNW.Size = new System.Drawing.Size(79, 33);
this.checkBoxNW.Size = new System.Drawing.Size(68, 29);
this.checkBoxNW.TabIndex = 59;
this.checkBoxNW.Text = "NW";
this.checkBoxNW.UseVisualStyleBackColor = true;

View File

@ -160,7 +160,7 @@
<data name="deleteRowToolStripMenuItem.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
vQAADr0BR/uQrQAAALlJREFUOE+tkrERwjAMRbMAa1CnpHZNwQgUbMBEdFBmhCxjoIrdqBX3fZFPFsEO
vAAADrwBlbxySQAAALlJREFUOE+tkrERwjAMRbMAa1CnpHZNwQgUbMBEdFBmhCxjoIrdqBX3fZFPFsEO
HMU7y+f8Z8mXjpm7GkTUE1GYQV3s8QE3COP5xAB1ePg47Hd5nwTOuUVwFp93RuCy3aSQ1FgLQZhigQiI
6KglEkYneYSGoJe2RSDtrxLo27HqcZpvAIbbNQchE+GbwHagmbxPIv0mzREsMtL8bxwQRv2TQNN8A01V
8OlGy9cCG7D8T7DEakENG7C8AEMBEFYEw8flAAAAAElFTkSuQmCC

View File

@ -59,11 +59,11 @@ namespace Deckungsbeitrag
this.listViewKunde.HideSelection = false;
this.listViewKunde.HotTracking = true;
this.listViewKunde.HoverSelection = true;
this.listViewKunde.Location = new System.Drawing.Point(12, 54);
this.listViewKunde.Location = new System.Drawing.Point(12, 76);
this.listViewKunde.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.listViewKunde.MultiSelect = false;
this.listViewKunde.Name = "listViewKunde";
this.listViewKunde.Size = new System.Drawing.Size(527, 573);
this.listViewKunde.Size = new System.Drawing.Size(850, 551);
this.listViewKunde.TabIndex = 1;
this.listViewKunde.UseCompatibleStateImageBehavior = false;
this.listViewKunde.View = System.Windows.Forms.View.Details;
@ -89,25 +89,24 @@ namespace Deckungsbeitrag
//
// textBoxKunde
//
this.textBoxKunde.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.textBoxKunde.Font = new System.Drawing.Font("Microsoft Sans Serif", 16.2F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.textBoxKunde.ForeColor = System.Drawing.Color.Silver;
this.textBoxKunde.Location = new System.Drawing.Point(12, 16);
this.textBoxKunde.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.textBoxKunde.Name = "textBoxKunde";
this.textBoxKunde.Size = new System.Drawing.Size(159, 30);
this.textBoxKunde.Size = new System.Drawing.Size(393, 38);
this.textBoxKunde.TabIndex = 0;
this.textBoxKunde.Text = "Hier eingeben";
this.textBoxKunde.Click += new System.EventHandler(this.TextBoxKunde_Click);
this.textBoxKunde.TextChanged += new System.EventHandler(this.TextBoxKunde_TextChanged);
this.textBoxKunde.Enter += new System.EventHandler(this.TextBoxKunde_Enter);
this.textBoxKunde.KeyDown += new System.Windows.Forms.KeyEventHandler(this.ListViewKunde_KeyDown);
this.textBoxKunde.KeyDown += new System.Windows.Forms.KeyEventHandler(this.TextBoxKunde_KeyDown);
this.textBoxKunde.Leave += new System.EventHandler(this.TextBoxKunde_Leave);
//
// label1
//
this.label1.AutoSize = true;
this.label1.ForeColor = System.Drawing.Color.White;
this.label1.Location = new System.Drawing.Point(184, 18);
this.label1.Location = new System.Drawing.Point(412, 19);
this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(304, 32);
@ -125,7 +124,7 @@ namespace Deckungsbeitrag
this.buttonOK.Location = new System.Drawing.Point(84, 85);
this.buttonOK.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.buttonOK.Name = "buttonOK";
this.buttonOK.Size = new System.Drawing.Size(381, 50);
this.buttonOK.Size = new System.Drawing.Size(704, 50);
this.buttonOK.TabIndex = 15;
this.buttonOK.Text = "Kunde übernehmen";
this.buttonOK.UseVisualStyleBackColor = false;
@ -142,7 +141,7 @@ namespace Deckungsbeitrag
this.buttonNeuerAuftrag.Location = new System.Drawing.Point(160, 574);
this.buttonNeuerAuftrag.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2);
this.buttonNeuerAuftrag.Name = "buttonNeuerAuftrag";
this.buttonNeuerAuftrag.Size = new System.Drawing.Size(222, 42);
this.buttonNeuerAuftrag.Size = new System.Drawing.Size(545, 42);
this.buttonNeuerAuftrag.TabIndex = 16;
this.buttonNeuerAuftrag.Text = "Neuer Auftrag";
this.buttonNeuerAuftrag.UseVisualStyleBackColor = false;
@ -153,7 +152,7 @@ namespace Deckungsbeitrag
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(1)))), ((int)(((byte)(53)))), ((int)(((byte)(101)))));
this.ClientSize = new System.Drawing.Size(551, 642);
this.ClientSize = new System.Drawing.Size(874, 642);
this.Controls.Add(this.buttonNeuerAuftrag);
this.Controls.Add(this.buttonOK);
this.Controls.Add(this.label1);

View File

@ -13,6 +13,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Media.TextFormatting;
using VirtualKeyboard;
using ZXing;
@ -347,14 +348,6 @@ namespace Deckungsbeitrag
this.Size = new Size(lvwWidth + 50, this.Height);
}
private void TextBoxKunde_Enter(object sender, EventArgs e)
{
if (this.benutzer != null && this.benutzer.Rolle == BenutzerRolle.Fahrer)
{
this.textBoxKunde.ForeColor = Color.Black;
this.textBoxKunde.Clear();
}
}
private void TextBoxKunde_Click(object sender, EventArgs e)
{
this.textBoxKunde.ForeColor = Color.Black;
@ -378,56 +371,20 @@ namespace Deckungsbeitrag
}
private void TextBoxKunde_TextChanged(object sender, EventArgs e)
{
// TextChanged tritt nur ein wenn x Sekunden keine Eingabe erfolgt. Logik befindet sich in Timer_Tick
timer.Stop(); // Alten Timer beenden
timer.Start(); // Neuen Timer starten
TextBox textbox = (TextBox)sender;
if (textbox.ForeColor == Color.Black)
{
// TextChanged tritt nur ein wenn x Sekunden keine Eingabe erfolgt. Logik befindet sich in Timer_Tick
timer.Stop(); // Alten Timer beenden
timer.Start(); // Neuen Timer starten
}
}
private async void Timer_Tick(object sender, EventArgs e)
{
timer.Stop(); // Timer stoppen
if (textBoxKunde.ForeColor != Color.Black & !this.textBoxKunde.Text.StartsWith("https")) { return; }
if (textBoxKunde.ForeColor != Color.Black & !this.textBoxKunde.Text.ToLower().StartsWith("https")) { return; }
else TextBoxKunde_Leave(textBoxKunde, e);
//// Wenn kein Fragezeichen am Anfang wird Kundenliste erstellt.
//if (!textBoxKunde.Text.StartsWith("?"))
//{
// string text;
// if (textBoxKunde.Text.StartsWith("http"))
// {
// int index = 1;
// index += textBoxKunde.Text.IndexOf("=", index);
// int i = textBoxKunde.Text.IndexOf("%", index);
// text = textBoxKunde.Text.Substring(index, i - index);
// textBoxKunde.Text = text;
// }
// else text = this.textBoxKunde.Text;
// if (kategorie == 0)
// {
// this.Kundenliste = Kunde.GetTmpList(text, this.kndService);
// ListViewKunde_Load();
// }
// else
// {
// List<View_Auftrag_Expedit> _allÍtems = await View_Auftrag_Expedit.GetAuftragExpeditAsync(statusFilter: AuftragStatus.Gewaschen, typFilter: AuftragTyp.Standart, kategorie: kategorie, undFertig: true);
// string term = text.Trim().ToLower();
// if (!string.IsNullOrWhiteSpace(term))
// {
// var filtered = string.IsNullOrWhiteSpace(term) ? _allÍtems : _allÍtems.Where(x => x.KundeName != null && x.KundeName.ToLower().Contains(term)).ToList();
// FillListView(filtered);
// }
// else FillListView(_allÍtems);
// }
// return;
//}
//// Wenn Fragezeichen am Anfang wird OK-Button aktiviert.
//if (textBoxKunde.Text.StartsWith("?"))
//{
// this.listViewKunde.Visible = this.listViewKunde.Enabled = false;
// this.buttonOK.Visible = this.buttonOK.Enabled = true;
// this.Height = this.buttonOK.Bottom + 100;
//}
}
private void ListViewKunde_MouseClick(object sender, MouseEventArgs e)
@ -466,7 +423,7 @@ namespace Deckungsbeitrag
}
private void ListViewKunde_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
if (e.KeyCode == Keys.Enter)
{
if (textBoxKunde.Text.StartsWith("?"))
{
@ -532,7 +489,7 @@ namespace Deckungsbeitrag
if (!textBoxKunde.Text.StartsWith("?"))
{
string text;
if (textBoxKunde.Text.StartsWith("http"))
if (textBoxKunde.Text.ToLower().StartsWith("https"))
{
int index = 1;
index += textBoxKunde.Text.IndexOf("=", index);
@ -560,14 +517,12 @@ namespace Deckungsbeitrag
}
return;
}
// Wenn Fragezeichen am Anfang wird OK-Button aktiviert.
if (textBoxKunde.Text.StartsWith("?"))
else
{
this.listViewKunde.Visible = this.listViewKunde.Enabled = false;
this.buttonOK.Visible = this.buttonOK.Enabled = true;
this.Height = this.buttonOK.Bottom + 100;
}
} // Wenn Fragezeichen am Anfang wird OK-Button aktiviert.
}
private void ButtonNeuerAuftrag_Click(object sender, EventArgs e)
@ -582,5 +537,18 @@ namespace Deckungsbeitrag
{
if (keyboard != null) keyboard.Close();
}
private void TextBoxKunde_KeyDown(object sender, KeyEventArgs e)
{
TextBox txtScan = (TextBox)sender;
if (e.KeyCode == Keys.Enter)
{
e.SuppressKeyPress = true;
string code = txtScan.Text.Trim();
txtScan.Clear();
if (!string.IsNullOrEmpty(code))
TextBoxKunde_Leave(txtScan, null);
}
}
}
}

View File

@ -38,6 +38,7 @@ namespace Deckungsbeitrag
this.toolStripZaehlscheine = new System.Windows.Forms.ToolStripButton();
this.tSBExpedit = new System.Windows.Forms.ToolStripButton();
this.toolStripDB = new System.Windows.Forms.ToolStripButton();
this.tSBTourenplanung = new System.Windows.Forms.ToolStripButton();
this.tSBKosten = new System.Windows.Forms.ToolStripButton();
this.toolStripButton1 = new System.Windows.Forms.ToolStripButton();
this.tSBScannTest = new System.Windows.Forms.ToolStripButton();
@ -45,7 +46,6 @@ namespace Deckungsbeitrag
this.toolStripButtonImport = new System.Windows.Forms.ToolStripButton();
this.tSBEinstellung = new System.Windows.Forms.ToolStripButton();
this.tSBWaschstrasse = new System.Windows.Forms.ToolStripButton();
this.tSBTourenplanung = new System.Windows.Forms.ToolStripButton();
this.toolStripBeenden = new System.Windows.Forms.ToolStripButton();
this.panelMain = new System.Windows.Forms.Panel();
this.buttonSonderAuftrag = new System.Windows.Forms.Button();
@ -109,6 +109,7 @@ namespace Deckungsbeitrag
this.textBoxScannTest = new System.Windows.Forms.TextBox();
this.buttonScannTest = new System.Windows.Forms.Button();
this.labelScannTest = new System.Windows.Forms.Label();
this.buttonTest = new System.Windows.Forms.Button();
this.toolStripMenu.SuspendLayout();
this.panelMain.SuspendLayout();
this.groupBoxAuftrag.SuspendLayout();
@ -138,6 +139,7 @@ namespace Deckungsbeitrag
this.toolStripZaehlscheine,
this.tSBExpedit,
this.toolStripDB,
this.tSBTourenplanung,
this.tSBKosten,
this.toolStripButton1,
this.tSBScannTest,
@ -145,7 +147,6 @@ namespace Deckungsbeitrag
this.toolStripButtonImport,
this.tSBEinstellung,
this.tSBWaschstrasse,
this.tSBTourenplanung,
this.toolStripBeenden});
this.toolStripMenu.LayoutStyle = System.Windows.Forms.ToolStripLayoutStyle.VerticalStackWithOverflow;
this.toolStripMenu.Location = new System.Drawing.Point(0, 0);
@ -298,6 +299,26 @@ namespace Deckungsbeitrag
this.toolStripDB.MouseLeave += new System.EventHandler(this.ToolStrip_MouseLeave);
this.toolStripDB.Paint += new System.Windows.Forms.PaintEventHandler(this.Get_Border_Paint);
//
// tSBTourenplanung
//
this.tSBTourenplanung.AutoSize = false;
this.tSBTourenplanung.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(1)))), ((int)(((byte)(53)))), ((int)(((byte)(101)))));
this.tSBTourenplanung.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
this.tSBTourenplanung.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.tSBTourenplanung.ForeColor = System.Drawing.Color.White;
this.tSBTourenplanung.Image = ((System.Drawing.Image)(resources.GetObject("tSBTourenplanung.Image")));
this.tSBTourenplanung.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.tSBTourenplanung.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
this.tSBTourenplanung.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tSBTourenplanung.Name = "tSBTourenplanung";
this.tSBTourenplanung.Size = new System.Drawing.Size(180, 40);
this.tSBTourenplanung.Text = "TOURENPLAN";
this.tSBTourenplanung.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
this.tSBTourenplanung.Click += new System.EventHandler(this.TSBTourenplanung_Click);
this.tSBTourenplanung.MouseEnter += new System.EventHandler(this.ToolStrip_MouseEnter);
this.tSBTourenplanung.MouseLeave += new System.EventHandler(this.ToolStrip_MouseLeave);
this.tSBTourenplanung.Paint += new System.Windows.Forms.PaintEventHandler(this.Get_Border_Paint);
//
// tSBKosten
//
this.tSBKosten.AutoSize = false;
@ -428,26 +449,6 @@ namespace Deckungsbeitrag
this.tSBWaschstrasse.MouseLeave += new System.EventHandler(this.ToolStrip_MouseLeave);
this.tSBWaschstrasse.Paint += new System.Windows.Forms.PaintEventHandler(this.Get_Border_Paint);
//
// tSBTourenplanung
//
this.tSBTourenplanung.AutoSize = false;
this.tSBTourenplanung.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(1)))), ((int)(((byte)(53)))), ((int)(((byte)(101)))));
this.tSBTourenplanung.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
this.tSBTourenplanung.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.tSBTourenplanung.ForeColor = System.Drawing.Color.White;
this.tSBTourenplanung.Image = ((System.Drawing.Image)(resources.GetObject("tSBTourenplanung.Image")));
this.tSBTourenplanung.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.tSBTourenplanung.ImageScaling = System.Windows.Forms.ToolStripItemImageScaling.None;
this.tSBTourenplanung.ImageTransparentColor = System.Drawing.Color.Magenta;
this.tSBTourenplanung.Name = "tSBTourenplanung";
this.tSBTourenplanung.Size = new System.Drawing.Size(180, 40);
this.tSBTourenplanung.Text = "TOURENPLANUNG";
this.tSBTourenplanung.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
this.tSBTourenplanung.Click += new System.EventHandler(this.TSBTourenplanung_Click);
this.tSBTourenplanung.MouseEnter += new System.EventHandler(this.ToolStrip_MouseEnter);
this.tSBTourenplanung.MouseLeave += new System.EventHandler(this.ToolStrip_MouseLeave);
this.tSBTourenplanung.Paint += new System.Windows.Forms.PaintEventHandler(this.Get_Border_Paint);
//
// toolStripBeenden
//
this.toolStripBeenden.AutoSize = false;
@ -472,6 +473,7 @@ namespace Deckungsbeitrag
//
this.panelMain.AllowDrop = true;
this.panelMain.BackColor = System.Drawing.Color.White;
this.panelMain.Controls.Add(this.buttonTest);
this.panelMain.Controls.Add(this.buttonSonderAuftrag);
this.panelMain.Controls.Add(this.groupBoxAuftrag);
this.panelMain.Controls.Add(this.panelProgress);
@ -1451,6 +1453,27 @@ namespace Deckungsbeitrag
this.labelScannTest.TabIndex = 11;
this.labelScannTest.Text = "label1";
//
// buttonTest
//
this.buttonTest.BackColor = System.Drawing.Color.Red;
this.buttonTest.Enabled = false;
this.buttonTest.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(192)))), ((int)(((byte)(0)))));
this.buttonTest.FlatAppearance.BorderSize = 0;
this.buttonTest.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.buttonTest.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.buttonTest.ForeColor = System.Drawing.Color.Black;
this.buttonTest.ImageAlign = System.Drawing.ContentAlignment.MiddleRight;
this.buttonTest.Location = new System.Drawing.Point(376, 15);
this.buttonTest.Margin = new System.Windows.Forms.Padding(7, 6, 7, 6);
this.buttonTest.Name = "buttonTest";
this.buttonTest.Size = new System.Drawing.Size(333, 50);
this.buttonTest.TabIndex = 73;
this.buttonTest.Text = "Trello Test";
this.buttonTest.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
this.buttonTest.UseVisualStyleBackColor = false;
this.buttonTest.Visible = false;
this.buttonTest.Click += new System.EventHandler(this.buttonTest_Click);
//
// FormMain
//
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
@ -1576,6 +1599,7 @@ namespace Deckungsbeitrag
private System.Windows.Forms.ProgressBar progressBarKundeArtikelUpdate;
private System.Windows.Forms.Panel panelProgress;
private System.Windows.Forms.Button buttonSonderAuftrag;
private System.Windows.Forms.Button buttonTest;
}
}

View File

@ -26,6 +26,7 @@ using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml.Serialization;
using TrelloIntegration;
using ZXing.Common;
using Timer = System.Windows.Forms.Timer;
@ -117,17 +118,16 @@ namespace Deckungsbeitrag
}
}
if (this.groupBoxContAnz.Visible)
{
await GetAuftraege();
GetContainerProTag();
}
// UserCotnrols werden eingefügt
GetUserControls();
// Controls werde Enabled
Enable_Controls();
if (this.groupBoxContAnz.Visible)
{
await GetAuftraege();
GetContainerProTag();
}
this.Activate();
_fixedSize = this.Size;
@ -193,16 +193,6 @@ namespace Deckungsbeitrag
}
#endregion
private (DateTime? datum, string[] touren, string tour) ShowTourenplan()
{
FormShowUserControl showUserControl = new FormShowUserControl("Tourenplan", this.benutzer, this.kunde);
if (showUserControl.ShowDialog() == DialogResult.OK)
{
var data = showUserControl.lieferDaten;
return (data.datum, data.touren, data.text);
}
return (null, null, null);
}
#region ToolStripButton-Events
private void Get_Border_Paint(object sender, PaintEventArgs e)
@ -245,10 +235,7 @@ namespace Deckungsbeitrag
private void ToolStripZaehlscheine_Click(object sender, EventArgs e)
{
FormKundeVW kundedaten = new FormKundeVW(this.benutzer);
if (kundedaten.ShowDialog() == DialogResult.OK)
{
}
kundedaten.Show();
}
private void ToolStripDB_Click(object sender, EventArgs e)
{
@ -319,8 +306,12 @@ namespace Deckungsbeitrag
private void TSBTourenplanung_Click(object sender, EventArgs e)
{
this.Cursor = Cursors.WaitCursor;
FormTourenplanung tourenplanung = new FormTourenplanung(this.benutzer);
tourenplanung.ShowDialog();
//FormTourenplanung tourenplanung = new FormTourenplanung(this.benutzer);
//tourenplanung.ShowDialog();
FormShowUserControl showUserControl = new FormShowUserControl("Tourenplan", this.benutzer);
showUserControl.Show();
this.Cursor = Cursors.Default;
}
private void TSBHilfe_Click(object sender, EventArgs e)
@ -455,22 +446,38 @@ namespace Deckungsbeitrag
}
private void ButtonTourenliste_Click(object sender, EventArgs e)
{
Benutzer fahrer = new Benutzer();
if (this.benutzer.Rolle == BenutzerRolle.Fahrer) fahrer = this.benutzer;
else
Tour tour = null;
Benutzer fahrer = this.benutzer;
Saison saison = Saison.GetAktivSaison();
FormShowUserControl showUserControl = new FormShowUserControl("Tourenplan", this.benutzer);
if (showUserControl.ShowDialog() == DialogResult.OK)
{
List<Benutzer> fahrerliste = Benutzer.GetFahrerList();
FormBenutzerVW benutzerVW = new FormBenutzerVW(fahrerliste);
if (benutzerVW.ShowDialog() == DialogResult.OK)
{
fahrer = benutzerVW.user;
}
}
if (fahrer != null)
{
List<Auftrag> auftragliste = Auftrag.GetTourenListe(fahrer);
if (auftragliste.Count > 0) Funktionen.TourenListe_Drucken(auftragliste, fahrer, this, this.benutzer);
var lieferdaten = showUserControl.lieferDaten;
tour = Tour.GetTour(saison.SaisonId, lieferdaten.text);
List<Auftrag> auftragliste = Auftrag.GetTourenListe(tour, lieferdaten.datum.Date);
if (auftragliste.Count > 0) Funktionen.TourenListe_Drucken(auftragliste, tour, this, this.benutzer, fahrer);
}
//Benutzer fahrer = new Benutzer();
//if (this.benutzer.Rolle == BenutzerRolle.Fahrer) fahrer = this.benutzer;
//else
//{
// List<Benutzer> fahrerliste = Benutzer.GetFahrerList();
// FormBenutzerVW benutzerVW = new FormBenutzerVW(fahrerliste);
// if (benutzerVW.ShowDialog() == DialogResult.OK)
// {
// fahrer = benutzerVW.user;
// }
//}
//if (fahrer != null)
//{
// List<Auftrag> auftragliste = Auftrag.GetTourenListe(fahrer);
// if (auftragliste.Count > 0) Funktionen.TourenListe_Drucken(auftragliste, fahrer, this, this.benutzer);
//}
}
private async void ButtonKundeArtikelUpdate_Click(object sender, EventArgs e)
{
@ -1038,6 +1045,16 @@ namespace Deckungsbeitrag
#endregion
private (DateTime? datum, string[] touren, string tour) ShowTourenplan()
{
FormShowUserControl showUserControl = new FormShowUserControl("Tourenplan", this.benutzer, this.kunde);
if (showUserControl.ShowDialog() == DialogResult.OK)
{
var data = showUserControl.lieferDaten;
return (data.datum, data.touren, data.text);
}
return (null, null, null);
}
private async void ZeigeOnboarding()
{
if (this.benutzer.IstGesehen(onBoardingArt)) return; // Bereits fertig
@ -1264,7 +1281,7 @@ namespace Deckungsbeitrag
{
Control ctr = this.tLPContAnz.GetControlFromPosition(i, row);
ctr.Text = Funktionen.GetWochentagDeutsch(key.DayOfWeek);
ctr.Text += " (" + key.ToShortDateString() + "):"; // "13.02.2026"
ctr.Text += " (" + key.ToShortDateString() + "):";
row++;
}
@ -1375,6 +1392,47 @@ namespace Deckungsbeitrag
}
}
private async void buttonTest_Click(object sender, EventArgs e)
{
if (TrelloConfig.HasCredentials())
{
var apiKey = TrelloConfig.GetApiKey();
var token = TrelloConfig.GetToken();
TrelloCardClient _trelloClient = new TrelloCardClient(apiKey, token);
if (_trelloClient == null)
{
MessageBox.Show("Bitte zuerst Credentials speichern.", "Fehler",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
try
{
var options = new CreateCardOptions
{
Name = "TestKarte",
Desc = "TestKarte wurde aus Verwaltung importiert",
IdList = "6a1fcdc9a1995f42c537ae10",
Pos = "top",
DueDate = new DateTime(2026, 6, 10, 17, 0, 0, DateTimeKind.Local)
};
var card = await _trelloClient.CreateCardAndParseAsync(options);
MessageBox.Show(
$"Karte erstellt:\nID: {card.Id}\nName: {card.Name}\nURL: {card.ShortUrl}",
"Erfolg",
MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show($"Fehler beim Erstellen der Karte:\n{ex.Message}", "Fehler",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
}
//CHANGES: Fahrer können abgeholte Aufträge erstellen und ausgelieferte Aufträge markieren.

View File

@ -188,6 +188,17 @@
K5WtGpmnmIhaegrBvM8vP9P0q5xzIcn9UJHRe88ahojZOVcBQxCc/lcSmSpJdBo8axYC8JEsNYAeRO+J
GIBEhFgpGsARGV+sPmcC3q9PVQihpJRqmlOANm/bnfcIQn0CxRi51wXIdb7MddpyXZpeF4AJSLTWPROg
Ic/HXtb1xqK1NotRdPgVzsRG/IFGJf4vZOpFEVHH2lgAAAAASUVORK5CYII=
</value>
</data>
<data name="tSBTourenplanung.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAEMSURBVDhPrZMxjoNADEVzpD1CRE9PzwW2pkpDzwEo0tEi
DkBPT09BSbORsCkneqM1yUxQtNLG0pdG/va3x+M5nT5p27adVbVVVRehhYvjA1PVapomV5alS9PUJUni
wRkfHDFxnjeIcRx9cJZlrmkaNwyDB2d8cIcitAZhleZ5vonIBT/gjK+qKtf3PQI/67p+PVdvSaQKgQH5
ayLyvSzLXiQQYUgQXdc5qh0kXwBJds08zx/FEGBY3Pdo0vB1Xe8oisLHm8hnBP57hX2ILxN+iARDDIYd
PyMiVCQA2DPSIdc8LCIiV0hbJIJpF2HObxfJDBFbZVtjg60yMXFeYM+fiQ7Anz9TbDaD2B/bHero49g9
VkT2AAAAAElFTkSuQmCC
</value>
</data>
<data name="tSBKosten.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
@ -472,17 +483,6 @@
ayLyvSzLXiQQYUgQXdc5qh0kXwBJds08zx/FEGBY3Pdo0vB1Xe8oisLHm8hnBP57hX2ILxN+iARDDIYd
PyMiVCQA2DPSIdc8LCIiV0hbJIJpF2HObxfJDBFbZVtjg60yMXFeYM+fiQ7Anz9TbDaD2B/bHero49g9
VkT2AAAAAElFTkSuQmCC
</value>
</data>
<data name="tSBTourenplanung.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAJcEhZcwAAEnQAABJ0Ad5mH3gAAAEMSURBVDhPrZMxjoNADEVzpD1CRE9PzwW2pkpDzwEo0tEi
DkBPT09BSbORsCkneqM1yUxQtNLG0pdG/va3x+M5nT5p27adVbVVVRehhYvjA1PVapomV5alS9PUJUni
wRkfHDFxnjeIcRx9cJZlrmkaNwyDB2d8cIcitAZhleZ5vonIBT/gjK+qKtf3PQI/67p+PVdvSaQKgQH5
ayLyvSzLXiQQYUgQXdc5qh0kXwBJds08zx/FEGBY3Pdo0vB1Xe8oisLHm8hnBP57hX2ILxN+iARDDIYd
PyMiVCQA2DPSIdc8LCIiV0hbJIJpF2HObxfJDBFbZVtjg60yMXFeYM+fiQ7Anz9TbDaD2B/bHero49g9
VkT2AAAAAElFTkSuQmCC
</value>
</data>
<data name="toolStripBeenden.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">

View File

@ -112,6 +112,7 @@ namespace Deckungsbeitrag
// Kunde laden
if (!GetKunde(kndService)) { CloseForm(DialogResult.Cancel); return; }
// Containeranzahl laden
CustomInputBox messageBox = new CustomInputBox($"Wieviel Container hast du beim Kunde {kundeName} abgeholt?", "CONTAINERANZAHL", "Containeranzahl", "isNumeric");
if (messageBox.ShowDialog() == DialogResult.OK)

View File

@ -1,4 +1,5 @@
using DatenDB;
using Deckungsbeitrag.AA_Klassen;
using Deckungsbeitrag.UserControls;
using System;
using System.Collections.Generic;
@ -23,6 +24,7 @@ namespace Deckungsbeitrag.AA_Forms
private bool toclose = false;
public (DateTime datum, string text, string[] touren) lieferDaten;
private Screen screen = Screen.PrimaryScreen;
public Tour tour;
public bool _toclose
{

View File

@ -10,6 +10,7 @@ using System.ComponentModel;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
@ -82,6 +83,7 @@ namespace DatenDB
public const string ASPECTS = "FahrerID,AufgabeID,KundeID,ZusatzInfo,Wann,Gedruckt,Erledigt,Erstellt von,Erstellt Am";
static bool isExpedit = false;
public event PropertyChangedEventHandler PropertyChanged;
private bool isLoaded = false;
public Auftrag()
{
}
@ -140,7 +142,7 @@ namespace DatenDB
using (var command = new NpgsqlCommand())
{
command.Connection = conn;
command.CommandText = $"SELECT {COLUMNS} from {TABLE} where status <= {(int)aufgelegt} and liefertag >= CURRENT_DATE order by liefertag ASC, priority ASC";
command.CommandText = $"SELECT {COLUMNS} from {TABLE} where status < {(int)aufgelegt} and liefertag >= CURRENT_DATE order by liefertag ASC, priority ASC";
using (var reader = await command.ExecuteReaderAsync())
{
@ -249,16 +251,17 @@ namespace DatenDB
DatenbankConnection.GetConnection().Close();
return resultList;
}
public static List<Auftrag> GetTourenListe(Benutzer fahrer)
public static List<Auftrag> GetTourenListe(Tour tour, DateTime liefertag)
{
DateTime dateTime = NaechsterLiefertag();
DateTime dateTime = liefertag;
if (dateTime == null) NaechsterLiefertag();
DatenbankConnection.GetConnection().Open();
List<Auftrag> resultList = new List<Auftrag>();
using (NpgsqlCommand command = new NpgsqlCommand())
{
command.Connection = DatenbankConnection.GetConnection();
command.CommandText = $"select {ACOLUMNS} from {TABLE} a join kundenverwaltung.kunde k on a.kunde_id = k.kunde_id where typ >= {(int)AuftragTyp.Standart} and a.liefertag = '{dateTime}' and a.benutzer_id = {fahrer.BenutzerID} and a.status <= {(int)AuftragStatus.Fertig} order by k.region, k.bezeichnung";
command.CommandText = $"select {ACOLUMNS} from {TABLE} a join kundenverwaltung.kunde k on a.kunde_id = k.kunde_id where typ >= {(int)AuftragTyp.Standart} and a.liefertag = '{dateTime}' and a.tour_id = {tour.TourID} and a.status <= {(int)AuftragStatus.Fertig} order by k.region, k.bezeichnung";
NpgsqlDataReader reader = command.ExecuteReader();
while (reader.Read()) resultList.Add(new Auftrag(reader));
@ -324,7 +327,11 @@ namespace DatenDB
if (string.IsNullOrWhiteSpace(zusatz))
{
if (date == null) command.CommandText = $"select {COLUMNS} from {TABLE} where kunde_id = {kunde.KundeID} and status = {(int)AuftragStatus.Abgeholt}";
else command.CommandText = $"select {COLUMNS} from {TABLE} where kunde_id = {kunde.KundeID} and {datum} = '{date}'";
else
{
if (datum == "Inventur") command.CommandText = $"select {COLUMNS} from {TABLE} where kunde_id = {kunde.KundeID} and liefertag > '{date}'";
else command.CommandText = $"select {COLUMNS} from {TABLE} where kunde_id = {kunde.KundeID} and {datum} = '{date}'";
}
}
else command.CommandText = $"select {COLUMNS} from {TABLE} where kunde_id = {kunde.KundeID} and status = {(int)AuftragStatus.Abgeholt} and zusatz ~* '{zusatz}'";
NpgsqlDataReader reader = command.ExecuteReader();
@ -559,6 +566,8 @@ namespace DatenDB
this.Abteilungen = reader.IsDBNull(19) ? AbteilungsStatus.Keine : (AbteilungsStatus)reader.GetInt16(19);
this.Rhythmus = reader.IsDBNull(20) ? RegRhythmen.Unbekannt : (RegRhythmen)reader.GetInt32(20);
this.Priority = (Priority)reader.GetInt32(21);
isLoaded = true;
}
#region Properties
@ -600,10 +609,13 @@ namespace DatenDB
_status = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Status)));
if (this.AuftragID != null)
// Erst wenn Auftrag geladen ist wird das Speichern durchgeführt.
if (isLoaded && this.AuftragID != null)
{
if (!FindAuftragStatus(this.AuftragID, Status))
SpeicherStatus(); // Automatisches Speichern
//if (!FindAuftragStatus(this.AuftragID, Status))
//Jede Statusänderung wird gespeichert. Klarer Verlauf ersichtlich.
SpeicherStatus(); // Automatisches Speichern
}
}
@ -772,7 +784,7 @@ namespace DatenDB
command.Parameters.AddWithValue("p0", auftragStatusID);
command.Parameters.AddWithValue("p1", this.AuftragID);
command.Parameters.AddWithValue("p2", Program.benutzer == null ? (object)DBNull.Value : Program.benutzer.BenutzerID);
command.Parameters.AddWithValue("p2", Program.benutzer.BenutzerID);
command.Parameters.AddWithValue("p3", (int)_status);
command.Parameters.AddWithValue("p4", DateTime.Now);

View File

@ -197,9 +197,19 @@ namespace Deckungsbeitrag.AA_Klassen
{
if (datum.HasValue)
{
conditions.Add("status = @status OR status = @status2");
parameters.Add(new NpgsqlParameter("@status", (int)statusFilter.Value));
parameters.Add(new NpgsqlParameter("@status2", (int)AuftragStatus.Herrichten));
if (kategorie.HasValue)
{
conditions.Add("(status = @status OR status = @status2");
parameters.Add(new NpgsqlParameter("@status", (int)statusFilter.Value));
parameters.Add(new NpgsqlParameter("@status2", (int)AuftragStatus.Herrichten));
}
else
{
conditions.Add("status = @status OR status = @status2");
parameters.Add(new NpgsqlParameter("@status", (int)statusFilter.Value));
parameters.Add(new NpgsqlParameter("@status2", (int)AuftragStatus.Herrichten));
}
}
else
{
@ -236,8 +246,16 @@ namespace Deckungsbeitrag.AA_Klassen
// Datum-Filter
if (datum.HasValue)
{
conditions.Add($"liefertag <= @liefertag");
parameters.Add(new NpgsqlParameter("@liefertag", datum.Value));
if (kategorie.HasValue)
{
conditions.Add($"liefertag <= @liefertag)");
parameters.Add(new NpgsqlParameter("@liefertag", datum.Value));
}
else
{
conditions.Add($"liefertag <= @liefertag");
parameters.Add(new NpgsqlParameter("@liefertag", datum.Value));
}
}
if (conditions.Count > 0)

View File

@ -42,6 +42,7 @@ namespace Deckungsbeitrag
private static Meldungen meldung = new Meldungen();
private static List<Auftrag> _auftragliste;
private static Benutzer _fahrer;
private static Tour _tour;
private static Benutzer _benutzer;
private static PrintDocument printdoc;
public static bool IsPhysicalPrint = false; // Globaler Schalter
@ -899,10 +900,10 @@ namespace Deckungsbeitrag
return DialogResult.Cancel;
}
public static Image TourenListe_Entwurf(List<Auftrag> auftragliste, Benutzer fahrer, int bottom)
public static Image TourenListe_Entwurf(List<Auftrag> auftragliste, Benutzer fahrer, int bottom, Tour tour)
{
DateTime liefertag = auftragliste[0].Liefertag;
int ezl = 50; int lastline = 0; int length = 0;
int ezl = 50; int lastline = 0;
float fontsize = 15; float fontsize2 = 30; float fontsize3 = 10;
int bitmapHeight = CalculateBitmapHeight(auftragliste);
@ -921,7 +922,7 @@ namespace Deckungsbeitrag
//FAHRER UND LIEFERTAG ZEILE 1 & 2
g.DrawString($"{DateTime.Now.ToString("dd.MM.yyyy - HH:mm")}", new Font("Arial", 10, FontStyle.Regular), Brushes.Black, bitmap.Width - 50 - datumSize.Width, adressblock.Y);
g.DrawString($"{fahrer.Vorname} {fahrer.Nachname}", new Font("Arial", fontsize2, FontStyle.Regular), Brushes.Black, adressblock);
g.DrawString($"{tour.Bezeichnung}-{fahrer.Vorname} {fahrer.Nachname}", new Font("Arial", fontsize2, FontStyle.Regular), Brushes.Black, adressblock);
g.DrawString($"{GetWochentagDeutsch(liefertag.DayOfWeek)} {liefertag.ToShortDateString()}", new Font("Arial", fontsize2, FontStyle.Regular), Brushes.Black, adressblock.X, lastline = adressblock.Y + (int)textSize3.Height);
//TOUR START UND ENDE ZEILE 3
g.DrawString($"Tour Start um:", new Font("Arial", fontsize, FontStyle.Regular), Brushes.Black, tabelle.X, lastline = lastline + (int)textSize3.Height + 40);
@ -941,10 +942,9 @@ namespace Deckungsbeitrag
Kunde knd = Kunde.GetKunde(string.Empty, auftrag.KundeID, string.Empty);
string kndName = string.Empty;
gesCont += auftrag.ContainerClean;
if (knd == null) return null;
//Image qrcode = Get_QR_Code(adresse, null);
//QR-Code
//g.DrawImage(qrcode, bitmap.Width - 150, 50, 120, 120);
if (knd.KundeNummer == "2320000") kndName = auftrag.ZusatzInfo;
else kndName = string.IsNullOrWhiteSpace(knd.Suchtext) ? knd.KundeName : knd.Suchtext;
@ -957,16 +957,15 @@ namespace Deckungsbeitrag
else style = FontStyle.Regular;
++idx1;
if (kndanzahl >= 15)
if (kndanzahl == 15)
{
if (kndanzahl >= 34)
if (kndanzahl == 34)
{
if (kndanzahl >= 54) length = (int)textSize3.Height * idx1 + 420;
else length = (int)textSize3.Height * idx1 + 280;
if (kndanzahl == 54) lastline += 140;
else lastline += 140;
}
else length = (int)textSize3.Height * idx1 + 140;
else lastline += 140;
}
else length = (int)textSize3.Height * idx1;
//ZEILE 1
g.DrawString($"{auftrag.Status.ToString()}", new Font("Arial", fontsize, style), Brushes.Black, tabelle.X, lastline + 5);
@ -1007,13 +1006,14 @@ namespace Deckungsbeitrag
//TODO: Reg.Aufträge einbauen. Besonderheit: Die Artikel sollen ebenfalls erscheinen.
//TODO: Zuweisung zu Fahrer muss geklärt werden.
}
public static void TourenListe_Drucken(List<Auftrag> auftragliste, Benutzer fahrer, object sender, Benutzer benutzer)
public static void TourenListe_Drucken(List<Auftrag> auftragliste, Tour tour, object sender, Benutzer benutzer, Benutzer fahrer)
{
if (auftragliste != null) _auftragliste = auftragliste;
if (fahrer != null) _fahrer = fahrer;
if (benutzer != null) _benutzer = benutzer;
string dateiName = $"{_auftragliste[0].Liefertag}_{_fahrer.BenutzerName}";
if (tour != null) _tour = tour;
string dateiName = $"{_auftragliste[0].Liefertag}_{_tour.Bezeichnung}_{_fahrer.BenutzerName}";
currentPage = 0; // WICHTIG: reset vor jedem Druck
string path = ConfigurationManager.AppSettings["DateiSavePfad"];
@ -1244,7 +1244,7 @@ namespace Deckungsbeitrag
{
if (pagesToPrint == currentPage) currentPage = 0;
int bottom = e.MarginBounds.Bottom - e.MarginBounds.Size.Height;
Image img = TourenListe_Entwurf(_auftragliste, _fahrer, bottom);
Image img = TourenListe_Entwurf(_auftragliste, _fahrer, bottom, _tour);
if (img == null) return;
pagesToPrint = img.Height / 1119;

View File

@ -91,7 +91,7 @@ namespace Deckungsbeitrag.AA_Klassen
if (tourID == null) command.CommandText = $"select {COLUMNS} from {TABLE} where benutzer_id = {arbeiterID} and liefertag = '{liefertag}'";
else
{
if (arbeiterID == null) command.CommandText = $"select {COLUMNS} from {TABLE} where liefertag = {liefertag}";
if (liefertag != null) command.CommandText = $"select {COLUMNS} from {TABLE} where liefertag = {liefertag}";
else command.CommandText = $"select {COLUMNS} from {TABLE} where tour_id = {tourID}";
}
NpgsqlDataReader reader = command.ExecuteReader();

View File

@ -22,6 +22,7 @@ using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
using System.Web.Configuration;
using System.Web.SessionState;
using System.Windows.Forms;
@ -100,6 +101,7 @@ namespace Deckungsbeitrag
}
static class Program
{
private static Mutex mutex;
public static Color Wirlblau = Settings.Default.Wirlblau;
public static ImageList imagelist = new ImageList();
public static string userid;
@ -119,21 +121,29 @@ namespace Deckungsbeitrag
/// Der Haupteinstiegspunkt für die Anwendung.
/// </summary>
[STAThread]
static void Main()
{
userid = ConfigurationManager.AppSettings["ConnectionString"].Split(';')[0];
userid = userid.Split('=')[1];
static void Main()
{
userid = ConfigurationManager.AppSettings["ConnectionString"].Split(';')[0];
userid = userid.Split('=')[1];
timer = new System.Timers.Timer
{
Interval = 1000
};
timer.Elapsed += Timer_Elapsed;
timer.Start();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Screen[] screens = Screen.AllScreens;
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Screen[] screens = Screen.AllScreens;
Application.UseWaitCursor = true;
string assemblyGUID = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(GuidAttribute), false).Cast<GuidAttribute>().First().Value;
mutex = new Mutex(true, $"Global\\{assemblyGUID}");
if (!mutex.WaitOne(TimeSpan.Zero, true))
{
MessageBox.Show("Diese Anwendung ist bereits laufend. Nur eine Instanz darf gleichzeitig ausgeführt werden.",
"Nur eine Instanz", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
return;
}
// Check, Install und Update wenn Update vorhanden.
if (CheckAndInstallUpdate())
{
@ -141,8 +151,7 @@ namespace Deckungsbeitrag
Software_Updated = true;
Settings.Default.LastSoftwareUpdate = DateTime.Now;
Application.UseWaitCursor = false;
Application.Exit();
//return;
return;
}
// Laden der Image-Liste mit Icons für ObjectListView in Export etc.
@ -184,7 +193,7 @@ namespace Deckungsbeitrag
if (istest) { Application.Run(new FormAufleger()); return; }
if (userid.StartsWith("ms") | userid.StartsWith("ps"))
{
{
switch (userid)
{
case var s when s.Contains("wstrasse"):
@ -206,9 +215,9 @@ namespace Deckungsbeitrag
default:
break;
}
}
else
{
}
else
{
// Öffnen der ReadMe wenn noch nicht geöffnet wurde.
//Open_ReadMe();
@ -238,11 +247,11 @@ namespace Deckungsbeitrag
Application.Run(new FormExpedit(loginForm.Person, screens));
break;
case BenutzerRolle.Frottee: //Containerbestückung Frotteewäsche
//BenutzerRolle Frottee = Expedit Frottee da die Maschine keine Anmeldung erfordert.
//BenutzerRolle Frottee = Expedit Frottee da die Maschine keine Anmeldung erfordert.
Application.Run(new FormExpedit(loginForm.Person, screens));
break;
case BenutzerRolle.Flach: //Containerbestückung Flachwäsche
//BenutzerRolle Flach = Expedit Frottee da die Maschine keine Anmeldung erfordert.
//BenutzerRolle Flach = Expedit Frottee da die Maschine keine Anmeldung erfordert.
Application.Run(new FormExpedit(loginForm.Person, screens));
break;
default:
@ -250,6 +259,7 @@ namespace Deckungsbeitrag
}
}
}
}
@ -551,12 +561,13 @@ namespace Deckungsbeitrag
private static bool CheckAndInstallUpdate()
{
string updatePath = Path.Combine(savePath, "Setup");
if (ConfigurationManager.AppSettings["ConnectionString"].Split(';')[4].Split('=')[1] == "Test_Wirl") updatePath = Path.Combine(ConfigurationManager.AppSettings["DateiSavePfad"], "Test") ?? "Test";
string currentVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString();
updatePath = @"N:\TECHNIK\Software\Wirl-Verwaltung\Setup"; // Ihr interner UNC-Pfad
//updatePath = @"N:\TECHNIK\Software\Wirl-Verwaltung\Setup"; // Ihr interner UNC-Pfad
try
{
string newVersion = File.ReadAllText(Path.Combine(updatePath, "Version.txt")).Trim();
string newVersion = File.Exists(Path.Combine(updatePath, "Version.txt")) ? File.ReadAllText(Path.Combine(updatePath, "Version.txt")).Trim() : string.Empty;
if (string.IsNullOrWhiteSpace(newVersion))
{

View File

@ -31,5 +31,5 @@ using System.Runtime.InteropServices;
//
// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden,
// indem Sie "*" wie unten gezeigt eingeben:
[assembly: AssemblyVersion("1.1.3.1")]
[assembly: AssemblyFileVersion("1.1.3.1")]
[assembly: AssemblyVersion("1.1.4.6")]
[assembly: AssemblyFileVersion("1.1.4.6")]

View File

@ -321,6 +321,12 @@
}
"Entry"
{
"MsmKey" = "8:_A2FA7AC58F6A16AB132434F8A00EA507"
"OwnerKey" = "8:_EEA0FC277F3C1BC119E28ABD40FA3C76"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_A41FC3BFD0E1CE905FCB1693E99348B8"
"OwnerKey" = "8:_AD2C2F4AADC342899908C708EB4F4A72"
"MsmSig" = "8:_UNDEFINED"
@ -447,6 +453,12 @@
}
"Entry"
{
"MsmKey" = "8:_EEA0FC277F3C1BC119E28ABD40FA3C76"
"OwnerKey" = "8:_AD2C2F4AADC342899908C708EB4F4A72"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_EF6D58F917144384701E1DBDFB979BD8"
"OwnerKey" = "8:_125834DE4128EDE3F82BFC1A45B2ACD9"
"MsmSig" = "8:_UNDEFINED"
@ -472,6 +484,12 @@
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_EEA0FC277F3C1BC119E28ABD40FA3C76"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_16723AF5DFDEF26FC6A07BEB7D389737"
"MsmSig" = "8:_UNDEFINED"
}
@ -1603,6 +1621,37 @@
"IsDependency" = "11:TRUE"
"IsolateTo" = "8:"
}
"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_EEA0FC277F3C1BC119E28ABD40FA3C76"
{
"AssemblyRegister" = "3:1"
"AssemblyIsInGAC" = "11:FALSE"
"AssemblyAsmDisplayName" = "8:TrelloIntegration, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"
"ScatterAssemblies"
{
"_EEA0FC277F3C1BC119E28ABD40FA3C76"
{
"Name" = "8:TrelloIntegration.dll"
"Attributes" = "3:512"
}
}
"SourcePath" = "8:TrelloIntegration.dll"
"TargetName" = "8:"
"Tag" = "8:"
"Folder" = "8:_C848DFB5E4D140A7A7F5E1F129613626"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:TRUE"
"IsolateTo" = "8:"
}
"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_EF6D58F917144384701E1DBDFB979BD8"
{
"AssemblyRegister" = "3:1"
@ -1690,15 +1739,15 @@
{
"Name" = "8:Microsoft Visual Studio"
"ProductName" = "8:SetupVerwaltung"
"ProductCode" = "8:{D9B50D82-0DA0-42AA-BA1A-0C403DB66D1E}"
"PackageCode" = "8:{B8F0DE4F-7514-40E3-9E53-8690D6CF5643}"
"ProductCode" = "8:{BABBCDCC-82FB-4255-A001-52CEF9447E68}"
"PackageCode" = "8:{003301E2-76CD-42AB-AA06-006C82D2B296}"
"UpgradeCode" = "8:{2DC7CE56-8D1C-42EB-B326-2E887EBB7F5A}"
"AspNetVersion" = "8:"
"RestartWWWService" = "11:FALSE"
"RemovePreviousVersions" = "11:TRUE"
"DetectNewerInstalledVersion" = "11:TRUE"
"InstallAllUsers" = "11:FALSE"
"ProductVersion" = "8:1.1.31"
"ProductVersion" = "8:1.1.46"
"Manufacturer" = "8:Kilian Wirl GmbH"
"ARPHELPTELEPHONE" = "8:"
"ARPHELPLINK" = "8:"

View File

@ -0,0 +1,51 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TrelloIntegration
{
/// <summary>
/// Optionen zum Erstellen einer Trello-Karte
/// </summary>
public class CreateCardOptions
{
/// <summary>
/// Kartentitel (Pflicht)
/// </summary>
public string Name { get; set; } = "TestKarte";
/// <summary>
/// Beschreibung der Karte (optional)
/// </summary>
public string Desc { get; set; }
/// <summary>
/// ID der Ziel-Liste (Pflicht)
/// </summary>
public string IdList { get; set; } = "6a1fcdc9a1995f42c537ae10";
/// <summary>
/// Position der Karte in der Liste: "top", "bottom" oder eine Zahl (optional)
/// </summary>
public string Pos { get; set; }
/// <summary>
/// Liste von Label-IDs für die Karte (optional)
/// </summary>
public List<string> IdLabels { get; set; }
/// <summary>
/// Fälligkeitsdatum (Due Date) der Karte (optional)
/// Dieses Datum wird in UTC an die Trello-API übergeben.
/// </summary>
public DateTime? DueDate { get; set; }
/// <summary>
/// Startdatum der Karte (optional)
/// Dieses Datum wird in UTC an die Trello-API übergeben.
/// </summary>
public DateTime? StartDate { get; set; }
}
}

View File

@ -0,0 +1,33 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// Allgemeine Informationen über eine Assembly werden über die folgenden
// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
// die einer Assembly zugeordnet sind.
[assembly: AssemblyTitle("TrelloIntegration")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("TrelloIntegration")]
[assembly: AssemblyCopyright("Copyright © 2026")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly
// für COM-Komponenten unsichtbar. Wenn Sie auf einen Typ in dieser Assembly von
// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen.
[assembly: ComVisible(false)]
// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird
[assembly: Guid("260a0604-e43a-4731-a861-1db7ed19ff5d")]
// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
//
// Hauptversion
// Nebenversion
// Buildnummer
// Revision
//
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TrelloIntegration
{
/// <summary>
/// Minimaler Response für eine erstellte Trello-Karte
/// </summary>
public class TrelloCard
{
public string Id { get; set; }
public string Name { get; set; }
public string Desc { get; set; }
public string IdList { get; set; }
public string ShortUrl { get; set; }
public DateTime? DueDate { get; set; }
public DateTime? StartDate { get; set; }
}
}

View File

@ -0,0 +1,153 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
namespace TrelloIntegration
{
/// <summary>
/// Trello-Karten-Client für WinForms-Anwendungen (.NET Framework 4.8, C# 7.3)
/// Erstellt Karten via Trello REST API über HttpClient.
/// </summary>
public class TrelloCardClient : IDisposable
{
private readonly string _apiKey;
private readonly string _token;
private readonly HttpClient _httpClient;
/// <summary>
/// Initialisiert einen neuen TrelloCardClient.
/// </summary>
/// <param name="apiKey">Trello API Key</param>
/// <param name="token">Trello API Token mit write-Recht</param>
public TrelloCardClient(string apiKey, string token)
{
_apiKey = apiKey ?? throw new ArgumentNullException(nameof(apiKey));
_token = token ?? throw new ArgumentNullException(nameof(token));
_httpClient = new HttpClient
{
BaseAddress = new Uri("https://api.trello.com/1/")
};
}
/// <summary>
/// Erstellt eine neue Trello-Karte asynchron und gibt die Roh-JSON-Antwort zurück.
/// </summary>
/// <param name="options">Konfiguration der Karte (Name, Liste, Beschreibung, Labels, DueDate, StartDate)</param>
/// <returns>Antwort-JSON als String (enthaltend die erstellte Karte)</returns>
public async Task<string> CreateCardAsync(CreateCardOptions options)
{
ValidateOptions(options);
var values = new Dictionary<string, string>
{
["key"] = _apiKey,
["token"] = _token,
["idList"] = options.IdList,
["name"] = options.Name
};
if (!string.IsNullOrWhiteSpace(options.Desc))
values["desc"] = options.Desc;
if (!string.IsNullOrWhiteSpace(options.Pos))
values["pos"] = options.Pos;
if (options.IdLabels != null && options.IdLabels.Count > 0)
values["idLabels"] = string.Join(",", options.IdLabels);
if (options.DueDate.HasValue)
values["due"] = options.DueDate.Value.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm");
if (options.StartDate.HasValue)
values["start"] = options.StartDate.Value.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm");
var content = new FormUrlEncodedContent(values);
var response = await _httpClient.PostAsync("cards", content);
var responseBody = await response.Content.ReadAsStringAsync();
if (!response.IsSuccessStatusCode)
{
throw new HttpRequestException(
$"Trello API Fehler {response.StatusCode}: {responseBody}");
}
return responseBody;
}
/// <summary>
/// Erstellt eine Karte und gibt das Ergebnis als TrelloCard-Objekt zurück.
/// </summary>
public async Task<TrelloCard> CreateCardAndParseAsync(CreateCardOptions options)
{
var json = await CreateCardAsync(options);
return ParseTrelloCard(json);
}
private static TrelloCard ParseTrelloCard(string json)
{
// Minimaler Parser ohne System.Text.Json (für .NET Framework 4.8)
// Extrahiert die wichtigsten Felder aus der JSON-Antwort
var card = new TrelloCard();
card.Id = ExtractJsonValue(json, "id");
card.Name = ExtractJsonValue(json, "name");
card.Desc = ExtractJsonValue(json, "desc");
card.IdList = ExtractJsonValue(json, "idList");
card.ShortUrl = ExtractJsonValue(json, "shortUrl");
var due = ExtractJsonValue(json, "due");
if (!string.IsNullOrWhiteSpace(due))
if (DateTime.TryParse(due, out var dtDue)) card.DueDate = dtDue;
else card.DueDate = null;
var start = ExtractJsonValue(json, "start");
if (!string.IsNullOrWhiteSpace(start))
if (DateTime.TryParse(start, out var dtStart)) card.StartDate = dtStart;
else card.StartDate = null;
return card;
}
private static string ExtractJsonValue(string json, string key)
{
// Einfacher JSON-String-Extractor für "key": "value"
var pattern = "\"" + key + "\"\\s*:\\s*\"";
var startIndex = json.IndexOf(pattern, StringComparison.Ordinal);
if (startIndex < 0)
return null;
startIndex += pattern.Length;
var endIndex = json.IndexOf("\"", startIndex);
if (endIndex < 0)
return null;
return json.Substring(startIndex, endIndex - startIndex);
}
private void ValidateOptions(CreateCardOptions options)
{
if (options == null)
throw new ArgumentNullException(nameof(options));
if (string.IsNullOrWhiteSpace(options.Name))
throw new ArgumentException("Name ist erforderlich.", nameof(options.Name));
if (string.IsNullOrWhiteSpace(options.IdList))
throw new ArgumentException("IdList ist erforderlich.", nameof(options.IdList));
}
/// <summary>
/// Gibt die Ressourcen des Clients frei (empiohlen).
/// </summary>
public void Dispose()
{
_httpClient?.Dispose();
}
}
}

View File

@ -0,0 +1,138 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using static System.Net.Mime.MediaTypeNames;
namespace TrelloIntegration
{
/// <summary>
/// Verschlüsselt und entschlüsselt Trello API-Key und Token mit AES.
/// </summary>
public static class TrelloConfig
{
/// <summary>
/// Geheimer Schlüssel für Verschlüsselung (muss sicher gespeichert werden!)
/// In Produktion besser aus Umgebungsvariablen oder sicherem Speicher lesen.
/// </summary>
private const string SecretKey = "DEIN_GEHEIMER_SCHLUESSEL_32_CHAR"; // 32 Zeichen für AES-256
/// <summary>
/// Verschlüsselt einen Text und gibt Base64 zurück.
/// </summary>
public static string Encrypt(string plainText)
{
if (string.IsNullOrEmpty(plainText))
throw new ArgumentException("Text darf nicht leer sein", nameof(plainText));
var aes = Aes.Create();
aes.Key = Encoding.UTF8.GetBytes(SecretKey);
aes.IV = new byte[16]; // IV für Demo; in Produktion zufällig generieren
var encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
var plainBytes = Encoding.UTF8.GetBytes(plainText);
var cipherBytes = encryptor.TransformFinalBlock(plainBytes, 0, plainBytes.Length);
// IV + verschlüsselte Daten speichern (für Produktion mit zufälligem IV)
var combined = new byte[aes.IV.Length + cipherBytes.Length];
Array.Copy(aes.IV, 0, combined, 0, aes.IV.Length);
Array.Copy(cipherBytes, 0, combined, aes.IV.Length, cipherBytes.Length);
return Convert.ToBase64String(combined);
}
/// <summary>
/// Entschlüsselt einen Base64-Text.
/// </summary>
public static string Decrypt(string encryptedBase64)
{
if (string.IsNullOrEmpty(encryptedBase64))
throw new ArgumentException("Text darf nicht leer sein", nameof(encryptedBase64));
var combined = Convert.FromBase64String(encryptedBase64);
var aes = Aes.Create();
aes.Key = Encoding.UTF8.GetBytes(SecretKey);
// IV aus den ersten 16 Bytes extrahieren
var iv = new byte[16];
Array.Copy(combined, 0, iv, 0, 16);
aes.IV = iv;
var decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
var cipherBytes = new byte[combined.Length - 16];
Array.Copy(combined, 16, cipherBytes, 0, cipherBytes.Length);
var plainBytes = decryptor.TransformFinalBlock(cipherBytes, 0, cipherBytes.Length);
return Encoding.UTF8.GetString(plainBytes);
}
/// <summary>
/// Erstellt verschlüsselte Werte für App.config (einmalig ausführen).
/// </summary>
public static void CreateEncryptedConfigValues(string apiKey, string token)
{
var encryptedKey = Encrypt(apiKey);
var encryptedToken = Encrypt(token);
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings.Remove("TrelloApiKeyEncrypted");
config.AppSettings.Settings.Add("TrelloApiKeyEncrypted", encryptedKey);
config.AppSettings.Settings.Remove("TrelloTokenEncrypted");
config.AppSettings.Settings.Add("TrelloTokenEncrypted", encryptedToken);
config.Save();
Console.WriteLine("=== FÜR APP.CONFIG ===");
Console.WriteLine($"<add key=\"TrelloApiKeyEncrypted\" value=\"{encryptedKey}\"/>");
Console.WriteLine($"<add key=\"TrelloTokenEncrypted\" value=\"{encryptedToken}\"/>");
Console.WriteLine("======================");
}
/// <summary>
/// Gibt den API-Key aus App.config (entschlüsselt).
/// </summary>
public static string GetApiKey()
{
try
{
var encrypted = System.Configuration.ConfigurationManager
.AppSettings["TrelloApiKeyEncrypted"];
return string.IsNullOrEmpty(encrypted) ? null : Decrypt(encrypted);
}
catch
{
return null;
}
}
/// <summary>
/// Gibt den Token aus App.config (entschlüsselt).
/// </summary>
public static string GetToken()
{
try
{
var encrypted = System.Configuration.ConfigurationManager
.AppSettings["TrelloTokenEncrypted"];
return string.IsNullOrEmpty(encrypted) ? null : Decrypt(encrypted);
}
catch
{
return null;
}
}
/// <summary>
/// Prüft, ob verschlüsselte Credentials in App.config vorhanden sind.
/// </summary>
public static bool HasCredentials()
{
var key = System.Configuration.ConfigurationManager.AppSettings["TrelloApiKeyEncrypted"];
var token = System.Configuration.ConfigurationManager.AppSettings["TrelloTokenEncrypted"];
return !string.IsNullOrEmpty(key) && !string.IsNullOrEmpty(token);
}
}
}

View File

@ -0,0 +1,90 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{260A0604-E43A-4731-A861-1DB7ED19FF5D}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>TrelloIntegration</RootNamespace>
<AssemblyName>TrelloIntegration</AssemblyName>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Meziantou.Framework.Win32.CredentialManager, Version=1.7.18.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Meziantou.Framework.Win32.CredentialManager.1.7.18\lib\net462\Meziantou.Framework.Win32.CredentialManager.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Bcl.AsyncInterfaces.9.0.0\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Buffers, Version=4.0.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Buffers.4.6.1\lib\net462\System.Buffers.dll</HintPath>
</Reference>
<Reference Include="System.Configuration" />
<Reference Include="System.Core" />
<Reference Include="System.IO.Pipelines, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.IO.Pipelines.9.0.0\lib\net462\System.IO.Pipelines.dll</HintPath>
</Reference>
<Reference Include="System.Memory, Version=4.0.5.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Memory.4.6.3\lib\net462\System.Memory.dll</HintPath>
</Reference>
<Reference Include="System.Numerics" />
<Reference Include="System.Numerics.Vectors, Version=4.1.6.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Numerics.Vectors.4.6.1\lib\net462\System.Numerics.Vectors.dll</HintPath>
</Reference>
<Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.3.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Runtime.CompilerServices.Unsafe.6.1.2\lib\net462\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
</Reference>
<Reference Include="System.Text.Encodings.Web, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Text.Encodings.Web.9.0.0\lib\net462\System.Text.Encodings.Web.dll</HintPath>
</Reference>
<Reference Include="System.Text.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Text.Json.9.0.0\lib\net462\System.Text.Json.dll</HintPath>
</Reference>
<Reference Include="System.Threading.Tasks.Extensions, Version=4.2.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath>
</Reference>
<Reference Include="System.ValueTuple, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
<HintPath>..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll</HintPath>
</Reference>
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="CreateCardOptions.cs" />
<Compile Include="TrelloCard.cs" />
<Compile Include="TrelloCardClient.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="TrelloConfig.cs" />
</ItemGroup>
<ItemGroup>
<None Include="app.config" />
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.3.0" newVersion="6.0.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.5.0" newVersion="4.0.5.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.5.0" newVersion="4.0.5.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.6.0" newVersion="4.1.6.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Meziantou.Framework.Win32.CredentialManager" version="1.7.18" targetFramework="net48" />
<package id="Microsoft.Bcl.AsyncInterfaces" version="9.0.0" targetFramework="net48" />
<package id="System.Buffers" version="4.6.1" targetFramework="net48" />
<package id="System.IO.Pipelines" version="9.0.0" targetFramework="net48" />
<package id="System.Memory" version="4.6.3" targetFramework="net48" />
<package id="System.Numerics.Vectors" version="4.6.1" targetFramework="net48" />
<package id="System.Runtime.CompilerServices.Unsafe" version="6.1.2" targetFramework="net48" />
<package id="System.Text.Encodings.Web" version="9.0.0" targetFramework="net48" />
<package id="System.Text.Json" version="9.0.0" targetFramework="net48" />
<package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net48" />
<package id="System.ValueTuple" version="4.5.0" targetFramework="net48" />
</packages>

View File

@ -27,6 +27,14 @@ public class UserSettingsManager
public Point LocationButtonNeuerStand { get; set; } = new Point(0, 0);
public Point LocationButtonNeueAufgabe { get; set; } = new Point(0, 0);
public Byte[] OLV_State { get; set; }
public Byte[] OLV_Rampe_State { get; set; }
public Byte[] OLV_Vorbereitet_State { get; set; }
public Byte[] OLV_Sonder_State { get; set; }
public Byte[] OLV_Geschaeft_State { get; set; }
//TODO: UserSetting Properties eintragen und in EinstellungsScreen abrufen.
@ -72,6 +80,10 @@ public class UserSettingsManager
LocationButtonNeueAufgabe = loadedSettings.LocationButtonNeueAufgabe;
OLV_State = loadedSettings.OLV_State;
OLV_Geschaeft_State = loadedSettings.OLV_Geschaeft_State;
OLV_Rampe_State = loadedSettings.OLV_Rampe_State;
OLV_Sonder_State = loadedSettings.OLV_Sonder_State;
OLV_Vorbereitet_State = loadedSettings.OLV_Vorbereitet_State;
// Weitere Properties hier zuweisen
//TODO: Weitere Properties von oben hier zuweisen
}

View File

@ -621,6 +621,10 @@
<Folder Include="Old-Forms\" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="TrelloIntegration\TrelloIntegration.csproj">
<Project>{260a0604-e43a-4731-a861-1db7ed19ff5d}</Project>
<Name>TrelloIntegration</Name>
</ProjectReference>
<ProjectReference Include="VirtualKeyboard\VirtualKeyboard.csproj">
<Project>{d5d68e54-f738-45e5-82fd-da987f2e0589}</Project>
<Name>VirtualKeyboard</Name>

View File

@ -1,7 +1,7 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 18
VisualStudioVersion = 18.4.11626.88 stable
VisualStudioVersion = 18.4.11626.88
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Verwaltung", "Verwaltung.csproj", "{1CDFBC6A-240A-4D59-9F9E-35041D9ACCC6}"
EndProject
@ -9,6 +9,8 @@ Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "SetupVerwaltung", "SetupVer
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VirtualKeyboard", "VirtualKeyboard\VirtualKeyboard.csproj", "{D5D68E54-F738-45E5-82FD-DA987F2E0589}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TrelloIntegration", "TrelloIntegration\TrelloIntegration.csproj", "{260A0604-E43A-4731-A861-1DB7ED19FF5D}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -25,6 +27,10 @@ Global
{D5D68E54-F738-45E5-82FD-DA987F2E0589}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D5D68E54-F738-45E5-82FD-DA987F2E0589}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D5D68E54-F738-45E5-82FD-DA987F2E0589}.Release|Any CPU.Build.0 = Release|Any CPU
{260A0604-E43A-4731-A861-1DB7ED19FF5D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{260A0604-E43A-4731-A861-1DB7ED19FF5D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{260A0604-E43A-4731-A861-1DB7ED19FF5D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{260A0604-E43A-4731-A861-1DB7ED19FF5D}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@ -1,15 +1,15 @@
=====================================
NEUIGKEITEN - Version 1.1.3.1
NEUIGKEITEN - Version 1.1.4.6
=====================================
Build-Info:
- Build-Typ: Release Build
- Erledigte TODOs: 9
- Offene TODOs: 22
- Erledigte TODOs: 10
- Offene TODOs: 21
- Install-Reminders: 0
- Changes: 31
- Changes: 32
=== ✨ CHANGES (31) ===
=== ✨ CHANGES (32) ===
## ArtikelVW.cs ##
- ✨ Reklamation als Spalte hinzugefügt und Anzeigen implementiert. Sowohl bei KundeArtikel als auch bei NW_Artikel.
@ -30,6 +30,7 @@ Build-Info:
- ✨ Im Tab Rampe wird bei DoppelClick der Auftrag als gewaschen markiert und im Tab Aufträge heute sichtbar.
- ✨ Im Tab Vorbereitet wird beim Ändern der sauberen Containeranzahl gefragt ob die Etiketten neu gedruckt werden sollen.
- ✨ NumericUpDown markiert automatisch den Inhalt. Erleichtert die Eingabe.
- ✨ Trello-Karte nach Liefertagänderung kann von Admin oder Verwaltung erstellt werden.
- ✨ Wenn ein anderer Fahrer ausgewählt wird, wird auch die Priority laut dem Fahrer geändert.
- ✨ Wenn Expedit NeuerAuftrag aufruft wird gefragt welcher Auftrag gewünscht ist. Geschäftkunde = Geschäft (Notwendig bis ausschließlich Fahrer die Standardaufträge erstellen)
@ -71,5 +72,5 @@ Build-Info:
Keine Install-Reminder vorhanden ✅
Installation: 28.05.2026 12:28
Installation: 08.06.2026 13:02
=====================================