333 lines
13 KiB
C#
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;
|
|
}
|
|
}
|
|
} |