Benutzer Diskussion:Fin: Unterschied zwischen den Versionen

aus Metalab Wiki, dem offenen Zentrum für meta-disziplinäre Magier und technisch-kreative Enthusiasten.
Zur Navigation springenZur Suche springen
K (alottacode--)
 
(3 dazwischenliegende Versionen von 2 Benutzern werden 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>
 

Aktuelle Version vom 1. Juli 2009, 12:50 Uhr