Files
BeWoPlaner/ReportImp/AWOMuensterlandRecklinghausen/Export/DiamantExporter.cs

333 lines
13 KiB
C#

using System;
using System.Collections.Generic;
using System.Data;
using System.Globalization;
using System.IO;
using System.Text;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Report.ReportObjects;
using BS.Shared.Core;
using BS.Shared.DataContracts;
namespace AWOMuensterlandRecklinghausen.Export
{
public class DiamantExporter
{
public static QueryDC CreateQuery(QueryDC query)
{
DateTime dt = DateTime.Now;
DateTime.TryParse(query.Parameter[0].Value.ToString(), out dt);
query.FileName = String.Format("F{0:yyyyMM} - FiBu-Protokoll - {1:yyyyMMdd}.er2", dt, DateTime.Now);
DateTime dtStart = DateTime.MinValue;
DateTime dtEnd = DateTime.MaxValue;
if (query.Parameter.Count > 1)
{
DateTimeSpan span = query.Parameter[1].Value as DateTimeSpan;
dtStart = span.StartDate;
dtEnd = span.EndDate;
}
if (dtStart == DateTime.MinValue)
{
dtStart = new DateTime(1900, 1, 1);
}
var tableRg = ExecuteQuery(GetMonatlicheAbrechnungenSqlNeu(), dt, dtStart, dtEnd);
query.QueryResult = GetAbrechnungenString(dt, dtStart, dtEnd, tableRg);
query.Attachments = GetAbrechnungsBeleg(dt, tableRg);
return query;
}
public static string CreateExportString(string[] pHeaderCaption, string[][] pContent)
{
if (pHeaderCaption != null && pHeaderCaption.Length > 1 && pHeaderCaption[0].Contains("Buchhaltung"))
{
DateTime dt = DateTime.Now;
DateTime.TryParse(pHeaderCaption[1], out dt);
var tableRg = ExecuteQuery(GetMonatlicheAbrechnungenSqlNeu(), dt, dt, dt);
return GetAbrechnungenString(dt, dt, dt, tableRg);
}
return null;
}
public static String GetAbrechnungenString(DateTime date, DateTime rechnungsDatumVon, DateTime rechnungsDatumBis, DataTable tableRg)
{
StringBuilder sb = new StringBuilder();
var s = GetMonatlicheAbrechnungString(date, rechnungsDatumVon, rechnungsDatumBis, tableRg);
if (!String.IsNullOrWhiteSpace(s))
{
sb.Append(s);
}
if (sb.Length > 0)
{
sb.AppendLine();
}
return sb.ToString();
}
public static String GetMonatlicheAbrechnungString(DateTime date, DateTime rechnungsDatumVon, DateTime rechnungsDatumBis, DataTable dt)
{
// Export enthält Rechnungsangaben Zeilen (Zeile F) und Kostenstellen/Rechnungspositionsangaben (Zeile K) in zwei Zeilen
// Kommen aus Export in einer Zeile und werden hier getrennt, falls die Rechnung mehrere Positionen hat
int startIdx = 5;
int stopIdx = 23; // ab da beginnen Angaben zu Kostenstelle -> zweite Zeile oder auch mehr falls mehrere Positionen
String sql;
//sql = GetMonatlicheAbrechnungenSqlNeu();
//var dt = ExecuteQuery(sql, date, rechnungsDatumVon, rechnungsDatumBis);
StringBuilder sb = new StringBuilder();
List<DataRow> mergedRows = new List<DataRow>();
Dictionary<string, DataRow> oid2Row = new Dictionary<string, DataRow>();
foreach (DataRow row in dt.Rows)
{
string oid = row[0].ToString();
bool storno = false;
if (!oid2Row.ContainsKey(oid))
{
oid2Row.Add(oid, row);
if (sb.Length > 0)
{
sb.AppendLine();
}
for (int i = startIdx; i < row.ItemArray.Length; i++)
{
var item = row[i];
if (i == 14)
{
string belegnr = item.ToString();
if (belegnr.Contains("Storno"))
{
sb.Append(String.Format("{0}", belegnr).Replace(" Storno", ""));
sb.Append(";");
}
else
{
sb.Append(item);
sb.Append(";");
}
}
else if (i == 19)
{
decimal betrag = ErzeugeBetrag(item);
if (betrag != 0)
{
if (betrag < 0)
{
storno = true;
}
sb.Append(String.Format("{0:0.##}", betrag).Replace(",", "."));
sb.Append(";");
}
}
else if (i == 16 && storno)
{
sb.Append("Storno ");
sb.Append(item);
sb.Append(";");
}
else if (i == stopIdx)
{
sb.Append(item);
sb.AppendLine();
}
else if (i == 32)
{
decimal betrag = ErzeugeBetrag(item);
if (betrag != 0)
{
sb.Append(String.Format("{0:0.##}", betrag * -1).Replace(",", "."));
sb.Append(";");
}
}
else
{
sb.Append(item);
sb.Append(";");
}
}
}
else
{
if (sb.Length > 0)
{
sb.AppendLine();
}
for (int i = startIdx; i < row.ItemArray.Length; i++)
{
var item = row[i];
// mach nichts mit den ersten Spalten -> erstelle nur Kostenstellen
if (i == 32)
{
decimal betrag = ErzeugeBetrag(item);
if (betrag != 0)
{
sb.Append(String.Format("{0:0.##}", betrag * -1).Replace(",", "."));
sb.Append(";");
}
}
else if (i > stopIdx)
{
sb.Append(item);
sb.Append(";");
}
}
}
}
return sb.ToString();
}
private static Dictionary<long, decimal> CreateDictionary(DataTable dt)
{
Dictionary<long, decimal> dict = new Dictionary<long, decimal>();
if (dt != null)
{
foreach (DataRow row in dt.Rows)
{
long? oid = row.ItemArray[0] as long?;
decimal? betrag = row.ItemArray[4] as decimal?;
if (oid.HasValue && betrag.HasValue)
{
dict.Add(oid.Value, betrag.Value);
}
}
}
return dict;
}
public static decimal ErzeugeBetrag(object betragObj)
{
decimal gesamtbetrag = 0;
if (betragObj != null)
{
Decimal.TryParse(betragObj.ToString().Replace(".", ","), out gesamtbetrag);
}
decimal betrag = Math.Round(gesamtbetrag, 2, MidpointRounding.AwayFromZero);
return betrag;
}
private static String GetMonatlicheAbrechnungenSqlNeu()
{
String sql = @"
SELECT
CONCAT(cb2sc.Oid, ib.InvoiceNumber, Round(sip.Claim, 0)) AS OID,
CONCAT(p.`LastName`, ', ', p.`FirstName`) as Klient,
DATE_FORMAT(ib.`AccountingPeriodStart`, '%d%m%Y') AS Start,
DATE_FORMAT(ib.`AccountingPeriodEnd`, '%d%m%Y') AS End,
org.Name AS Kostentraeger,
'F',
'0',
'124',
null,
null,
'DA',
DATE_FORMAT(ib.InvoiceDate, '%d%m%Y') AS Datum,
':Periode',
null,
ib.InvoiceNumber,
c.DebitorNumber,
'49140000',
null,
null,
Round(sip.Claim, 2) AS 'Betrag',
CONCAT(p.`LastName`, ', ', p.`FirstName`, ' :PeriodeSlash ') as 'Verwendung',
null, null, 'EUR',
'K', 0, IFNULL(ii.UnitDescription, c.Costcenter), null, null, null, null, null, ii.AmountTotal
FROM
person p
INNER JOIN customer c on c.personoid = p.oid
INNER JOIN supportconcept sc on sc.customeroid = c.oid
INNER JOIN costbearer2supportconcept cb2sc on cb2sc.supportconceptoid = sc.oid
INNER JOIN costbearer cb on cb2sc.costbeareroid = cb.oid
INNER JOIN organisation org on org.costbeareroid = cb.oid
INNER JOIN invoicebase ib on ib.costbearer2supportconceptoid = cb2sc.oid
INNER JOIN serviceinvoice si on si.invoicebaseoid = ib.oid
INNER JOIN serviceinvoiceperiod sip on sip.serviceinvoiceoid = si.oid
INNER JOIN invoiceitem ii on ii.ServiceInvoicePeriodOid = sip.oid
WHERE ib.`AccountingPeriodEnd` >= ':MonatAbrechnung_Start' AND ib.`AccountingPeriodEnd` < ':MonatAbrechnung_End' and ib.IsActive = 1
AND ib.`InvoiceDate` >= ':Monat_Start' AND ib.`InvoiceDate` < ':Monat_End'
ORDER BY ib.invoicenumber
";
return sql;
}
public static DataTable ExecuteQuery(String sql, DateTime dt, DateTime rechnungsDatumVon, DateTime rechnungsDatumBis)
{
var newsql = sql;
newsql = newsql.Replace(":Abrechnungsmonat", String.Format("{0:dd.MM.yyyy}", dt));
newsql = newsql.Replace(":PeriodeSlash", String.Format("{0:MM/yyyy}", dt));
newsql = newsql.Replace(":Periode", String.Format("{0:MMyyyy}", dt));
newsql = newsql.Replace(":Belegnr", String.Format("{0:yyMM}", dt));
newsql = newsql.Replace(":Monat_Start", String.Format("{0:yyyy-MM-dd}", rechnungsDatumVon));
newsql = newsql.Replace(":Monat_End", String.Format("{0:yyyy-MM-dd}", rechnungsDatumBis));
newsql = newsql.Replace(":MonatAbrechnung_Start", String.Format("{0:yyyy-MM}-01", dt));
dt = dt.AddMonths(1);
newsql = newsql.Replace(":MonatAbrechnung_End", String.Format("{0:yyyy-MM}-01", dt));
return DAOFactory.AdoDAO.ExecuteQuery(newsql).Tables[0];
}
private static List<FileAttachmentDC> GetAbrechnungsBeleg(DateTime dt, DataTable dtRg)
{
try
{
List<FileAttachmentDC> liste = new List<FileAttachmentDC>();
var pdf = new FileAttachmentDC();
var queryReport = new AWOMuensterlandRecklinghausen.Export.Bericht();
DataTable table = new DataTable();
string[] spalten = new string[] { "Klient", "Zeitraum", "Nummer", "ReDatum", "Kostenträger", "Betrag", "Notiz" };
for (int i = 0; i < spalten.Length; i++)
table.Columns.Add(spalten[i], typeof(string));
for (int i = 0; i < dtRg.Rows.Count; i++)
{
DataRow row = table.NewRow();
DataRow invoice = dtRg.Rows[i];
row[0] = invoice[1];
//var start = DateTime.ParseExact(invoice[2].ToString(), "ddMMyyyy", CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal);
//var end = DateTime.ParseExact(invoice[3].ToString(), "ddMMyyyy", CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal);
//row[1] = string.Format("{0:dd.MM.yyyy} - {1:dd.MM.yyyy}", start, end);
row[1] = invoice[14];
var datum = DateTime.ParseExact(invoice[11].ToString(), "ddMMyyyy", CultureInfo.InvariantCulture, DateTimeStyles.AssumeLocal);
row[2] = string.Format("{0:dd.MM.yyyy}", datum);
row[3] = invoice[4];
row[4] = string.Format("{0:0.00}", invoice[26]);
row[5] = string.Format("{0:0.00}", invoice[32]);
row[6] = string.Format("{0:0.00}", invoice[19]);
table.Rows.Add(row);
}
var queryReportObject = QueryRO.Create(new Query() { Title = "Export" }, table);
queryReportObject.Name = String.Format("AWO Schulbegleitung - Rechnungsausgangbuch {0:MMMM yyyy} vom {1:dd.MM.yyyy}", dt, DateTime.Now);
queryReport.SetReportDataSource(queryReportObject);
queryReport.CreateDocument();
pdf.FileName = String.Format("{0:MM-yyyy} RA-Buch {1:yyyyMMdd}.pdf", dt, DateTime.Now);
using (var ms = new MemoryStream())
{
queryReport.ExportToPdf(ms);
pdf.BinaryData = ms.ToArray();
}
liste.Add(pdf);
return liste;
}
catch (Exception)
{
// continue - auch wenn gar nichts stimmt
}
return null;
}
}
}