Benutzer Diskussion:Fin: Unterschied zwischen den Versionen
Fin (Diskussion | Beiträge) K (np) |
Metaz (Diskussion | Beiträge) |
||
Zeile 1: | Zeile 1: | ||
− | + | <nowiki>using System; | |
− | + | using System.Collections.Generic; | |
− | + | using System.ComponentModel; | |
− | : | + | using System.Data; |
+ | using System.Drawing; | ||
+ | using System.Text; | ||
+ | using System.Windows.Forms; | ||
+ | using System.Xml; | ||
+ | using System.IO; | ||
+ | |||
+ | using NHibernate; | ||
+ | |||
+ | using model; | ||
+ | |||
+ | namespace tool | ||
+ | { | ||
+ | public partial class Zahlungsimport : Form | ||
+ | { | ||
+ | public Zahlungsimport() | ||
+ | { | ||
+ | InitializeComponent(); | ||
+ | } | ||
+ | |||
+ | string bankAccount, kassaAccount, beitragsAccount; | ||
+ | XmlNamespaceManager xnsmgr; | ||
+ | StringBuilder fehlendeMitglieder; | ||
+ | |||
+ | private void btnImport_Click(object sender, EventArgs e) | ||
+ | { | ||
+ | OpenFileDialog ofd = new OpenFileDialog(); | ||
+ | |||
+ | if (ofd.ShowDialog() == DialogResult.OK) | ||
+ | { | ||
+ | |||
+ | fehlendeMitglieder = new StringBuilder(); | ||
+ | string filename = ofd.FileName; | ||
+ | |||
+ | XmlDocument xd = new XmlDocument(); | ||
+ | xnsmgr = new XmlNamespaceManager(xd.NameTable); | ||
+ | xnsmgr.AddNamespace("act", "http://www.gnucash.org/XML/act"); | ||
+ | xnsmgr.AddNamespace("gnc", "http://www.gnucash.org/XML/gnc"); | ||
+ | xnsmgr.AddNamespace("trn", "http://www.gnucash.org/XML/trn"); | ||
+ | xnsmgr.AddNamespace("split", "http://www.gnucash.org/XML/split"); | ||
+ | |||
+ | |||
+ | |||
+ | xd.Load(filename); | ||
+ | |||
+ | beitragsAccount = xd.SelectSingleNode("//gnc:account[act:name='4000 Erträge aus Mitgliedsbeiträgen']/act:id", xnsmgr).InnerText; | ||
+ | bankAccount = xd.SelectSingleNode("//gnc:account[act:name='2810 Bank']/act:id", xnsmgr).InnerText; | ||
+ | kassaAccount = xd.SelectSingleNode("//gnc:account[act:name='2710 Hauptkassa']/act:id", xnsmgr).InnerText; | ||
+ | |||
+ | /* XmlNodeList kassaPayments, bankPayments, einzugPayments, sonstigePayments; | ||
+ | |||
+ | kassaPayments = xd.SelectNodes("//gnc:transaction[trn:splits/trn:split/split:account='"+kassaAccount+ "' and trn:splits/trn:split/split:account='"+beitragsAccount+ "']", xnsmgr); | ||
+ | bankPayments = xd.SelectNodes( "//gnc:transaction[trn:splits/trn:split/split:account='" + bankAccount + "' and trn:splits/trn:split/split:account='" + beitragsAccount + "' and not(contains(trn:description,'Einzug'))]", xnsmgr); | ||
+ | einzugPayments = xd.SelectNodes("//gnc:transaction[trn:splits/trn:split/split:account='" + bankAccount + "' and trn:splits/trn:split/split:account='" + beitragsAccount + "' and contains(trn:description,'Einzug')]", xnsmgr); | ||
+ | sonstigePayments = xd.SelectNodes("//gnc:transaction[not(trn:splits/trn:split/split:account='" + kassaAccount + "' or trn:splits/trn:split/split:account='" + bankAccount + "') and trn:splits/trn:split/split:account='" + beitragsAccount + "']", xnsmgr); | ||
+ | */ | ||
+ | |||
+ | DateTime cut = new DateTime(2007, 2, 14); | ||
+ | |||
+ | using (ISession session = SessionFactoryHelper.SessionFactory.OpenSession()) | ||
+ | { | ||
+ | List<Zahlung> zahlungen = new List<Zahlung>(); | ||
+ | foreach (XmlNode transaction in xd.SelectNodes("//gnc:transaction[trn:splits/trn:split/split:account='" + beitragsAccount + "']", xnsmgr)) | ||
+ | { | ||
+ | zahlungen.AddRange(ProcessTransaction(session, transaction)); | ||
+ | } | ||
+ | |||
+ | foreach (Zahlung z in zahlungen) | ||
+ | { | ||
+ | if (z.Datum > cut) | ||
+ | session.Save(z); | ||
+ | } | ||
+ | |||
+ | if (fehlendeMitglieder.Length != 0) | ||
+ | { | ||
+ | MessageBox.Show(fehlendeMitglieder.ToString()); | ||
+ | } | ||
+ | |||
+ | session.Flush(); | ||
+ | } | ||
+ | |||
+ | |||
+ | } | ||
+ | } | ||
+ | |||
+ | private IEnumerable<Zahlung> ProcessTransaction(ISession session, XmlNode transaction) | ||
+ | { | ||
+ | Zahlungsart art=null; | ||
+ | |||
+ | try | ||
+ | { | ||
+ | XmlNodeList splitList = transaction.SelectNodes("trn:splits/trn:split[not(split:account = '" + beitragsAccount + "')]", xnsmgr); | ||
+ | if (splitList.Count != 1) | ||
+ | throw new Exception("Es sind nur simple Transaktionen erlaubt!"); | ||
+ | |||
+ | XmlNode split = splitList[0]; | ||
+ | string account = split.SelectSingleNode("split:account", xnsmgr).InnerText; | ||
+ | if (account == bankAccount) | ||
+ | { | ||
+ | if (transaction["trn:description"].InnerText.Contains("Einzug")) | ||
+ | return ProcessEinzug(session, transaction); | ||
+ | else | ||
+ | art = session.CreateQuery("from Zahlungsart z where z.Name = 'Überweisung'").UniqueResult<Zahlungsart>(); | ||
+ | } | ||
+ | else if (account == kassaAccount) | ||
+ | { | ||
+ | art = session.CreateQuery("from Zahlungsart z where z.Name = 'Bar'").UniqueResult<Zahlungsart>(); | ||
+ | } | ||
+ | |||
+ | if (art == null) | ||
+ | throw new Exception("Konnte Transaktionstype nicht feststellen!"); | ||
+ | |||
+ | return ProcessSingleTransaction(session, transaction, art); | ||
+ | } | ||
+ | catch (Exception ex) | ||
+ | { | ||
+ | if (ex.Message.StartsWith("Mitglied ") && ex.Message.EndsWith(" nicht gefunden!")) | ||
+ | { | ||
+ | fehlendeMitglieder.AppendLine(ex.Message); | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | string error = ex.ToString() + Environment.NewLine + Environment.NewLine + transaction.OuterXml; | ||
+ | MessageBox.Show(error); | ||
+ | } | ||
+ | return new Zahlung[0]; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | IEnumerable<Zahlung> ProcessEinzug(ISession session, XmlNode transaction) | ||
+ | { | ||
+ | List<Zahlung> zahlungen = new List<Zahlung>(); | ||
+ | |||
+ | Zahlungsart art = session.CreateQuery("from Zahlungsart z where z.Name = 'Einzug'").UniqueResult<Zahlungsart>(); | ||
+ | DateTime datum = DateTime.Parse(transaction["trn:date-posted"].InnerText.Substring(0, 19), System.Globalization.CultureInfo.InvariantCulture); | ||
+ | string werts = transaction.SelectSingleNode("trn:splits/trn:split[split:account = '" + beitragsAccount + "']", xnsmgr)["split:value"].InnerText; | ||
+ | int wert = int.Parse(werts.Substring(0, werts.IndexOf('/'))) / int.Parse(werts.Substring(werts.IndexOf('/') + 1)); | ||
+ | wert *= -1; //Ertragskonto hat negatives Vorzeichen im vergleich zum bestandskonto.... | ||
+ | |||
+ | string mitgliederString = transaction["trn:description"].InnerText; | ||
+ | mitgliederString = mitgliederString.Substring(0, mitgliederString.IndexOf(')')); | ||
+ | mitgliederString = mitgliederString.Substring(mitgliederString.IndexOf('(')+1); | ||
+ | |||
+ | string[] mitgliedernamen = Array.ConvertAll<string, string>(mitgliederString.Split(','), delegate(string x) { return x.Trim(); } ); | ||
+ | |||
+ | if (mitgliedernamen.Length * 20 != wert) | ||
+ | throw new Exception("Anzahl der Mitglieder passt nicht zum Wert des Einzugs"); | ||
+ | |||
+ | StringBuilder missing = new StringBuilder(); | ||
+ | |||
+ | foreach (string mitgliedsname in mitgliedernamen) | ||
+ | { | ||
+ | Mitglied m = session.CreateQuery("from Mitglied m where m.Vorname+' '+m.Nachname = :name or m.Nachname+' '+m.Vorname = :name").SetParameter("name", mitgliedsname).UniqueResult<Mitglied>(); | ||
+ | |||
+ | if (m == null) | ||
+ | { | ||
+ | fehlendeMitglieder.AppendLine("Mitglied '" + mitgliedsname + "' nicht gefunden!"); | ||
+ | continue; | ||
+ | } | ||
+ | |||
+ | Zahlung z = new Zahlung(); | ||
+ | z.Mitglied = m; | ||
+ | z.Art = art; | ||
+ | z.Wert = 20; | ||
+ | z.Datum = datum; | ||
+ | z.Kommentar = "Buchungsimport am " + DateTime.Today; | ||
+ | |||
+ | zahlungen.Add(z); | ||
+ | } | ||
+ | |||
+ | return zahlungen; | ||
+ | } | ||
+ | |||
+ | IEnumerable<Zahlung> ProcessSingleTransaction(ISession session, XmlNode transaction, Zahlungsart art) | ||
+ | { | ||
+ | string name = transaction["trn:description"].InnerText.Replace("Mitgliedsbeitrag ", ""); | ||
+ | |||
+ | Mitglied m = session.CreateQuery("from Mitglied m where m.Vorname+' '+m.Nachname = :name or m.Nachname+' '+m.Vorname = :name").SetParameter("name", name).UniqueResult<Mitglied>(); | ||
+ | |||
+ | if (m == null) | ||
+ | throw new Exception("Mitglied '" + name + "' nicht gefunden!"); | ||
+ | |||
+ | string werts = transaction.SelectSingleNode("trn:splits/trn:split[split:account = '" + beitragsAccount + "']", xnsmgr)["split:value"].InnerText; | ||
+ | int wert = int.Parse(werts.Substring(0, werts.IndexOf('/'))) / int.Parse(werts.Substring(werts.IndexOf('/') + 1)); | ||
+ | |||
+ | Zahlung z = new Zahlung(); | ||
+ | z.Mitglied = m; | ||
+ | z.Art = art; | ||
+ | z.Wert = wert*-1; //Ertragskonto hat negatives Vorzeichen im vergleich zum bestandskonto.... | ||
+ | z.Datum = DateTime.Parse(transaction["trn:date-posted"].InnerText.Substring(0, 19), System.Globalization.CultureInfo.InvariantCulture); | ||
+ | z.Kommentar = "Buchungsimport am " + DateTime.Today; | ||
+ | |||
+ | return new Zahlung[] { z }; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </nowiki> |
Version vom 8. Januar 2008, 20:55 Uhr
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Xml; using System.IO; using NHibernate; using model; namespace tool { public partial class Zahlungsimport : Form { public Zahlungsimport() { InitializeComponent(); } string bankAccount, kassaAccount, beitragsAccount; XmlNamespaceManager xnsmgr; StringBuilder fehlendeMitglieder; private void btnImport_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); if (ofd.ShowDialog() == DialogResult.OK) { fehlendeMitglieder = new StringBuilder(); string filename = ofd.FileName; XmlDocument xd = new XmlDocument(); xnsmgr = new XmlNamespaceManager(xd.NameTable); xnsmgr.AddNamespace("act", "http://www.gnucash.org/XML/act"); xnsmgr.AddNamespace("gnc", "http://www.gnucash.org/XML/gnc"); xnsmgr.AddNamespace("trn", "http://www.gnucash.org/XML/trn"); xnsmgr.AddNamespace("split", "http://www.gnucash.org/XML/split"); xd.Load(filename); beitragsAccount = xd.SelectSingleNode("//gnc:account[act:name='4000 Erträge aus Mitgliedsbeiträgen']/act:id", xnsmgr).InnerText; bankAccount = xd.SelectSingleNode("//gnc:account[act:name='2810 Bank']/act:id", xnsmgr).InnerText; kassaAccount = xd.SelectSingleNode("//gnc:account[act:name='2710 Hauptkassa']/act:id", xnsmgr).InnerText; /* XmlNodeList kassaPayments, bankPayments, einzugPayments, sonstigePayments; kassaPayments = xd.SelectNodes("//gnc:transaction[trn:splits/trn:split/split:account='"+kassaAccount+ "' and trn:splits/trn:split/split:account='"+beitragsAccount+ "']", xnsmgr); bankPayments = xd.SelectNodes( "//gnc:transaction[trn:splits/trn:split/split:account='" + bankAccount + "' and trn:splits/trn:split/split:account='" + beitragsAccount + "' and not(contains(trn:description,'Einzug'))]", xnsmgr); einzugPayments = xd.SelectNodes("//gnc:transaction[trn:splits/trn:split/split:account='" + bankAccount + "' and trn:splits/trn:split/split:account='" + beitragsAccount + "' and contains(trn:description,'Einzug')]", xnsmgr); sonstigePayments = xd.SelectNodes("//gnc:transaction[not(trn:splits/trn:split/split:account='" + kassaAccount + "' or trn:splits/trn:split/split:account='" + bankAccount + "') and trn:splits/trn:split/split:account='" + beitragsAccount + "']", xnsmgr); */ DateTime cut = new DateTime(2007, 2, 14); using (ISession session = SessionFactoryHelper.SessionFactory.OpenSession()) { List<Zahlung> zahlungen = new List<Zahlung>(); foreach (XmlNode transaction in xd.SelectNodes("//gnc:transaction[trn:splits/trn:split/split:account='" + beitragsAccount + "']", xnsmgr)) { zahlungen.AddRange(ProcessTransaction(session, transaction)); } foreach (Zahlung z in zahlungen) { if (z.Datum > cut) session.Save(z); } if (fehlendeMitglieder.Length != 0) { MessageBox.Show(fehlendeMitglieder.ToString()); } session.Flush(); } } } private IEnumerable<Zahlung> ProcessTransaction(ISession session, XmlNode transaction) { Zahlungsart art=null; try { XmlNodeList splitList = transaction.SelectNodes("trn:splits/trn:split[not(split:account = '" + beitragsAccount + "')]", xnsmgr); if (splitList.Count != 1) throw new Exception("Es sind nur simple Transaktionen erlaubt!"); XmlNode split = splitList[0]; string account = split.SelectSingleNode("split:account", xnsmgr).InnerText; if (account == bankAccount) { if (transaction["trn:description"].InnerText.Contains("Einzug")) return ProcessEinzug(session, transaction); else art = session.CreateQuery("from Zahlungsart z where z.Name = 'Überweisung'").UniqueResult<Zahlungsart>(); } else if (account == kassaAccount) { art = session.CreateQuery("from Zahlungsart z where z.Name = 'Bar'").UniqueResult<Zahlungsart>(); } if (art == null) throw new Exception("Konnte Transaktionstype nicht feststellen!"); return ProcessSingleTransaction(session, transaction, art); } catch (Exception ex) { if (ex.Message.StartsWith("Mitglied ") && ex.Message.EndsWith(" nicht gefunden!")) { fehlendeMitglieder.AppendLine(ex.Message); } else { string error = ex.ToString() + Environment.NewLine + Environment.NewLine + transaction.OuterXml; MessageBox.Show(error); } return new Zahlung[0]; } } IEnumerable<Zahlung> ProcessEinzug(ISession session, XmlNode transaction) { List<Zahlung> zahlungen = new List<Zahlung>(); Zahlungsart art = session.CreateQuery("from Zahlungsart z where z.Name = 'Einzug'").UniqueResult<Zahlungsart>(); DateTime datum = DateTime.Parse(transaction["trn:date-posted"].InnerText.Substring(0, 19), System.Globalization.CultureInfo.InvariantCulture); string werts = transaction.SelectSingleNode("trn:splits/trn:split[split:account = '" + beitragsAccount + "']", xnsmgr)["split:value"].InnerText; int wert = int.Parse(werts.Substring(0, werts.IndexOf('/'))) / int.Parse(werts.Substring(werts.IndexOf('/') + 1)); wert *= -1; //Ertragskonto hat negatives Vorzeichen im vergleich zum bestandskonto.... string mitgliederString = transaction["trn:description"].InnerText; mitgliederString = mitgliederString.Substring(0, mitgliederString.IndexOf(')')); mitgliederString = mitgliederString.Substring(mitgliederString.IndexOf('(')+1); string[] mitgliedernamen = Array.ConvertAll<string, string>(mitgliederString.Split(','), delegate(string x) { return x.Trim(); } ); if (mitgliedernamen.Length * 20 != wert) throw new Exception("Anzahl der Mitglieder passt nicht zum Wert des Einzugs"); StringBuilder missing = new StringBuilder(); foreach (string mitgliedsname in mitgliedernamen) { Mitglied m = session.CreateQuery("from Mitglied m where m.Vorname+' '+m.Nachname = :name or m.Nachname+' '+m.Vorname = :name").SetParameter("name", mitgliedsname).UniqueResult<Mitglied>(); if (m == null) { fehlendeMitglieder.AppendLine("Mitglied '" + mitgliedsname + "' nicht gefunden!"); continue; } Zahlung z = new Zahlung(); z.Mitglied = m; z.Art = art; z.Wert = 20; z.Datum = datum; z.Kommentar = "Buchungsimport am " + DateTime.Today; zahlungen.Add(z); } return zahlungen; } IEnumerable<Zahlung> ProcessSingleTransaction(ISession session, XmlNode transaction, Zahlungsart art) { string name = transaction["trn:description"].InnerText.Replace("Mitgliedsbeitrag ", ""); Mitglied m = session.CreateQuery("from Mitglied m where m.Vorname+' '+m.Nachname = :name or m.Nachname+' '+m.Vorname = :name").SetParameter("name", name).UniqueResult<Mitglied>(); if (m == null) throw new Exception("Mitglied '" + name + "' nicht gefunden!"); string werts = transaction.SelectSingleNode("trn:splits/trn:split[split:account = '" + beitragsAccount + "']", xnsmgr)["split:value"].InnerText; int wert = int.Parse(werts.Substring(0, werts.IndexOf('/'))) / int.Parse(werts.Substring(werts.IndexOf('/') + 1)); Zahlung z = new Zahlung(); z.Mitglied = m; z.Art = art; z.Wert = wert*-1; //Ertragskonto hat negatives Vorzeichen im vergleich zum bestandskonto.... z.Datum = DateTime.Parse(transaction["trn:date-posted"].InnerText.Substring(0, 19), System.Globalization.CultureInfo.InvariantCulture); z.Kommentar = "Buchungsimport am " + DateTime.Today; return new Zahlung[] { z }; } } }