Files
BeWoPlaner/ReportImp/BfpDus/Export/CustomCsvExporter.cs
2020-08-17 15:50:00 +02:00

283 lines
8.7 KiB
C#

using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Service.ServiceImplementations;
using BS.Shared.DataContracts;
using DevExpress.Data.Helpers;
using DevExpress.Printing.ExportHelpers;
namespace BfpDus.Export
{
public class CustomCsvExporter
{
public static QueryDC CreateQuery(QueryDC query)
{
DateTime dt = DateTime.Now;
query.FileName = String.Format("{0}.csv", query.Title);
//if (query.Parameter != null && query.Parameter.Count > 0)
//{
// DateTime.TryParse(query.Parameter[0].Value.ToString(), out dt);
// query.FileName = String.Format("{0} {1:yyyy-MM}.csv", query.Title, dt);
//}
var service = new QueryServiceImp();
var data = service.ExecuteQuery(query.Oid, query.Parameter);
var dataTable = BS.Shared.Core.Utils.XMLDeserializeFromString<DataTable>(data);
if (query.Oid == 1300)
{
query.QueryResult = CreateServiceRecordLinkDataCsvFromDataTable(dataTable);
}
else if (query.Oid == 1400)
{
query.QueryResult = CreateServiceRecordCsvFromDataTable(dataTable);
}
else
{
query.QueryResult = CreateCsvFromDataTable(dataTable);
}
return query;
}
private static String CreateServiceRecordCsvFromDataTable(DataTable dt)
{
/*
SELECT
sr.Oid,
sr.startdate,
sr.enddate,
sr.groupoid,
sr.customeroid,
sr.employeeOid,
sr.GroupPersonCount,
sd.Name,
sr.Notice
FROM servicerecord sr
inner join servicedescription sd on sd.oid = sr.servicedescriptionoid
where sr.startdate >= ':Von' and sr.startdate < ':Bis'
*/
StringBuilder sb = new StringBuilder();
sb.Append("S_ID;Datum;Anfang;Ende;Gruppe;Gruppenleiter;Co_Leiter;Anzahl;Sitzungsart;Inhalt");
var sitzungen = CreateSitzungsdata(dt);
foreach (var data in sitzungen)
{
sb.AppendLine();
sb.Append(String.Format("{0}", data.SID)); // S_ID
sb.Append(";");
sb.Append(String.Format("{0:dd.MM.yyyy}", data.Datum)); // Datum
sb.Append(";");
if (data.Anfang.HasValue)
{
sb.Append(String.Format("{0:HH:mm}", data.Anfang)); // Anfang
}
sb.Append(";");
if (data.Ende.HasValue)
{
sb.Append(String.Format("{0:HH:mm}", data.Ende)); // Anfang
}
sb.Append(";");
if (data.Gruppe)
{
sb.Append("ja");
}
sb.Append(";");
sb.Append(data.GruppenLeiter);
sb.Append(";");
sb.Append(data.CoLeiter);
sb.Append(";");
sb.Append(String.Format("{0}", data.Anzahl)); // Anzahl
sb.Append(";");
sb.Append(data.Sitzungsart); // Sitzungsart
sb.Append(";");
sb.Append(String.Format("\"{0}\"", data.Inhalt)); // Inhalt
}
return sb.ToString();
}
private static String CreateServiceRecordLinkDataCsvFromDataTable(DataTable dt)
{
StringBuilder sb = new StringBuilder();
sb.Append("S_ID;K_ID");
var sitzungen = CreateSitzungsdata(dt);
foreach (var data in sitzungen)
{
foreach (var customerOid in data.KlientenListe)
{
sb.AppendLine();
sb.Append(String.Format("{0}", data.SID)); // S_ID
sb.Append(";");
sb.Append(String.Format("{0}", customerOid)); // K_ID
}
}
return sb.ToString();
}
private static List<SitzungenData> CreateSitzungsdata(DataTable dt)
{
var allEmps = DAOFactory.GenericDAO.GetAllActiveAndArchived<Employee>();
Dictionary<long, SitzungenData> groupDict = new Dictionary<long, SitzungenData>();
var sitzungen = new List<SitzungenData>();
foreach (DataRow row in dt.Rows)
{
var oid = (long)row[0];
var startdate = (DateTime)row[1];
var enddate = (DateTime)row[2];
var groupoid = row[3] as long?;
var customerOid = row[4] as long?;
var empOid = row[5] as long?;
var anzahl = row[6] as int?;
var roundedduration = row[9] as decimal?;
SitzungenData data = new SitzungenData();
data.KlientenListe = new List<long>();
data.EmployeeListe = new List<String>();
data.SID = oid;
data.Datum = startdate;
data.Anfang = startdate;
data.Ende = startdate.AddMinutes((double)(roundedduration ?? 0));
data.Gruppe = groupoid.HasValue && groupoid > 0;
if (data.Gruppe)
{
data.Ende = enddate;
}
var emp = allEmps.Where(e => e.Oid == empOid).FirstOrDefault();
if (emp != null)
{
data.GruppenLeiter = emp.PersonnelNumber;
data.EmployeeListe.Add(emp.PersonnelNumber);
}
if (!anzahl.HasValue)
{
anzahl = 1;
}
if (customerOid.HasValue)
{
data.KlientenListe.Add(customerOid.Value);
}
data.Anzahl = anzahl.Value;
data.Sitzungsart = String.Format("{0}", row[7]); // Sitzungsart
data.Inhalt = String.Format("{0}", row[8]); // Sitzungsart
if (groupoid.HasValue && groupDict.ContainsKey(groupoid.Value))
{
var olddata = groupDict[groupoid.Value];
if (olddata.GruppenLeiter != data.GruppenLeiter)
{
olddata.CoLeiter = data.GruppenLeiter;
}
if (emp != null && !olddata.EmployeeListe.Contains(emp.PersonnelNumber))
{
olddata.EmployeeListe.Add(emp.PersonnelNumber);
}
if (customerOid.HasValue && !olddata.KlientenListe.Contains(customerOid.Value))
{
olddata.KlientenListe.Add(customerOid.Value);
}
}
else
{
if (groupoid.HasValue)
{
groupDict.Add(groupoid.Value, data);
}
sitzungen.Add(data);
}
}
return sitzungen;
}
private static String CreateCsvFromDataTable(DataTable dt)
{
StringBuilder sb = new StringBuilder();
foreach (DataColumn column in dt.Columns)
{
if (sb.Length > 0)
{
sb.Append(";");
}
sb.Append(column.ColumnName);
}
foreach (DataRow row in dt.Rows)
{
sb.AppendLine();
for (int i = 0; i < row.ItemArray.Length; i++)
{
if (i > 0)
{
sb.Append(";");
}
var item = row[i];
var itemStr = String.Format("{0}", item);
sb.Append(itemStr);
}
}
return sb.ToString();
}
}
public class SitzungenData
{
public long SID { get; set; }
public DateTime Datum { get; set; }
public DateTime? Anfang { get; set; }
public DateTime? Ende { get; set; }
public bool Gruppe { get; set; }
public String GruppenLeiter { get; set; }
public String CoLeiter { get; set; }
public int Anzahl { get; set; }
public String Sitzungsart { get; set; }
public String Inhalt { get; set; }
public List<String> EmployeeListe { get; set; }
public List<long> KlientenListe { get; set; }
}
}