Files
BeWoPlaner/ReportImp/ChristianWilke/Export/DatevExporter.cs
2022-11-09 12:58:12 +01:00

153 lines
5.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Text;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Service.DCEntityMapper;
using BS.Shared;
using BS.Shared.DataContracts;
using BS.Shared.Extensions;
namespace ChristianWilke.Export
{
public class DatevExporter
{
public static QueryDC CreateQuery(QueryDC query)
{
DateTime dt = DateTime.Now;
DateTime.TryParse(query.Parameter[0].Value.ToString(), out dt);
query.FileName = String.Format("DatevExport {0:MMMM} {0:yyyy}.csv", dt);
query.QueryResult = GetAbrechnungenString(dt);
return query;
}
public static String GetAbrechnungenString(DateTime date)
{
//Bereiche:
//queryDc.Parameter[1].CustomValues.Add("Ambulant betreutes Wohnen");
//queryDc.Parameter[1].CustomValues.Add("Begleitende Elternschaft");
//queryDc.Parameter[1].CustomValues.Add("Einzelfallhilfe");
//queryDc.Parameter[1].CustomValues.Add("Familien entlastender Dienst");
//queryDc.Parameter[1].CustomValues.Add("Tagesstruktur");
//queryDc.Parameter[1].CustomValues.Add("Wohnstätte");
StringBuilder sb = new StringBuilder();
sb.AppendLine("Debitor;Rechnungsnummer;Belegdatum;Umsatz;Konto;Kostenstelle;Buchungstext");
//sb.AppendLine("Betrag;Gegenkonto;Rechnungsnummer;Belegfeld 2;Belegdatum;Konto;Kostenstelle;Buchungstext");
var s = GetRechnungenString(date);
if (!String.IsNullOrWhiteSpace(s))
{
sb.AppendLine(s);
}
return sb.ToString();
}
private static String GetRechnungenString(DateTime date)
{
StringBuilder sb = new StringBuilder();
var sql = GetRechnungenSql(date);
var dt = ExecuteQuery(sql, date);
foreach (DataRow row in dt.Rows)
{
if (sb.Length > 0)
{
sb.AppendLine();
}
String debitor = "";
var row1 = row[1].ToString();
long? oid = ToNullableLong(row1);
if (oid.HasValue)
{
var org = DAOFactory.GenericDAO.LoadByID<Organisation>(oid.Value);
debitor = org.DebitorNumber;
}
sb.Append(debitor); // Gegenkonto
sb.Append(";");
sb.Append(String.Format("{0}", row[3])); // Rechnungsnummer
sb.Append(";");
DateTime lastDate = new DateTime(date.Year, date.Month, 1);
lastDate = lastDate.AddMonths(1).AddDays(-1);
sb.Append(String.Format("{0:dd.MM.yyyy}", lastDate));
sb.Append(";"); // Datum (Monatsletzter des Auswertedatums) (Belegdatum)
sb.Append(String.Format("{0:0.00}", row[0])); // Betrag (Umsatz)
sb.Append(";");
sb.Append(""); // Konto
sb.Append(";");
sb.Append(row[4].ToString()); //Kostenstelle
sb.Append(";");
sb.Append(row[7].ToString()); //Verwendungszweck
sb.Append(";");
}
return sb.ToString();
}
private static long? ToNullableLong(string s)
{
long l;
if (long.TryParse(s, out l))
return l;
return null;
}
private static String GetRechnungenSql(DateTime date)
{
String sql = @"
select
sip.Claim,
c.DebitorNumber,
ib.InvoiceDate,
ib.invoicenumber,
c.CostCenter,
c2s.Oid,
ib.InvoiceId,
p.LastName
from
person p
inner join customer c on c.personoid = p.oid
inner join supportconcept sc on sc.customeroid = c.oid
inner join costbearer2supportconcept c2s on c2s.supportconceptoid = sc.oid
inner join invoicebase ib on ib.costbearer2supportconceptoid = c2s.oid
inner join serviceinvoice si on si.invoicebaseoid = ib.oid
inner join serviceinvoiceperiod sip on sip.serviceinvoiceoid = si.oid
WHERE ib.`AccountingPeriodEnd` >= ':Monat_Start' AND ib.`AccountingPeriodEnd` <= ':Monat_End' and ib.IsActive = 1
order by ib.invoicenumber
";
return sql;
}
public static DataTable ExecuteQuery(String sql, DateTime dt)
{
var newsql = sql;
newsql = newsql.Replace(":Abrechnungsmonat", String.Format("{0:dd.MM.yyyy}", dt));
newsql = newsql.Replace(":Belegnr", String.Format("{0:yyMM}", dt));
newsql = newsql.Replace(":Monat_MM", String.Format("{0:MM}", dt));
newsql = newsql.Replace(":Monat_Start", String.Format("{0:yyyy-MM}-01", dt));
dt = dt.AddMonths(1);
newsql = newsql.Replace(":Monat_End", String.Format("{0:yyyy-MM}-01", dt));
return DAOFactory.AdoDAO.ExecuteQuery(newsql).Tables[0];
}
}
}