|
|
(Eine dazwischenliegende Version desselben Benutzers wird nicht angezeigt) |
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>
| |
|
| |
|
| |
| Ja, schön. --[[Benutzer:Isis1984|Isis1984]] 23:09, 8. Jan. 2008 (CET)
| |
|
| |
| OKOK, danke, dass Ihr Euch die ganze Arbeit antut! --[[Benutzer:Isis1984|Isis1984]] 23:10, 8. Jan. 2008 (CET)
| |