Files
BeWoPlaner/ReportImp/BfpDus/Export/CustomCsvExporter.cs

399 lines
13 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.Report.ReportObjects;
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 if (query.Oid == 1500)
{
query.QueryResult = CreateSaldenlisteCsvFromDataTable(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");
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
}
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 CreateSaldenlisteCsvFromDataTable(DataTable dt)
{
/*
*
ZG_ID K_ID Kostenträger Bereits gezahlt Bis dato geleistete FLS Betrag Saldo
Startdatum Alle HPs die ab dem Datum starten
Enddatum Stichtag
alle mit Saldo 0 raus
KH Differenzen nicht berücksichtigen
Bezeichnung Saldenliste
*/
StringBuilder sb = new StringBuilder();
sb.Append("ZG_ID;K_ID;KT;Bereits gezahlt;Bis dato geleistete FLS;Fehlkontakte;Betrag;Saldo");
DateTime startdate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1);
DateTime enddate = startdate.AddMonths(1).AddDays(-1);
foreach (DataRow row in dt.Rows)
{
var von = (String)row[0];
var bis = (String)row[1];
if (DateTime.TryParse(von, out var s) && s < DateTime.MaxValue)
{
startdate = s;
}
if (DateTime.TryParse(bis, out var e) && e < DateTime.MaxValue)
{
enddate = e.AddDays(-1);
}
}
var ro = FinanceRO.Create(startdate, enddate, false, false);
ro.CalculateBillableAmountInReportTimeSpan();
var saldenliste = CreateSaldenliste(ro);
foreach (var data in saldenliste)
{
sb.AppendLine();
sb.Append(String.Format("{0}", data.SupportConceptOid));
sb.Append(";");
sb.Append(String.Format("{0}", data.CustomerOid));
sb.Append(";");
sb.Append(String.Format("{0}", data.Organisation));
sb.Append(";");
sb.Append(String.Format("{0:0.00}", data.BereitsGezahlt));
sb.Append(";");
sb.Append(String.Format("{0:0.00}", data.BisDatoGeleistet));
sb.Append(";");
sb.Append(String.Format("{0:0.00}", data.Fehlkontakte));
sb.Append(";");
sb.Append(String.Format("{0:0.00}", data.Betrag));
sb.Append(";");
sb.Append(String.Format("{0:0.00}", data.Saldo));
}
return sb.ToString();
}
private static List<SaldolistenEintrag> CreateSaldenliste(FinanceRO ro)
{
var liste = new List<SaldolistenEintrag>();
foreach (var item in ro.SupportConceptFinanceList)
{
var newEntry = new SaldolistenEintrag();
newEntry.SupportConceptOid = item.Costbearer2Supportconcept.SupportConcept.SupportConceptOid;
newEntry.CustomerOid = item.Costbearer2Supportconcept.SupportConcept.Customer.Oid.Value;
newEntry.CustomerName = item.Costbearer2Supportconcept.SupportConcept.Customer.LastNameFirstName;
newEntry.Organisation = item.CostBearerName;
newEntry.BereitsGezahlt = item.AmountPaid;
newEntry.BisDatoGeleistet = item.BillableHours;
newEntry.Fehlkontakte = item.StundenFehlkontakteInReportTimeSpan;
newEntry.Betrag = item.BillableAmountInReportTimeSpan;
newEntry.Saldo = item.AmountPaid - item.BillableAmountInReportTimeSpan;
//if (newEntry.Saldo != 0 && item.Costbearer2Supportconcept.StartDate >= ro.ReportStartDate)
if (item.Costbearer2Supportconcept.StartDate >= ro.ReportStartDate)
{
liste.Add(newEntry);
}
}
return liste.OrderBy(a => a.CustomerName).ToList();
}
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; }
}
public class SaldolistenEintrag
{
//"ZG_ID,K_ID;Kostenträger;Bereits gezahlt;Bis dato geleistete FLS;Fehlkontakte;Betrag;Saldo"
public long SupportConceptOid { get; set; }
public long CustomerOid { get; set; }
public String CustomerName { get; set; }
public String Organisation { get; set; }
public decimal BereitsGezahlt { get; set; }
public decimal BisDatoGeleistet { get; set; }
public decimal Fehlkontakte { get; set; }
public decimal Betrag { get; set; }
public decimal Saldo { get; set; }
}
}