using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Text; using BeWo.Data.Access; using BeWo.Data.Entities; using BeWo.Service.DCEntityMapper; using BS.Shared; using BS.Shared.DataContracts; using BS.Shared.Extensions; namespace CaritasWuppertalSolingen.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("Belegdatum;Belegnummer;Debitorennummer;Kontonummer;Betrag;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); } 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("Datum;Text;Belegnr.;Betrag;Konto;Gegenkonto;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:dd.MM.yyyy}", row[2])); 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, c2s.CustomerReferenceNumber, row[2]); } sb.Append(buchungstext); sb.Append(";"); sb.Append(String.Format("{0}", row[3])); sb.Append(";"); sb.Append(String.Format("{0:0.00}", row[0])); sb.Append(";"); sb.Append(String.Format("{0}", row[1])); sb.Append(";"); sb.Append("4962"); // Erlöskonto sb.Append(";"); sb.Append("619"); // Kostenstelle } return sb.ToString(); } public static String GetMonatlicheBetraegeString(DateTime date) { var sql = GetMonatlicheBetraegeLvrSql(date); /* 'Betrag', c.DebitorNumber, c.CostCenter, CONCAT(p.`LastName`, ', ') as 'Verwendung', cb2sc.Oid */ //sb.AppendLine("Datum;Text;Belegnr.;Betrag;Konto;Gegenkonto;Kostenstelle"); var dt = ExecuteQuery(sql, date); 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:dd.MM.yyyy}", lastDate)); sb.Append(";"); String buchungstext = ""; long? c2sOid = (long?)row[4]; if (c2sOid.HasValue) { var c2s = DAOFactory.GenericDAO.LoadByID(c2sOid.Value); var c = c2s.SupportConcept.Customer; buchungstext = String.Format("{0} - {1} - {2:yyyy}/{2:MM}", c.Person.LastName, c2s.CustomerReferenceNumber, lastDate); } sb.Append(buchungstext); sb.Append(";"); sb.Append(String.Format("{0:MM}{1}", lastDate, lastDate.Year)); sb.Append(";"); sb.Append(String.Format("{0:0.00}", row[0])); sb.Append(";"); sb.Append(String.Format("{0}", row[1])); sb.Append(";"); sb.Append("4962"); // Erlöskonto sb.Append(";"); sb.Append("619"); // Kostenstelle } return sb.ToString(); } 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 GetMonatlicheBetraegeLvrSql(DateTime date) { String sql = @" 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`, ', ') 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 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 1' ORDER BY p.`LastName`, p.`FirstName`, cb2sc.`ApprovedStartDate` "; 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]; } } }