From c72697a7a60840cffb04b00f405107165873afaa Mon Sep 17 00:00:00 2001 From: Alexandra Date: Wed, 6 Sep 2023 13:52:30 +0200 Subject: [PATCH] VkmRietberg/Export/DatevExporter --- .../VkmRietberg/Export/CustomDataExporter.cs | 17 + ReportImp/VkmRietberg/Export/DatevExporter.cs | 365 ++++++++++++++++++ ReportImp/VkmRietberg/VkmRietberg.csproj | 6 + 3 files changed, 388 insertions(+) create mode 100644 ReportImp/VkmRietberg/Export/CustomDataExporter.cs create mode 100644 ReportImp/VkmRietberg/Export/DatevExporter.cs diff --git a/ReportImp/VkmRietberg/Export/CustomDataExporter.cs b/ReportImp/VkmRietberg/Export/CustomDataExporter.cs new file mode 100644 index 000000000..8f6b0d7d1 --- /dev/null +++ b/ReportImp/VkmRietberg/Export/CustomDataExporter.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using BeWo.Service.Plugins; +using BS.Shared.Core; +using BS.Shared.DataContracts; +using Utils = BS.Shared.Core.Utils; + +namespace VkmRietberg.Export +{ + public class CustomDataExporter : DataExporter + { + public override QueryDC CreateQuery(QueryDC query) + { + return DatevExporter.CreateQuery(query); + } + } +} diff --git a/ReportImp/VkmRietberg/Export/DatevExporter.cs b/ReportImp/VkmRietberg/Export/DatevExporter.cs new file mode 100644 index 000000000..868b776d9 --- /dev/null +++ b/ReportImp/VkmRietberg/Export/DatevExporter.cs @@ -0,0 +1,365 @@ +using System; +using System.Collections.Generic; +using System.Data; +using System.IO; +using System.Linq; +using System.Text; +using BeWo.Data; +using BeWo.Data.Access; +using BeWo.Data.Entities; +using BS.Shared; +using BS.Shared.Core; +using BS.Shared.DataContracts; +using BS.Shared.DataContracts.Compact; +using BS.Shared.Extensions; + +namespace VkmRietberg.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("Datev Export {0:yyyyMM}.csv", dt); + query.QueryResult = GetAbrechnungenString(dt); + + return query; + } + + public static String GetAbrechnungenString(DateTime date) + { + StringBuilder sb = new StringBuilder(); + sb.AppendLine("Betrag;Konto;Gegenkonto;Belegdatum;Rechnungsnummer;Buchungstext;Kostenstelle"); + //sb.AppendLine("Datum;Text;Belegnr.;Betrag;Konto;Gegenkonto;Kostenstelle"); + + var s = GetMonatlicheBetraegeString(date); + if (!String.IsNullOrWhiteSpace(s)) + { + sb.Append(s); + } + + s = GetMonatlicheRechnungenString(date); + if (!String.IsNullOrWhiteSpace(s)) + { + if (sb.Length > 0) + sb.AppendLine(); + + sb.Append(s); + } + + s = GetSpitzabrechnungenString(date); + if (!String.IsNullOrWhiteSpace(s)) + { + if (sb.Length > 0) + sb.AppendLine(); + + sb.Append(s); + } + + return sb.ToString(); + } + + + public static String GetMonatlicheBetraegeString(DateTime date) + { + var sql = GetMonatlicheBetraegeLvrLwlSql(date); + + /* + 'Betrag', + c.DebitorNumber, + c.CostCenter, + CONCAT(p.`LastName`, ', ') as 'Verwendung', + cb2sc.Oid + */ + + //sb.AppendLine("Betrag;Konto;Gegenkonto;Belegdatum;Rechnungsnummer;Buchungstext;Kostenstelle"); + var dt = ExecuteQuery(sql, date); + + var sqlAss = GetMonatlicheBetraegeLvrLwlAssSql(date); + var dtAss = ExecuteQuery(sqlAss, date); + + dt.Merge(dtAss); + + StringBuilder sb = new StringBuilder(); + foreach (DataRow row in dt.Rows) + { + if (sb.Length > 0) + { + sb.AppendLine(); + } + DateTime lastDate = new DateTime(date.Year, date.Month, 1); + lastDate = lastDate.AddMonths(1).AddDays(-1); + sb.Append(String.Format("{0:0.00}", row[0])); + sb.Append(";"); + sb.Append(String.Format("{0}", row[1])); + sb.Append(";"); + sb.Append("6505"); // Erlöskonto + sb.Append(";"); + sb.Append(String.Format("{0:ddMM}", lastDate)); + sb.Append(";"); + sb.Append(String.Format("{0:dd}/{0:MM}", lastDate)); + sb.Append(";"); + sb.Append(row[3]); + sb.Append(";"); + sb.Append("60"); + sb.Append(";"); + } + + return sb.ToString(); + } + + public static String GetSpitzabrechnungenString(DateTime date) + { + var sql = GetSpitzabrechnungenSql(date); + + /* + Round(si.Claim, 2), + c.DebitorNumber, + ib.InvoiceDate, + ib.InvoiceNumber, + c.CostCenter, + CONCAT('Endabrechnung ', + */ + + //sb.AppendLine("Betrag;Konto;Gegenkonto;Belegdatum;Rechnungsnummer;Buchungstext;Kostenstelle"); + var dt = ExecuteQuery(sql, date); + + StringBuilder sb = new StringBuilder(); + foreach (DataRow row in dt.Rows) + { + if (sb.Length > 0) + { + sb.AppendLine(); + } + sb.Append(String.Format("{0:0.00}", row[0])); + sb.Append(";"); + sb.Append(String.Format("{0}", row[1])); + sb.Append(";"); + sb.Append("6505"); // Erlöskonto + sb.Append(";"); + sb.Append(String.Format("{0:ddMM}", row[2])); + sb.Append(";"); + sb.Append(String.Format("{0}", row[3])); + sb.Append(";"); + sb.Append(String.Format("{0}", row[5])); + sb.Append(";"); + sb.Append("60"); + sb.Append(";"); + } + + return sb.ToString(); + } + + public static String GetMonatlicheRechnungenString(DateTime date) + { + var sql = GetMonatlicheRechnungenSql(date); + + /* +sip.Claim, +c.DebitorNumber, + ib.InvoiceDate, + ib.invoicenumber, + c.CostCenter, +c2s.Oid, +ib.InvoiceId + */ + + //sb.AppendLine("Betrag;Konto;Gegenkonto;Belegdatum;Rechnungsnummer;Buchungstext;Kostenstelle"); + var dt = ExecuteQuery(sql, date); + + StringBuilder sb = new StringBuilder(); + foreach (DataRow row in dt.Rows) + { + if (sb.Length > 0) + { + sb.AppendLine(); + } + sb.Append(String.Format("{0:0.00}", row[0])); + sb.Append(";"); + sb.Append(String.Format("{0}", row[1])); + sb.Append(";"); + sb.Append("6505"); // Erlöskonto + sb.Append(";"); + sb.Append(String.Format("{0:ddMM}", row[2])); + sb.Append(";"); + sb.Append(String.Format("{0}", row[3])); + sb.Append(";"); + String buchungstext = ""; + long? c2sOid = (long?)row[5]; + if (c2sOid.HasValue) + { + var c2s = DAOFactory.GenericDAO.LoadByID(c2sOid.Value); + var c = c2s.SupportConcept.Customer; + buchungstext = String.Format("{0}, {1}", c.Person.LastName, c.Person.FirstName); + } + sb.Append(buchungstext); + sb.Append(";"); + sb.Append("60"); + sb.Append(";"); + } + + return sb.ToString(); + } + + private static String GetMonatlicheBetraegeLvrLwlSql(DateTime date) + { + String sql = @" + SELECT + sum(qry.Betrag) AS Betrag, + qry.DebitorNumber, + qry.CostCenter, + qry.Verwendung, + qry.Oid + FROM + ( + (SELECT + IF(crpRateFactor.`CostRateValue` is null, ROUND((sr.`GeleisteteFLM` / 60) * (SELECT crp.`CostRateValue` FROM `costrateperiod` crp WHERE crp.`ObjectTid` = 22 AND crp.`CostRateType` = 0 AND crp.`ObjectOid` = cb2sc.`CostBearerOid` AND (crp.`EndDate` is null or crp.`EndDate` > ':Monat_Start') order by IF(crp.`EndDate` is null, MAKEDATE(9999,365),crp.`EndDate`) LIMIT 1 )), + ROUND(ROUND((sr.`GeleisteteFLM` / 60), 2) * (SELECT crp.`CostRateValue` FROM `costrateperiod` crp WHERE crp.`ObjectTid` = 22 AND crp.`CostRateType` = 0 AND crp.`ObjectOid` = cb2sc.`CostBearerOid` AND (crp.`EndDate` is null or crp.`EndDate` > ':Monat_Start') order by IF(crp.`EndDate` is null, MAKEDATE(9999,365),crp.`EndDate`) LIMIT 1 ) * ((100 + crpRateFactor.`CostRateValue`)/100), 2)) AS 'Betrag', + c.DebitorNumber, + c.CostCenter, + CONCAT(p.`LastName`, ', ', p.`FirstName`) as 'Verwendung', + cb2sc.Oid + FROM `supportconcept` sc + INNER JOIN `costbearer2supportconcept` cb2sc ON sc.`Oid` = cb2sc.`SupportConceptOid` + INNER JOIN `costbearer` cb ON cb2sc.`CostBearerOid` = cb.`Oid` + LEFT JOIN + (SELECT crp.`ObjectOid`, crp.`CostRateValue` FROM `costrateperiod` crp + WHERE crp.`ObjectTid` = 22 AND crp.`CostRateType` = 2 AND (crp.`EndDate` is null or crp.`EndDate` > NOW())) + AS crpRateFactor ON crpRateFactor.`ObjectOid` = cb.`Oid` + INNER JOIN `organisation` org ON org.`CostBearerOid` = cb.`Oid` + INNER JOIN `customer` c ON sc.`CustomerOid` = c.`Oid` + INNER JOIN `person` p on c.`PersonOid` = p.`Oid` + LEFT JOIN + (SELECT sr2.`CostBearer2SupportConceptOid`, SUM(sr2.`roundedduration` / IF(sr2.`GroupEmployeeCount` is null, 1, sr2.`GroupEmployeeCount`)) AS GeleisteteFLM FROM `servicerecord` sr2 + INNER JOIN `servicedescription` sd ON sr2.`ServiceDescriptionOid` = sd.`Oid` + INNER JOIN `servicecategory` sc ON sd.`ServiceCategoryOid` = sc.`Oid` + WHERE sr2.`StartDate` >= ':Monat_Start' AND sr2.`StartDate` < ':Monat_End' AND sc.`Billable` = 1 and sd.Name <> 'Fehlkontakte' GROUP BY sr2.`CostBearer2SupportConceptOid`) + AS sr ON sr.`CostBearer2SupportConceptOid` = cb2sc.`Oid` + WHERE c.`IsActive` = 1 AND sc.`IsActive` = 1 + and (sr.`GeleisteteFLM` is not null) + and (org.Name = 'LVR' OR org.Name = 'LWL')) + UNION + (SELECT + ROUND(0.8 * (sr.`GeleisteteFLM` / 60) * (SELECT crp.`CostRateValue` FROM `costrateperiod` crp WHERE crp.`ObjectTid` = 22 AND crp.`CostRateType` = 0 AND crp.`ObjectOid` = cb2sc.`CostBearerOid` AND (crp.`EndDate` is null or crp.`EndDate` > ':Monat_Start') order by IF(crp.`EndDate` is null, MAKEDATE(9999,365),crp.`EndDate`) LIMIT 1 )) AS 'Betrag', + c.DebitorNumber, + c.CostCenter, + CONCAT(p.`LastName`, ', ', p.`FirstName`) as 'Verwendung', + cb2sc.Oid + FROM `supportconcept` sc + INNER JOIN `costbearer2supportconcept` cb2sc ON sc.`Oid` = cb2sc.`SupportConceptOid` + INNER JOIN `costbearer` cb ON cb2sc.`CostBearerOid` = cb.`Oid` + INNER JOIN `organisation` org ON org.`CostBearerOid` = cb.`Oid` + INNER JOIN `customer` c ON sc.`CustomerOid` = c.`Oid` + INNER JOIN `person` p on c.`PersonOid` = p.`Oid` + LEFT JOIN + (SELECT sr2.`CostBearer2SupportConceptOid`, SUM(sr2.`roundedduration` / IF(sr2.`GroupEmployeeCount` is null, 1, sr2.`GroupEmployeeCount`)) AS GeleisteteFLM FROM `servicerecord` sr2 + INNER JOIN `servicedescription` sd ON sr2.`ServiceDescriptionOid` = sd.`Oid` + INNER JOIN `servicecategory` sc ON sd.`ServiceCategoryOid` = sc.`Oid` + WHERE sr2.`StartDate` >= ':Monat_Start' AND sr2.`StartDate` < ':Monat_End' AND sc.`Billable` = 1 and sd.Name = 'Fehlkontakte' GROUP BY sr2.`CostBearer2SupportConceptOid`) + AS sr ON sr.`CostBearer2SupportConceptOid` = cb2sc.`Oid` + WHERE c.`IsActive` = 1 AND sc.`IsActive` = 1 + and (sr.`GeleisteteFLM` is not null) + and (org.Name = 'LVR' OR org.Name = 'LWL')) + )qry + GROUP BY qry.OID + ORDER BY qry.Verwendung + "; + + return sql; + } + + private static String GetMonatlicheBetraegeLvrLwlAssSql(DateTime date) + { + String sql = @" + SELECT + ROUND((sr.`GeleisteteFLM` / 60) * (SELECT crp.`CostRateValue` FROM `costrateperiod` crp WHERE crp.`ObjectTid` = 22 AND crp.`CostRateType` = 0 AND crp.`ObjectOid` = cb2sc.`CostBearerOid` AND (crp.`EndDate` is null or crp.`EndDate` > ':Monat_Start') order by IF(crp.`EndDate` is null, MAKEDATE(9999,365),crp.`EndDate`) LIMIT 1 ), 2) AS 'Betrag', + c.DebitorNumber, + c.CostCenter, + CONCAT(p.`LastName`, ', ', p.`FirstName`, ' - Assistenz') as 'Verwendung', + cb2sc.Oid + FROM `supportconcept` sc + INNER JOIN `costbearer2supportconcept` cb2sc ON sc.`Oid` = cb2sc.`SupportConceptOid` + INNER JOIN `costbearer` cb ON cb2sc.`CostBearerOid` = cb.`Oid` + INNER JOIN `organisation` org ON org.`CostBearerOid` = cb.`Oid` + INNER JOIN `customer` c ON sc.`CustomerOid` = c.`Oid` + INNER JOIN `person` p on c.`PersonOid` = p.`Oid` + LEFT JOIN + (SELECT sr2.`CostBearer2SupportConceptOid`, SUM(sr2.`roundedduration` / IF(sr2.`GroupEmployeeCount` is null, 1, sr2.`GroupEmployeeCount`)) AS GeleisteteFLM FROM `servicerecord` sr2 + INNER JOIN `servicedescription` sd ON sr2.`ServiceDescriptionOid` = sd.`Oid` + INNER JOIN `servicecategory` sc ON sd.`ServiceCategoryOid` = sc.`Oid` + WHERE sr2.`StartDate` >= ':Monat_Start' AND sr2.`StartDate` < ':Monat_End' AND sc.`Billable` = 1 GROUP BY sr2.`CostBearer2SupportConceptOid`) + AS sr ON sr.`CostBearer2SupportConceptOid` = cb2sc.`Oid` + WHERE c.`IsActive` = 1 AND sc.`IsActive` = 1 + and (sr.`GeleisteteFLM` is not null) + and (org.Name = 'LVR Assistenzleistungen' OR org.Name = 'LWL Assistenzleistungen') + "; + + return sql; + } + + private static String GetMonatlicheRechnungenSql(DateTime date) + { + + String sql = @" + select + sip.Claim, + c.DebitorNumber, + ib.InvoiceDate, + ib.invoicenumber, + c.CostCenter, + c2s.Oid, + ib.InvoiceId + 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; + } + + private static String GetSpitzabrechnungenSql(DateTime date) + { + String sql = @" + SELECT + Round(si.Claim, 2), + c.DebitorNumber, + ib.InvoiceDate, + ib.InvoiceNumber, + c.CostCenter, + CONCAT('Endabrechnung ', date_format(ib.AccountingPeriodStart, '%d.%m.%Y'), ' - ', date_format(ib.AccountingPeriodEnd, '%d.%m.%Y'), ' ', p.`FirstName`, ' ', p.`LastName`, ' ', SUBSTRING(ib.RecipientOrganisation, 0, 7)), + (select t.name from team t inner join team2customer t2c on t2c.teamoid = t.oid where t2c.customeroid = c.Oid limit 1), + 'LVR oder LWL' AS 'ii.ItemDescription' + from invoicebase ib + join settlementinvoice si on si.invoicebaseoid = ib.oid + join supportconcept sc on sc.oid = ib.supportconceptoid + join customer c on c.oid = sc.customeroid + join `person` p on c.`PersonOid` = p.`Oid` + where ib.`InvoiceDate` >= ':Monat_Start' AND ib.`InvoiceDate` < ':Monat_End' + and ib.type = 1 and ib.isactive = 1 and c.isactive <> 0 + "; + + 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]; + } + } +} \ No newline at end of file diff --git a/ReportImp/VkmRietberg/VkmRietberg.csproj b/ReportImp/VkmRietberg/VkmRietberg.csproj index 6a0bc4702..6378d0e0e 100644 --- a/ReportImp/VkmRietberg/VkmRietberg.csproj +++ b/ReportImp/VkmRietberg/VkmRietberg.csproj @@ -51,6 +51,8 @@ + + Component @@ -153,6 +155,10 @@ {40D8B312-EA64-49E3-A31A-5E57ED4D5654} Report + + {094331C3-ECEE-4C89-BBFD-4C9DED89F0EF} + Service + {2F50B83D-A3F0-4EC4-979A-3F9B7E3D8ED4} Shared