From 746fc06636c279391a10fcd68fdc92681e124ecf Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 18 Jun 2026 11:01:03 +0200 Subject: [PATCH] =?UTF-8?q?Soziale=20Dienstleistungen=20Becker:=20Neue=20R?= =?UTF-8?q?echnung=20f=C3=BCr=20Integrationsdienst=20und=20Datev=20Export?= =?UTF-8?q?=20eingebaut?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Export/CustomDataExporter.cs | 18 + .../Export/DatevExporter.cs | 121 +++++ .../Export/FiBuDatensatz.cs | 27 ++ .../Export/TempFiBuExport.cs | 446 ++++++++++++++++++ .../Invoicing/CustomInvoiceCreation.cs | 40 ++ .../Invoicing/CustomInvoiceFactory.cs | 32 ++ .../Properties/Resources.Designer.cs | 63 +++ .../Properties/Resources.resx | 120 +++++ .../RechnungIB.Designer.cs | 73 +-- .../RechnungIB.cs | 33 +- .../RechnungIB.resx | 5 +- ...ozialeDienstleistungenBeckerReports.csproj | 16 + .../logo.png | Bin 5897 -> 5613 bytes 13 files changed, 963 insertions(+), 31 deletions(-) create mode 100644 ReportImp/SozialeDienstleistungenBeckerReports/Export/CustomDataExporter.cs create mode 100644 ReportImp/SozialeDienstleistungenBeckerReports/Export/DatevExporter.cs create mode 100644 ReportImp/SozialeDienstleistungenBeckerReports/Export/FiBuDatensatz.cs create mode 100644 ReportImp/SozialeDienstleistungenBeckerReports/Export/TempFiBuExport.cs create mode 100644 ReportImp/SozialeDienstleistungenBeckerReports/Invoicing/CustomInvoiceCreation.cs create mode 100644 ReportImp/SozialeDienstleistungenBeckerReports/Invoicing/CustomInvoiceFactory.cs create mode 100644 ReportImp/SozialeDienstleistungenBeckerReports/Properties/Resources.Designer.cs create mode 100644 ReportImp/SozialeDienstleistungenBeckerReports/Properties/Resources.resx diff --git a/ReportImp/SozialeDienstleistungenBeckerReports/Export/CustomDataExporter.cs b/ReportImp/SozialeDienstleistungenBeckerReports/Export/CustomDataExporter.cs new file mode 100644 index 000000000..914b16927 --- /dev/null +++ b/ReportImp/SozialeDienstleistungenBeckerReports/Export/CustomDataExporter.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using BeWo.Service.Invoicing.FibuExport; +using BeWo.Service.Plugins; +using BS.Shared.DataContracts; + +namespace SozialeDienstleistungenBeckerReports.Export +{ + public class CustomDataExporter : DataExporter + { + public override QueryDC CreateQuery(QueryDC query) + { + var fibuExport = new DatevExporter(query); + return fibuExport.CreateQuery(); + //return null; + } + } +} diff --git a/ReportImp/SozialeDienstleistungenBeckerReports/Export/DatevExporter.cs b/ReportImp/SozialeDienstleistungenBeckerReports/Export/DatevExporter.cs new file mode 100644 index 000000000..9deb352b8 --- /dev/null +++ b/ReportImp/SozialeDienstleistungenBeckerReports/Export/DatevExporter.cs @@ -0,0 +1,121 @@ +using BeWo.Data.Access; +using BeWo.Data.Entities; +using BeWo.Service.Invoicing.FibuExport; +using BeWo.Service.Invoicing.FiBuExport; +using BeWo.Service.Plugins; +using BS.Shared; +using BS.Shared.DataContracts; +using System; +using System.Collections.Generic; +using System.Data; +using System.Linq; + +namespace SozialeDienstleistungenBeckerReports.Export +{ + public class DatevExporter : TempFiBuExport + { + public DatevExporter(QueryDC query) : base(query) + { + } + + public override List> GetHeader() + { + return new List> + { + new KeyValuePair ("UMSATZ", "Betrag"), + new KeyValuePair ("GEGENKONTO", "DebitorNummer"), + new KeyValuePair ("BELEG1", "Belegnummer"), + new KeyValuePair ("DATUM", "Datum"), + new KeyValuePair ("KONTO", "KontoHilfeplan"), + new KeyValuePair ("KOST1", "KostenstelleKlient"), + new KeyValuePair ("KOST2", "KostenstelleHilfeplan"), + new KeyValuePair ("BUCHUNGSTEXT", "Buchungstext") + }; + } + + public override FiBuDatensatz CreateFibuDatensatz(DataRow row) + { + var fd = base.CreateFibuDatensatz(row); + + + SetzeFehlendeKontenUndKostenstellen(fd); + + + fd.Buchungstext = String.Format("{0}, {1}", fd.CustomerLastName, fd.CustomerFirstName); + + return fd; + } + + private void SetzeFehlendeKontenUndKostenstellen(FiBuDatensatz fd) + { + if (String.IsNullOrEmpty(fd.KostenstelleHilfeplan) || String.IsNullOrEmpty(fd.KontoHilfeplan) || String.IsNullOrEmpty(fd.KostenstelleKlient)) + { + if (fd.CustomerOid.HasValue) + { + var c = DAOFactory.GenericDAO.LoadByID(fd.CustomerOid.Value); + + fd.KostenstelleKlient = GetMitarbeiterKostenstelle(c); + + var bereich = GetBereich(c); + + if ("BEWO".Equals(bereich)) + { + fd.KostenstelleHilfeplan = "40000"; + fd.KontoHilfeplan = "4000"; + } + else if ("JH".Equals(bereich)) + { + fd.KostenstelleHilfeplan = "40020"; + fd.KontoHilfeplan = "4002"; + } + else if ("IB".Equals(bereich)) + { + fd.KostenstelleHilfeplan = "40010"; + fd.KontoHilfeplan = "4001"; + } + } + } + } + + private string GetMitarbeiterKostenstelle(Customer customer) + { + + var hauptbetreuer = customer.Employee2CustomerList.FirstOrDefault(e2c => e2c.IsActive == ActivationTypeId.Active && + (!e2c.StartDate.HasValue || e2c.StartDate.Value.Date <= Datum) && (!e2c.EndDate.HasValue || e2c.EndDate.Value.Date >= Datum) && + e2c.ValueList.Any(b => b.Entry.Type.Equals(ValueListEntryType.StaffRoleType) && b.Entry.Value.ToLower().Equals("hauptbetreuung")))?.Employee; + + if (hauptbetreuer != null) + { + return hauptbetreuer.PersonnelNumber; + } + + return ""; + } + + private String GetBereich(Customer customer) + { + foreach (var t2c in customer.Team2CustomerList) + { + if (t2c.Team.Name.ToLower().Contains("bewo")) + { + return "BEWO"; + } + else if (t2c.Team.Name.ToLower().Contains("jugendhilfe")) + { + return "JH"; + } + else if (t2c.Team.Name.ToLower().Contains("inklusion")) + { + return "IB"; + } + } + + return "BEWO"; + } + + public override IList CreateDatensaetze(bool holeSammelRechnungen, bool holeSpitzabrechnungen, bool holeStundenBetraege, bool holeAbschlagszahlungen) + { + return base.CreateDatensaetze(true, false, false, true); + } + } +} diff --git a/ReportImp/SozialeDienstleistungenBeckerReports/Export/FiBuDatensatz.cs b/ReportImp/SozialeDienstleistungenBeckerReports/Export/FiBuDatensatz.cs new file mode 100644 index 000000000..4264c9d44 --- /dev/null +++ b/ReportImp/SozialeDienstleistungenBeckerReports/Export/FiBuDatensatz.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SozialeDienstleistungenBeckerReports.Export +{ + public class FiBuDatensatz + { + public String CustomerFirstName { get; set; } + public String CustomerLastName { get; set; } + public decimal? Betrag { get; set; } + public String Belegnummer { get; set; } + public DateTime Datum { get; set; } + public String DebitorNummer { get; set; } + public String KontoHilfeplan { get; set; } + public String KostenstelleKlient { get; set; } + public String KostenstelleHilfeplan { get; set; } + public String Buchungstext { get; set; } + public String InvoiceId { get; set; } + public String OrganisationName { get; set; } + public long? Costbearer2SupportConceptOid { get; set; } + public long? CustomerOid { get; set; } + + } +} diff --git a/ReportImp/SozialeDienstleistungenBeckerReports/Export/TempFiBuExport.cs b/ReportImp/SozialeDienstleistungenBeckerReports/Export/TempFiBuExport.cs new file mode 100644 index 000000000..46d084558 --- /dev/null +++ b/ReportImp/SozialeDienstleistungenBeckerReports/Export/TempFiBuExport.cs @@ -0,0 +1,446 @@ +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.Service.DCEntityMapper; +using BeWo.Service.Invoicing.FiBuExport; +using BS.Shared; +using BS.Shared.DataContracts; +using BS.Shared.Extensions; + +namespace SozialeDienstleistungenBeckerReports.Export +{ + public class TempFiBuExport + { + + public QueryDC Query { get; set; } + public DateTime Datum { get; set; } + public bool FilterNachRechnungsdatum { get; set; } + + public TempFiBuExport(QueryDC query) + { + Query = query; + DateTime dt = DateTime.Now; + DateTime.TryParse(query.Parameter[0].Value.ToString(), out dt); + + Datum = dt; + FilterNachRechnungsdatum = false; + } + + + public virtual QueryDC CreateQuery() + { + Query.FileName = GetFileName(); + Query.QueryResult = GetResultString(); + + return Query; + } + + + public virtual String GetFileName() + { + return String.Format("Export {0:yyyyMM}.csv", Datum); + } + + public virtual string GetResultString() + { + return GetCsvString(); + } + + public virtual List> GetHeader() + { + return new List> + { + new KeyValuePair ("Betrag", "Betrag"), + new KeyValuePair ("Belegnummer", "Belegnummer"), + new KeyValuePair ("Datum", "Datum"), + new KeyValuePair ("Konto", "KontoHilfeplan"), + new KeyValuePair ("Gegenkonto", "Debitornummer"), + new KeyValuePair ("Kostenstelle", "KostenstelleKlient"), + new KeyValuePair ("Buchungstext", "Buchungstext") + }; + } + + public virtual String GetCsvString(String separator = ";") + { + StringBuilder sb = new StringBuilder(); + + var header = GetHeader(); + if (header != null && header.Count > 0) + { + sb.AppendLine(String.Join(separator, header.Select(k => k.Key))); + } + + var daten = CreateDatensaetze(); + + var s = GetDatenCsv(daten); + + if (!String.IsNullOrWhiteSpace(s)) + { + sb.Append(s); + } + + return sb.ToString(); + } + + public virtual IList CreateDatensaetze() + { + return CreateDatensaetze(true, true, true, true); + } + + public virtual string GetDatenCsv(IList daten, String separator = ";") + { + StringBuilder sb = new StringBuilder(); + + var header = GetHeader(); + foreach (var item in daten) + { + sb.AppendLine(String.Join(separator, GetDatensatzValues(item, header))); + } + + return sb.ToString(); + } + + public virtual string[] GetDatensatzValues(FiBuDatensatz item, List> header) + { + var values = new List(); + foreach (var kv in header) + { + var test = GetDatensatzValue(item, kv.Value); + if (test != null) + { + values.Add(test.ToString()); + } + else + { + values.Add(String.Empty); + } + } + return values.ToArray(); + } + + public virtual string GetDatensatzValue(FiBuDatensatz item, string propertyName) + { + if ("Betrag".Equals(propertyName)) + { + return String.Format("{0:0.00}", item.Betrag); + } + if ("Datum".Equals(propertyName)) + { + return String.Format("{0:dd.MM.yyyy}", item.Datum); + } + var test = item.GetPropertyValue(propertyName); + if (test != null) + { + return test.ToString(); + } + return String.Empty; + } + + public virtual IList CreateDatensaetze(bool holeSammelRechnungen, bool holeSpitzabrechnungen, bool holeStundenBetraege, bool holeAbschlagszahlungen) + { + var result = new List(); + + if (holeSammelRechnungen) + { + var sql = GetSammelRechnungenSql(); + var dt = ExecuteQuery(sql); + + result.AddRange(GetRechnungenDatensaetze(dt)); + } + if (holeSpitzabrechnungen) + { + var sql = GetSpitzabrechnungenSql(); + var dt = ExecuteQuery(sql); + + result.AddRange(GetRechnungenDatensaetze(dt)); + } + if (holeStundenBetraege) + { + var sql = GetMonatlicheBetraegeAnhandGeleisteterStundenSql(); + var dt = ExecuteQuery(sql); + + result.AddRange(GetRechnungenDatensaetze(dt)); + } + if (holeAbschlagszahlungen) + { + var sql = GetAbschlagszahlungenSql(); + var dt = ExecuteQuery(sql); + + result.AddRange(GetRechnungenDatensaetze(dt)); + } + return result; + } + + private IEnumerable GetRechnungenDatensaetze(DataTable dt) + { + var result = new List(); + + foreach (DataRow row in dt.Rows) + { + var fd = CreateFibuDatensatz(row); + + result.Add(fd); + } + + return result; + } + + public virtual FiBuDatensatz CreateFibuDatensatz(DataRow row) + { + var fd = new FiBuDatensatz(); + + fd.CustomerLastName = row[0].ToString(); + fd.CustomerFirstName = row[1].ToString(); + fd.Betrag = (decimal?)row[2]; + fd.DebitorNummer = row[3].ToString(); + fd.Datum = (DateTime)row[4]; + fd.Belegnummer = row[5].ToString(); + fd.InvoiceId = row[6].ToString(); + fd.KostenstelleKlient = row[7].ToString(); + fd.OrganisationName = row[8].ToString(); + fd.KontoHilfeplan = row[9].ToString(); + fd.KostenstelleHilfeplan = row[10].ToString(); + fd.Costbearer2SupportConceptOid = (long?)row[11]; + fd.CustomerOid = (long?)row[12]; + + return fd; + } + + public virtual String GetSammelRechnungenSql() + { + String sql = @" + select + p.Lastname, + p.Firstname, + sip.Claim, + c.DebitorNumber, + ib.InvoiceDate, + ib.invoicenumber, + ib.InvoiceId, + c.CostCenter, + org.Name, + c2s.KontoHilfeplan, + c2s.KostenstelleHilfeplan, + c2s.Oid as 'c2sOid', + c.Oid as 'CustomerOid' + 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 costbearer cb on c2s.costbeareroid = cb.oid + inner join organisation org on org.costbeareroid = cb.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 DATUMFILTER AND ib.IsActive = 1 AND ib.`IsExported` = 0 + "; + if (FilterNachRechnungsdatum) + { + sql = sql.Replace("DATUMFILTER", "ib.InvoiceDate >= ':Monat_Start' AND ib.InvoiceDate < ':Monat_End'"); + } + else + { + sql = sql.Replace("DATUMFILTER", "ib.`AccountingPeriodEnd` >= ':Monat_Start' AND ib.`AccountingPeriodEnd` < ':Monat_End'"); + } + return sql; + } + + public virtual String GetSpitzabrechnungenSql() + { + String sql = @" + select + p.Lastname, + p.Firstname, + si.Claim, + c.DebitorNumber, + ib.InvoiceDate, + ib.invoicenumber, + ib.InvoiceId, + c.CostCenter, + org.Name, + c2s.KontoHilfeplan, + c2s.KostenstelleHilfeplan, + c2s.Oid as 'c2sOid', + c.Oid as 'CustomerOid' + from invoicebase ib + join settlementinvoice si on si.invoicebaseoid = ib.oid + join supportconcept sc on sc.oid = ib.supportconceptoid + join costbearer2supportconcept c2s on c2s.supportconceptoid = sc.oid + join costbearer cb on c2s.costbeareroid = cb.oid + join organisation org on org.costbeareroid = cb.oid + join customer c on c.oid = sc.customeroid + join `person` p on c.`PersonOid` = p.`Oid` + WHERE DATUMFILTER + AND ib.type = 1 AND ib.isactive = 1 and c.isactive <> 0 AND ib.`IsExported` = 0 + "; + //if (FilterNachRechnungsdatum) + //{ + sql = sql.Replace("DATUMFILTER", "ib.InvoiceDate >= ':Monat_Start' AND ib.InvoiceDate < ':Monat_End'"); + //} + //else + //{ + // sql = sql.Replace("DATUMFILTER", "ib.`AccountingPeriodEnd` >= ':Monat_Start' AND ib.`AccountingPeriodEnd` < ':Monat_End'"); + //} + return sql; + } + + + + public virtual String GetAbschlagszahlungenSql() + { + String sql = @" + SELECT + p.Lastname, + p.Firstname, + at.Amount as 'Betrag', + c.DebitorNumber, + at.BookingDate, + at.Notice, + 'Abschlagszahlung', + c.CostCenter, + org.Name, + c2s.KontoHilfeplan, + c2s.KostenstelleHilfeplan, + c2s.Oid as 'c2sOid', + c.Oid as 'CustomerOid' + from accountingtransaction at + join costbearer2supportconcept c2s on c2s.oid = at.costbearer2supportconceptoid + join costbearer cb on c2s.costbeareroid = cb.oid + join organisation org on org.costbeareroid = cb.oid + join supportconcept sc on sc.oid = c2s.supportconceptoid + join customer c on sc.customeroid = c.oid + join person p on c.personoid = p.oid + WHERE at.`BookingDate` >= ':Monat_Start' AND at.`BookingDate` < ':Monat_End' and c.`IsActive` <> 0 AND sc.`IsActive` <> 0 + ORDER BY p.`LastName`, p.`FirstName` + "; + return sql; + } + + public virtual String GetMonatlicheBetraegeAnhandGeleisteterStundenSql() + { + return GetMonatlicheBetraegeAnhandGeleisteterStundenSql("LVR%"); + } + + public virtual String GetMonatlicheBetraegeAnhandGeleisteterStundenSql(String organisationFilter, String fehlkontaktString = "Fehlkontakt") + { + String sql = @" + SELECT + qry.LastName, + qry.FirstName, + sum(qry.Betrag), + qry.DebitorNumber, + null, + null, + null, + qry.CostCenter, + qry.Kostentraeger, + qry.KontoHilfeplan, + qry.KostenstelleHilfeplan, + qry.cb2scOid, + qry.CustomerOid + 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, + cb2sc.KontoHilfeplan, + p.LastName, + p.FirstName, + CONCAT(p.`LastName`, ', ', p.`FirstName`) as 'Verwendung', + org.Name AS Kostentraeger, + cb2sc.Oid as 'cb2scOid', + c.Oid as 'CustomerOid' + 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 FEHLKONTAKTFILTER1 GROUP BY sr2.`CostBearer2SupportConceptOid`) + AS sr ON sr.`CostBearer2SupportConceptOid` = cb2sc.`Oid` + WHERE ORGANISATIONFILTER c.`IsActive` <> 0 AND sc.`IsActive` <> 0 AND (sr.`GeleisteteFLM` is not null)) + 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 ),2) AS 'Betrag', + c.DebitorNumber, + c.CostCenter, + cb2sc.KontoHilfeplan, + p.LastName, + p.FirstName, + CONCAT(p.`LastName`, ', ', p.`FirstName`) as 'Verwendung', + org.Name AS Kostentraeger, + cb2sc.Oid as 'cb2scOid', + c.Oid as 'CustomerOid' + 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 FEHLKONTAKTFILTER2 GROUP BY sr2.`CostBearer2SupportConceptOid`) + AS sr ON sr.`CostBearer2SupportConceptOid` = cb2sc.`Oid` + WHERE ORGANISATIONFILTER c.`IsActive` <> 0 AND sc.`IsActive` <> 0 AND (sr.`GeleisteteFLM` is not null)) + )qry + GROUP BY qry.cb2scOid + "; + + String orgFilter = ""; + if (!String.IsNullOrEmpty(organisationFilter)) + { + if (organisationFilter.Contains("%")) + { + sql = sql.Replace("ORGANISATIONFILTER", String.Format("org.Name LIKE '{0}' AND", organisationFilter)); + } + else + { + sql = sql.Replace("ORGANISATIONFILTER", String.Format("org.Name = '{0}' AND", organisationFilter)); + } + } + + String fkFilter1 = ""; + String fkFilter2 = ""; + if (!String.IsNullOrEmpty(fehlkontaktString)) + { + fkFilter1 = String.Format("AND sd.Name <> '{0}'", fehlkontaktString); + fkFilter2 = String.Format("AND sd.Name = '{0}'", fehlkontaktString); + } + sql = sql.Replace("FEHLKONTAKTFILTER1", fkFilter1); + sql = sql.Replace("FEHLKONTAKTFILTER2", fkFilter2); + return sql; + } + + + + public virtual DataTable ExecuteQuery(String sql) + { + var newsql = sql; + newsql = newsql.Replace(":Abrechnungsmonat", String.Format("{0:dd.MM.yyyy}", Datum)); + newsql = newsql.Replace(":Belegnr", String.Format("{0:yyMM}", Datum)); + newsql = newsql.Replace(":Monat_MM", String.Format("{0:MM}", Datum)); + newsql = newsql.Replace(":Monat_Start", String.Format("{0:yyyy-MM}-01", Datum)); + newsql = newsql.Replace(":Monat_End", String.Format("{0:yyyy-MM}-01", Datum.AddMonths(1))); + + return DAOFactory.AdoDAO.ExecuteQuery(newsql).Tables[0]; + } + } +} \ No newline at end of file diff --git a/ReportImp/SozialeDienstleistungenBeckerReports/Invoicing/CustomInvoiceCreation.cs b/ReportImp/SozialeDienstleistungenBeckerReports/Invoicing/CustomInvoiceCreation.cs new file mode 100644 index 000000000..1b34ebc4c --- /dev/null +++ b/ReportImp/SozialeDienstleistungenBeckerReports/Invoicing/CustomInvoiceCreation.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using BeWo.Data.Access; +using BeWo.Data.Entities; +using BeWo.Report.ReportObjects; +using BeWo.Service.DCEntityMapper; +using BeWo.Service.Invoicing; +using BeWo.Service.Plugins; +using BS.Shared; +using BS.Shared.Core; +using BS.Shared.DataContracts; +using BS.Shared.DataContracts.Compact; +using BS.Shared.Extensions; +using BS.Shared.Services; +using DevExpress.Office.Drawing; +using Service.Invoicing; + +namespace SozialeDienstleistungenBeckerReports.Invoicing +{ + public class CustomInvoiceCreation : InvoiceCreation + { + public override InvoiceItem CreateInvoiceItem(ServiceRecordDC iServiceRecord, SupportConceptApprovalPeriod scap, Calculations calc) + { + var ii = base.CreateInvoiceItem(iServiceRecord, scap, calc); + if (iServiceRecord != null && iServiceRecord.Betrag.HasValue && iServiceRecord.Betrag > 0 && ii.ServiceRecord.ServiceDescription.Name.Contains("Zusatzleistung")) { + ii.UnitCount = 1; + ii.AmountPerUnit = iServiceRecord.Betrag; + ii.ItemDescription = iServiceRecord.Notice; + if (String.IsNullOrEmpty(ii.ItemDescription)) + { + ii.ItemDescription = "Zusatzleistung"; + } + } + return ii; + } + + + } +} diff --git a/ReportImp/SozialeDienstleistungenBeckerReports/Invoicing/CustomInvoiceFactory.cs b/ReportImp/SozialeDienstleistungenBeckerReports/Invoicing/CustomInvoiceFactory.cs new file mode 100644 index 000000000..790659319 --- /dev/null +++ b/ReportImp/SozialeDienstleistungenBeckerReports/Invoicing/CustomInvoiceFactory.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using BeWo.Data.Access; +using BeWo.Data.Entities; +using BeWo.Service.Invoicing; +using BS.Shared.DataContracts; +using BS.Shared.DataContracts.Compact; + +namespace SozialeDienstleistungenBeckerReports.Invoicing +{ + public class CustomInvoiceFactory : InvoiceFactory + { + public override InvoiceCreation CreateInvoiceCreator(string specificId, string tenant, Dictionary> supportConcepts2ServiceRecords) + { + var creator = new CustomInvoiceCreation(); + + return creator; + + } + + // private InvoiceCreation GetInvoiceCreatorForCategory(String catName) + // { + // if (!String.IsNullOrEmpty(catName)) + // { + // String cat = catName.ToLower().Trim(); + // if (cat.IndexOf("assistenz") >= 0) + // return new CustomInvoiceCreation(); + // } + // return null; + // } + } +} diff --git a/ReportImp/SozialeDienstleistungenBeckerReports/Properties/Resources.Designer.cs b/ReportImp/SozialeDienstleistungenBeckerReports/Properties/Resources.Designer.cs new file mode 100644 index 000000000..690a45fc8 --- /dev/null +++ b/ReportImp/SozialeDienstleistungenBeckerReports/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// Dieser Code wurde von einem Tool generiert. +// Laufzeitversion:4.0.30319.42000 +// +// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +// der Code erneut generiert wird. +// +//------------------------------------------------------------------------------ + +namespace SozialeDienstleistungenBeckerReports.Properties { + using System; + + + /// + /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. + /// + // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert + // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. + // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen + // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SozialeDienstleistungenBeckerReports.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle + /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/ReportImp/SozialeDienstleistungenBeckerReports/Properties/Resources.resx b/ReportImp/SozialeDienstleistungenBeckerReports/Properties/Resources.resx new file mode 100644 index 000000000..1af7de150 --- /dev/null +++ b/ReportImp/SozialeDienstleistungenBeckerReports/Properties/Resources.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ReportImp/SozialeDienstleistungenBeckerReports/RechnungIB.Designer.cs b/ReportImp/SozialeDienstleistungenBeckerReports/RechnungIB.Designer.cs index b11a265a2..d95d847d5 100644 --- a/ReportImp/SozialeDienstleistungenBeckerReports/RechnungIB.Designer.cs +++ b/ReportImp/SozialeDienstleistungenBeckerReports/RechnungIB.Designer.cs @@ -29,13 +29,14 @@ namespace BeWo.Report.DefaultReports private void InitializeComponent() { this.components = new System.ComponentModel.Container(); - DevExpress.XtraReports.UI.XRSummary xrSummary1 = new DevExpress.XtraReports.UI.XRSummary(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(ServiceInvoiceReport)); + DevExpress.XtraReports.UI.XRSummary xrSummary1 = new DevExpress.XtraReports.UI.XRSummary(); DevExpress.XtraReports.UI.XRWatermark xrWatermark1 = new DevExpress.XtraReports.UI.XRWatermark(); this.Detail = new DevExpress.XtraReports.UI.DetailBand(); this.ReportHeader = new DevExpress.XtraReports.UI.ReportHeaderBand(); this.ruleRateFactorNull = new DevExpress.XtraReports.UI.FormattingRule(); this.topMarginBand1 = new DevExpress.XtraReports.UI.TopMarginBand(); + this.xrPictureBox1 = new DevExpress.XtraReports.UI.XRPictureBox(); this.xrLabel7 = new DevExpress.XtraReports.UI.XRLabel(); this.xrLabel6 = new DevExpress.XtraReports.UI.XRLabel(); this.xrLabel5 = new DevExpress.XtraReports.UI.XRLabel(); @@ -93,8 +94,6 @@ namespace BeWo.Report.DefaultReports this.xrTableCell46 = new DevExpress.XtraReports.UI.XRTableCell(); this.xrTableCell47 = new DevExpress.XtraReports.UI.XRTableCell(); this.GroupFooter1 = new DevExpress.XtraReports.UI.GroupFooterBand(); - this.GroupFooter2 = new DevExpress.XtraReports.UI.GroupFooterBand(); - this.xrLabel9 = new DevExpress.XtraReports.UI.XRLabel(); this.xrTable1 = new DevExpress.XtraReports.UI.XRTable(); this.xrTableRow9 = new DevExpress.XtraReports.UI.XRTableRow(); this.xrTableCell9 = new DevExpress.XtraReports.UI.XRTableCell(); @@ -102,6 +101,8 @@ namespace BeWo.Report.DefaultReports this.xrTableRow10 = new DevExpress.XtraReports.UI.XRTableRow(); this.xrTableCell12 = new DevExpress.XtraReports.UI.XRTableCell(); this.xrTableCell19 = new DevExpress.XtraReports.UI.XRTableCell(); + this.GroupFooter2 = new DevExpress.XtraReports.UI.GroupFooterBand(); + this.xrLabel9 = new DevExpress.XtraReports.UI.XRLabel(); this.bindingSource1 = new System.Windows.Forms.BindingSource(this.components); ((System.ComponentModel.ISupportInitialize)(this.xrTable2)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.xrTable5)).BeginInit(); @@ -133,19 +134,28 @@ namespace BeWo.Report.DefaultReports // topMarginBand1 // this.topMarginBand1.Controls.AddRange(new DevExpress.XtraReports.UI.XRControl[] { + this.xrPictureBox1, this.xrLabel7, this.xrLabel6, this.xrLabel5}); this.topMarginBand1.HeightF = 250F; this.topMarginBand1.Name = "topMarginBand1"; // + // xrPictureBox1 + // + this.xrPictureBox1.ImageSource = new DevExpress.XtraPrinting.Drawing.ImageSource("img", resources.GetString("xrPictureBox1.ImageSource")); + this.xrPictureBox1.LocationFloat = new DevExpress.Utils.PointFloat(0F, 43.125F); + this.xrPictureBox1.Name = "xrPictureBox1"; + this.xrPictureBox1.SizeF = new System.Drawing.SizeF(160.3966F, 53.11836F); + this.xrPictureBox1.Sizing = DevExpress.XtraPrinting.ImageSizeMode.ZoomImage; + // // xrLabel7 // this.xrLabel7.Font = new DevExpress.Drawing.DXFont("Arial", 12F); - this.xrLabel7.LocationFloat = new DevExpress.Utils.PointFloat(0F, 76.00001F); + this.xrLabel7.LocationFloat = new DevExpress.Utils.PointFloat(160.3967F, 76.00001F); this.xrLabel7.Name = "xrLabel7"; this.xrLabel7.Padding = new DevExpress.XtraPrinting.PaddingInfo(2, 2, 0, 0, 100F); - this.xrLabel7.SizeF = new System.Drawing.SizeF(711.9997F, 43.66666F); + this.xrLabel7.SizeF = new System.Drawing.SizeF(449.6028F, 43.66666F); this.xrLabel7.StylePriority.UseFont = false; this.xrLabel7.StylePriority.UseTextAlignment = false; this.xrLabel7.Text = "50674 Köln - Hohenstaufenring 72"; @@ -153,11 +163,11 @@ namespace BeWo.Report.DefaultReports // // xrLabel6 // - this.xrLabel6.Font = new DevExpress.Drawing.DXFont("Arial", 20F, DevExpress.Drawing.DXFontStyle.Bold); - this.xrLabel6.LocationFloat = new DevExpress.Utils.PointFloat(0.0002034505F, 26.66668F); + this.xrLabel6.Font = new DevExpress.Drawing.DXFont("Arial", 18F, DevExpress.Drawing.DXFontStyle.Bold); + this.xrLabel6.LocationFloat = new DevExpress.Utils.PointFloat(160.3967F, 26.66667F); this.xrLabel6.Name = "xrLabel6"; this.xrLabel6.Padding = new DevExpress.XtraPrinting.PaddingInfo(2, 2, 0, 0, 100F); - this.xrLabel6.SizeF = new System.Drawing.SizeF(711.9997F, 47.00001F); + this.xrLabel6.SizeF = new System.Drawing.SizeF(449.6033F, 47.00001F); this.xrLabel6.StylePriority.UseFont = false; this.xrLabel6.StylePriority.UseTextAlignment = false; this.xrLabel6.Text = "SDB Soziale Dienstleistungen Becker"; @@ -165,11 +175,11 @@ namespace BeWo.Report.DefaultReports // // xrLabel5 // - this.xrLabel5.Font = new DevExpress.Drawing.DXFont("Bahnschrift Light Condensed", 9F, DevExpress.Drawing.DXFontStyle.Underline); - this.xrLabel5.LocationFloat = new DevExpress.Utils.PointFloat(0F, 218F); + this.xrLabel5.Font = new DevExpress.Drawing.DXFont("Arial", 6.5F, DevExpress.Drawing.DXFontStyle.Underline); + this.xrLabel5.LocationFloat = new DevExpress.Utils.PointFloat(0F, 222F); this.xrLabel5.Name = "xrLabel5"; this.xrLabel5.Padding = new DevExpress.XtraPrinting.PaddingInfo(2, 2, 0, 0, 100F); - this.xrLabel5.SizeF = new System.Drawing.SizeF(385.4167F, 17.00002F); + this.xrLabel5.SizeF = new System.Drawing.SizeF(385.4167F, 22.00002F); this.xrLabel5.StylePriority.UseFont = false; this.xrLabel5.Text = "SDB Soziale Dienstleistungen Becker, Hohenstaufenring 72, 50674 Köln"; // @@ -355,6 +365,8 @@ namespace BeWo.Report.DefaultReports // this.xrTableCell13.CanGrow = false; this.xrTableCell13.CanShrink = true; + this.xrTableCell13.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] { + new DevExpress.XtraReports.UI.XRBinding("Text", null, "CreatorName")}); this.xrTableCell13.Name = "xrTableCell13"; this.xrTableCell13.Padding = new DevExpress.XtraPrinting.PaddingInfo(2, 2, 0, 0, 100F); this.xrTableCell13.ProcessNullValues = DevExpress.XtraReports.UI.ValueSuppressType.SuppressAndShrink; @@ -740,6 +752,7 @@ namespace BeWo.Report.DefaultReports | DevExpress.XtraPrinting.BorderSide.Bottom))); this.xrTableCell42.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] { new DevExpress.XtraReports.UI.XRBinding("Text", null, "ServiceInvoicePeriods.ServiceInvoiceItems.ServiceDescription")}); + this.xrTableCell42.Multiline = true; this.xrTableCell42.Name = "xrTableCell42"; this.xrTableCell42.Padding = new DevExpress.XtraPrinting.PaddingInfo(2, 2, 2, 2, 100F); this.xrTableCell42.StylePriority.UseBorderColor = false; @@ -803,24 +816,6 @@ namespace BeWo.Report.DefaultReports this.GroupFooter1.HeightF = 60F; this.GroupFooter1.Name = "GroupFooter1"; // - // GroupFooter2 - // - this.GroupFooter2.Controls.AddRange(new DevExpress.XtraReports.UI.XRControl[] { - this.xrLabel9}); - this.GroupFooter2.HeightF = 217.5F; - this.GroupFooter2.Level = 1; - this.GroupFooter2.Name = "GroupFooter2"; - // - // xrLabel9 - // - this.xrLabel9.LocationFloat = new DevExpress.Utils.PointFloat(0.0002034505F, 0F); - this.xrLabel9.Multiline = true; - this.xrLabel9.Name = "xrLabel9"; - this.xrLabel9.Padding = new DevExpress.XtraPrinting.PaddingInfo(2, 2, 0, 0, 100F); - this.xrLabel9.SizeF = new System.Drawing.SizeF(701.9998F, 217.5F); - this.xrLabel9.StylePriority.UseFont = false; - this.xrLabel9.Text = resources.GetString("xrLabel9.Text"); - // // xrTable1 // this.xrTable1.LocationFloat = new DevExpress.Utils.PointFloat(0F, 0F); @@ -908,6 +903,24 @@ namespace BeWo.Report.DefaultReports this.xrTableCell19.TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleRight; this.xrTableCell19.Weight = 0.4431315074114891D; // + // GroupFooter2 + // + this.GroupFooter2.Controls.AddRange(new DevExpress.XtraReports.UI.XRControl[] { + this.xrLabel9}); + this.GroupFooter2.HeightF = 217.5F; + this.GroupFooter2.Level = 1; + this.GroupFooter2.Name = "GroupFooter2"; + // + // xrLabel9 + // + this.xrLabel9.LocationFloat = new DevExpress.Utils.PointFloat(0.0002034505F, 0F); + this.xrLabel9.Multiline = true; + this.xrLabel9.Name = "xrLabel9"; + this.xrLabel9.Padding = new DevExpress.XtraPrinting.PaddingInfo(2, 2, 0, 0, 100F); + this.xrLabel9.SizeF = new System.Drawing.SizeF(701.9998F, 217.5F); + this.xrLabel9.StylePriority.UseFont = false; + this.xrLabel9.Text = resources.GetString("xrLabel9.Text"); + // // bindingSource1 // this.bindingSource1.DataSource = typeof(BeWo.Report.ReportObjects.ServiceInvoiceRO); @@ -922,6 +935,7 @@ namespace BeWo.Report.DefaultReports this.Page1, this.DetailReport}); this.DataSource = this.bindingSource1; + this.DisplayName = "Rechnung"; this.ExportOptions.PrintPreview.DefaultFileName = "Spitzabrechnung"; this.Font = new DevExpress.Drawing.DXFont("Arial", 9F); this.FormattingRuleSheet.AddRange(new DevExpress.XtraReports.UI.FormattingRule[] { @@ -1014,5 +1028,6 @@ namespace BeWo.Report.DefaultReports private DevExpress.XtraReports.UI.XRTableRow xrTableRow10; private DevExpress.XtraReports.UI.XRTableCell xrTableCell12; private DevExpress.XtraReports.UI.XRTableCell xrTableCell19; + private DevExpress.XtraReports.UI.XRPictureBox xrPictureBox1; } } diff --git a/ReportImp/SozialeDienstleistungenBeckerReports/RechnungIB.cs b/ReportImp/SozialeDienstleistungenBeckerReports/RechnungIB.cs index abf22aed2..9b9b2b7ee 100644 --- a/ReportImp/SozialeDienstleistungenBeckerReports/RechnungIB.cs +++ b/ReportImp/SozialeDienstleistungenBeckerReports/RechnungIB.cs @@ -1,5 +1,6 @@ using BeWo.Report.ReportObjects; using BS.Shared.Extensions; +using DevExpress.Utils; using DevExpress.XtraReports.UI; using System; using System.Text; @@ -29,9 +30,39 @@ namespace BeWo.Report.DefaultReports if (pRO.CustomerSalutation.IsNullOrEmpty()) { - lblAnrede.Text = "Guten Tag,"; + lblAnrede.Text = "Sehr geehrte Damen und Herren,"; } + + if (pRO.InvoiceBase.SupportConceptCostBearerRelDc != null && pRO.InvoiceBase.SupportConceptCostBearerRelDc.ApprovalPeriodList != null) + { + foreach (var item in pRO.InvoiceBase.SupportConceptCostBearerRelDc.ApprovalPeriodList) + { + if (item.StartDate <= pRO.AccountingPeriodEnd && item.EndDate >= pRO.AccountingPeriodStart) + { + lblBereich.Text = item.Notice; + } + } + if (pRO.InvoiceBase.SupportConceptCostBearerRelDc.CostBearerContactPerson != null) + { + String personname = pRO.RecipientContactPerson; + if (pRO.InvoiceBase.SupportConceptCostBearerRelDc.CostBearerContactPerson.Geschlecht.HasValue) + { + if (pRO.InvoiceBase.SupportConceptCostBearerRelDc.CostBearerContactPerson.Geschlecht == BS.Shared.Sex.Female) + { + personname = String.Format("Frau {0}", pRO.InvoiceBase.SupportConceptCostBearerRelDc.CostBearerContactPerson.LastName); + lblAnrede.Text = String.Format("Sehr geehrte {0},", personname); + } + else if (pRO.InvoiceBase.SupportConceptCostBearerRelDc.CostBearerContactPerson.Geschlecht == BS.Shared.Sex.Male) + { + personname = String.Format("Herr {0}", pRO.InvoiceBase.SupportConceptCostBearerRelDc.CostBearerContactPerson.LastName); + lblAnrede.Text = String.Format("Sehr geehrte {0},", personname); + } + } + pRO.RecipientContactPerson = personname; + } + } + SetzeAdresse(pRO); String name = Regex.Replace(String.Format("{0}, {1}", pRO.CustomerLastName, pRO.CustomerFirstName), @"\s*\(.*?\)", ""); diff --git a/ReportImp/SozialeDienstleistungenBeckerReports/RechnungIB.resx b/ReportImp/SozialeDienstleistungenBeckerReports/RechnungIB.resx index 328f845ff..9688d91eb 100644 --- a/ReportImp/SozialeDienstleistungenBeckerReports/RechnungIB.resx +++ b/ReportImp/SozialeDienstleistungenBeckerReports/RechnungIB.resx @@ -117,6 +117,9 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 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 + Steuerfreie Leistung gem. § 4 Nr. 16 UStG @@ -131,6 +134,6 @@ Mit freundlichen Grüßen -i.A. Borgart +Diese Rechnung wurde maschinell erstellt und bedarf keiner Unterschrift. \ No newline at end of file diff --git a/ReportImp/SozialeDienstleistungenBeckerReports/SozialeDienstleistungenBeckerReports.csproj b/ReportImp/SozialeDienstleistungenBeckerReports/SozialeDienstleistungenBeckerReports.csproj index f9c399671..a657a7fbb 100644 --- a/ReportImp/SozialeDienstleistungenBeckerReports/SozialeDienstleistungenBeckerReports.csproj +++ b/ReportImp/SozialeDienstleistungenBeckerReports/SozialeDienstleistungenBeckerReports.csproj @@ -82,6 +82,10 @@ EmployeeKilometerauswertungsReport.cs + + + + Component @@ -95,6 +99,8 @@ InvoiceCustomerReport.cs + + Component @@ -125,6 +131,11 @@ OverlappingServiceRecords.cs + + True + True + Resources.resx + Component @@ -200,6 +211,10 @@ OverlappingServiceRecords.cs + + ResXFileCodeGenerator + Resources.Designer.cs + Quittierungsbeleg.cs Designer @@ -243,6 +258,7 @@ +