675 lines
27 KiB
C#
675 lines
27 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Data;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Text.RegularExpressions;
|
|
using BeWo.Data.Access;
|
|
using BeWo.Data.Entities;
|
|
using BeWo.Report.ReportObjects;
|
|
using BeWo.Service.DCEntityMapper;
|
|
using BS.Shared.Core;
|
|
using BS.Shared.DataContracts;
|
|
using BS.Shared.DataContracts.Compact;
|
|
using DiePerspektive.Invoicing;
|
|
|
|
namespace DiePerspektive.Export
|
|
{
|
|
public class FibuNetExporter
|
|
{
|
|
public static QueryDC CreateQuery(QueryDC query)
|
|
{
|
|
DateTime dt = DateTime.Now;
|
|
DateTime.TryParse(query.Parameter[0].Value.ToString(), out dt);
|
|
|
|
if (query.Title == "FibuNet Export Stammdaten")
|
|
{
|
|
query.FileName = String.Format("BWP Stammdaten {0:yyyyMM}.txt", dt);
|
|
query.QueryResult = GetDebitorenString(dt);
|
|
}
|
|
else if (query.Title == "FibuNet Export Rechnungsdaten")
|
|
{
|
|
query.FileName = String.Format("BWP Rg Buchungsdaten {0:yyyyMM}.txt", dt);
|
|
query.QueryResult = GetAbrechnungenString(dt);
|
|
}
|
|
else if (query.Title == "FibuNet Buchungsdaten Korrektur")
|
|
{
|
|
query.FileName = String.Format("BWP Buchungsdaten Korrektur {0:yyyyMM}.txt", dt);
|
|
query.QueryResult = GetBuchungsdatenKorrekturString(dt);
|
|
}
|
|
else
|
|
{
|
|
query.FileName = String.Format("BWP Buchungsdaten {0:yyyyMM}.txt", dt);
|
|
query.QueryResult = GetAbgrenzungString(dt);
|
|
}
|
|
|
|
return query;
|
|
}
|
|
|
|
public static String GetBuchungsdatenKorrekturString(DateTime date)
|
|
{
|
|
var gesamtExport = GetAbgrenzungString(date);
|
|
var letzterExport = GetLetzenExport(date, "FibuNet Export Buchungsdaten");
|
|
|
|
if (String.IsNullOrEmpty(letzterExport))
|
|
{
|
|
return gesamtExport;
|
|
}
|
|
|
|
return GetDifferenzAbrechnungenString(date, gesamtExport, letzterExport);
|
|
}
|
|
|
|
private static String GetLetzenExport(DateTime date, String exportName)
|
|
{
|
|
var exports = DAOFactory.GenericDAO.GetAllActive<BuchungsExport>();
|
|
|
|
foreach (var exp in exports)
|
|
{
|
|
if (exp.Name == exportName)
|
|
{
|
|
if (exp.Parameter.Contains(String.Format("Monat={0:dd.MM.yyyy}", date)))
|
|
{
|
|
return exp.Export;
|
|
}
|
|
}
|
|
}
|
|
|
|
return "";
|
|
}
|
|
|
|
public static string CreateExportString(string[] pHeaderCaption, string[][] pContent)
|
|
{
|
|
if (pHeaderCaption != null && pHeaderCaption.Length > 1 && pHeaderCaption[0].Contains("FibuNet"))
|
|
{
|
|
DateTime dt = DateTime.Now;
|
|
|
|
DateTime.TryParse(pHeaderCaption[1], out dt);
|
|
|
|
return GetAbrechnungenString(dt);
|
|
|
|
}
|
|
return null;
|
|
}
|
|
|
|
public static String GetDebitorenString(DateTime date)
|
|
{
|
|
//Beispiel
|
|
|
|
//( ):2010;0;"Kontonummer";"Kontobezeichnung";;1;0;0;
|
|
//( ):2011;"Kontoname 1";"Kontoname 2";"Straße";"";"PLZ";"Ort";
|
|
//( ):5;
|
|
|
|
|
|
//Informationen zu den einzelnen Buchungssätzen finden Sie in der Schnittstellenbeschreibung:
|
|
|
|
|
|
//Beschreibung 2010er Satz Seite 107
|
|
//Beschreibung 2011er Satz Seite 109
|
|
|
|
var dt = ExecuteQuery(GetDebitorenSql(date), date);
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
int rowIndex = 1;
|
|
foreach (DataRow row in dt.Rows)
|
|
{
|
|
Erstelle2010Satz(sb, row, date, rowIndex);
|
|
sb.AppendLine();
|
|
Erstelle2011Satz(sb, row, date, rowIndex);
|
|
sb.AppendLine();
|
|
//ErstelleSatz21(sb, row, date, rowIndex);
|
|
//sb.AppendLine();
|
|
//ErstelleSatz22(sb, row, date, rowIndex);
|
|
|
|
rowIndex++;
|
|
}
|
|
|
|
sb.AppendLine(String.Format("( ):5;"));
|
|
|
|
return sb.ToString();
|
|
}
|
|
|
|
public static String GetAbrechnungenString(DateTime date)
|
|
{
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
return GetMonatlicheRechnungen(date);
|
|
}
|
|
|
|
public static String GetAbgrenzungString(DateTime date)
|
|
{
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
return GetMonatlicheAbgrenzung(date);
|
|
}
|
|
|
|
public static String GetMonatlicheRechnungen(DateTime date)
|
|
{
|
|
/*
|
|
|
|
( ):1000;;07022019
|
|
( ):1100;14280;;;10907;;;1960133;;07022019;8408;1;M;F/G 1960133;0;;;;1;;;;;;160;
|
|
( ):1110;14280;;;1;10907;8408;1;M;1960133;;07022019;;F/G 1960133;;;0
|
|
( ):5;"CareMan"
|
|
|
|
Beispiel Aufteilungsbuchung
|
|
|
|
( ):1000;;07022019
|
|
( ):1100;1392966;;;11085;;;1960129;;07022019;0;;M;F/G 1960129;0;;;;5;;;;;;0;0
|
|
( ):1100;800000;;;11085;;;1960129;;07022019;8419;1;M;F/G 1960129;0;;;;5;;;;;;130;
|
|
( ):1100;195000;;;11085;;;1960129;;07022019;8420;1;M;F/G 1960129;0;;;;5;;;;;;130;
|
|
( ):1100;175560;;;11085;;;1960129;;07022019;8409;1;M;F/G 1960129;0;;;;5;;;;;;130;
|
|
( ):1110;1392966;;;1;11085;8409;3;M;1960129;;07022019;;F/G 1960129;;;0
|
|
( ):5;"CareMan"
|
|
|
|
|
|
Informationen zu den einzelnen Buchungssätzen finden Sie in der Schnittstellenbeschreibung:
|
|
|
|
|
|
Beschreibung 1000er Satz Seite 23
|
|
Beschreibung 1100er Satz Seite 34-36
|
|
Beschreibung 1110er Satz Seite 43-45
|
|
|
|
In den aktuellen Beispielen wird aufgrund eines Buchungskenners (1100er Satz, Feld 18) automatisch eine Kostenstellenbuchung erzeugt. Hierfür ist die Angabe der Kostenstelle zwingend erforderlich.
|
|
|
|
Alternativ wäre der 1120er Satz mit einzubauen (ab Seite 61)
|
|
*/
|
|
|
|
var dt = ExecuteQuery(GetMonatlicheRechnungenSql(date), date);
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
sb.AppendLine(String.Format("( ):1000;;{0:ddMMyyyy}", date));
|
|
|
|
int rowIndex = 1;
|
|
foreach (DataRow row in dt.Rows)
|
|
{
|
|
var ds = ErstelleFibuNetDatensatz(row);
|
|
Erstelle1100Satz(sb, ds);
|
|
sb.AppendLine();
|
|
Erstelle1110Satz(sb, ds);
|
|
sb.AppendLine();
|
|
|
|
rowIndex++;
|
|
}
|
|
|
|
dt = ExecuteQuery(GetSpitzabrechnungSql(date), date);
|
|
foreach (DataRow row in dt.Rows)
|
|
{
|
|
var ds = ErstelleFibuNetDatensatz(row);
|
|
Erstelle1100Satz(sb, ds);
|
|
sb.AppendLine();
|
|
Erstelle1110Satz(sb, ds);
|
|
sb.AppendLine();
|
|
|
|
rowIndex++;
|
|
}
|
|
|
|
sb.AppendLine(String.Format("( ):5;"));
|
|
|
|
//F,0,050,,BEWO,DA,01012016,012016,iBelegNr1,Belegnr1,220001,,,,999.99, "Name AZ Abrechnung 01/2016 LVR",,,EUR,,,,,,,,,,,R,,,
|
|
//G,0,1695,,,-999.99,"Name AZ Abrechnung 01/2016 LVR",
|
|
|
|
return sb.ToString();
|
|
}
|
|
|
|
public static String GetMonatlicheAbgrenzung(DateTime date)
|
|
{
|
|
var dt = ExecuteQuery(GetMonatlicheBetraegeSql(date), date);
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
sb.AppendLine(String.Format("( ):1000;;{0:ddMMyyyy}", date));
|
|
int rowIndex = 1;
|
|
|
|
var invoiceNumber = DAOFactory.GenericDAO.LoadByID<InvoiceNumber>(2);
|
|
long number = invoiceNumber.CurrentNumber;
|
|
|
|
foreach (DataRow row in dt.Rows)
|
|
{
|
|
if (!String.IsNullOrEmpty(row[3].ToString()))
|
|
{
|
|
var ds = ErstelleFibuNetDatensatz(row);
|
|
String nextInvoiceNumber = ApplyPattern(invoiceNumber.Pattern, number++);
|
|
ds.Belegnr = nextInvoiceNumber;
|
|
Erstelle1100Satz(sb, ds);
|
|
sb.AppendLine();
|
|
Erstelle1110Satz(sb, ds);
|
|
sb.AppendLine();
|
|
}
|
|
|
|
rowIndex++;
|
|
}
|
|
invoiceNumber.CurrentNumber = number;
|
|
|
|
DAOFactory.GenericDAO.Update(invoiceNumber);
|
|
|
|
sb.AppendLine(String.Format("( ):5;"));
|
|
|
|
return sb.ToString();
|
|
}
|
|
|
|
private static String ApplyPattern(String pattern, long number)
|
|
{
|
|
string next = pattern;
|
|
|
|
if (!String.IsNullOrEmpty(next))
|
|
{
|
|
int pos = next.IndexOf("{n");
|
|
if (pos >= 0)
|
|
{
|
|
int stop = next.IndexOf("}", pos);
|
|
if (stop > pos)
|
|
{
|
|
int nCount = stop - pos - 1;
|
|
|
|
String nextNumberStr = number.ToString();
|
|
|
|
while (nextNumberStr.Length < nCount)
|
|
nextNumberStr = "0" + nextNumberStr;
|
|
|
|
next = next.Replace(next.Substring(pos, stop - pos + 1), nextNumberStr);
|
|
}
|
|
}
|
|
|
|
next = next.Replace("{jj}", String.Format("{0:yy}", DateTime.Now.Date));
|
|
next = next.Replace("{jjjj}", String.Format("{0:yyyy}", DateTime.Now.Date));
|
|
|
|
next = next.Replace("{MM}", String.Format("{0:MM}", DateTime.Now.Date));
|
|
next = next.Replace("{mm}", String.Format("{0:MM}", DateTime.Now.Date));
|
|
|
|
}
|
|
|
|
return next;
|
|
}
|
|
|
|
private static FibuNetDatensatz ErstelleFibuNetDatensatz(DataRow row)
|
|
{
|
|
var ds = new FibuNetDatensatz();
|
|
|
|
|
|
|
|
var betragObj = row[3];
|
|
decimal betrag = 0;
|
|
if (betragObj != null)
|
|
Decimal.TryParse(betragObj.ToString().Replace(",", ""), out betrag);
|
|
|
|
ds.Betrag = betrag;
|
|
ds.Debitor = row[1].ToString();
|
|
var blg1 = row[5].ToString();
|
|
if (String.IsNullOrEmpty(blg1))
|
|
blg1 = "123456";
|
|
ds.Belegnr = blg1;
|
|
ds.Belegdatum = row[0].ToString();
|
|
ds.Erloeskonto = GetErloeskonto(row[7].ToString());
|
|
ds.Buchungstext = row[4].ToString();
|
|
ds.Kostenstelle = "4102";
|
|
|
|
return ds;
|
|
}
|
|
|
|
//private static void Erstelle1100Satz(StringBuilder sb, DataRow row, DateTime date, int rowIndex)
|
|
//{
|
|
////( ):1100; 14280; ; ; 10907; ; ; 1960133; ; 07022019; 8408; 1; M; F / G 1960133; 0; ; ; ; 1; ; ; ; ; ; 160;
|
|
// sb.Append("( ):1100;");
|
|
|
|
// var betragObj = row[3];
|
|
// decimal betrag = 0;
|
|
// if (betragObj != null)
|
|
// Decimal.TryParse(betragObj.ToString().Replace(",", ""), out betrag);
|
|
// sb.Append(String.Format("{0:0};;;", betrag)); // Betrag
|
|
|
|
// sb.Append(row[1].ToString()); // SollKonto (Debitor)
|
|
// sb.Append(";;;");
|
|
|
|
// sb.Append(blg1); // Belegnummer
|
|
// sb.Append(";;");
|
|
// sb.Append(String.Format("{0:ddMMyyyy}", row[0])); // Belegdatum
|
|
// sb.Append(";");
|
|
// var habenkto = GetErloeskonto(row[7].ToString());
|
|
// sb.Append(habenkto); // HabenKonto
|
|
// sb.Append(";0;0;"); //
|
|
// sb.Append(row[4].ToString()); // Buchungstext
|
|
// sb.Append(";0;;;;5;;;;;;");
|
|
// sb.Append("4102"); // Kostenstelle
|
|
// sb.Append(";");
|
|
//}
|
|
|
|
private static void Erstelle1100Satz(StringBuilder sb, FibuNetDatensatz ds)
|
|
{
|
|
//( ):1100; 14280; ; ; 10907; ; ; 1960133; ; 07022019; 8408; 1; M; F / G 1960133; 0; ; ; ; 1; ; ; ; ; ; 160;
|
|
sb.Append("( ):1100;");
|
|
sb.Append(String.Format("{0:0};;;", ds.Betrag)); // Betrag
|
|
sb.Append(ds.Debitor); // SollKonto (Debitor)
|
|
sb.Append(";;;");
|
|
sb.Append(ds.Belegnr); // Belegnummer
|
|
sb.Append(";;");
|
|
sb.Append(String.Format("{0:ddMMyyyy}", ds.Belegdatum)); // Belegdatum
|
|
sb.Append(";");
|
|
sb.Append(ds.Erloeskonto); // HabenKonto
|
|
sb.Append(";0;0;"); //
|
|
sb.Append(ds.Buchungstext); // Buchungstext
|
|
sb.Append(";0;;;;5;;;;;;");
|
|
sb.Append(ds.Kostenstelle); // Kostenstelle
|
|
sb.Append(";");
|
|
}
|
|
|
|
private static void Erstelle1110Satz(StringBuilder sb, FibuNetDatensatz ds)
|
|
{
|
|
//( ):1110;14280;;;1;10907;8408;1;M;1960133;;07022019;;F/G 1960133;;;0
|
|
|
|
sb.Append("( ):1110;");
|
|
sb.Append(String.Format("{0:0};;;", ds.Betrag)); // Betrag
|
|
sb.Append("1;"); // Satzart
|
|
sb.Append(ds.Erloeskonto);
|
|
sb.Append(";");
|
|
sb.Append(ds.Erloeskonto); // HabenKonto
|
|
sb.Append(";1;M;"); //
|
|
sb.Append(ds.Belegnr); // Belegnummer
|
|
sb.Append(";;");
|
|
sb.Append(String.Format("{0:ddMMyyyy}", ds.Belegdatum)); // Belegdatum
|
|
sb.Append(";;");
|
|
sb.Append(ds.Buchungstext); // Buchungstext
|
|
sb.Append(";;;0");
|
|
}
|
|
|
|
//private static void Erstelle1110Satz(StringBuilder sb, DataRow row, DateTime date, int rowIndex)
|
|
//{
|
|
// //( ):1110;14280;;;1;10907;8408;1;M;1960133;;07022019;;F/G 1960133;;;0
|
|
|
|
// sb.Append("( ):1110;");
|
|
|
|
// var betragObj = row[3];
|
|
// decimal betrag = 0;
|
|
// if (betragObj != null)
|
|
// Decimal.TryParse(betragObj.ToString().Replace(",", ""), out betrag);
|
|
// sb.Append(String.Format("{0:0};;;", betrag)); // Betrag
|
|
|
|
// sb.Append("1;"); // Satzart
|
|
// sb.Append(row[1].ToString());
|
|
// sb.Append(";");
|
|
// var habenkto = GetErloeskonto(row[7].ToString());
|
|
// sb.Append(habenkto); // HabenKonto
|
|
// sb.Append(";1;M;"); //
|
|
// var blg1 = row[5].ToString();
|
|
// if (String.IsNullOrEmpty(blg1))
|
|
// blg1 = "123456";
|
|
// sb.Append(blg1); // Belegnummer
|
|
// sb.Append(";;");
|
|
// sb.Append(String.Format("{0:ddMMyyyy}", row[0])); // Belegdatum
|
|
// sb.Append(";;");
|
|
// sb.Append(row[4].ToString()); // Buchungstext
|
|
// sb.Append(";;;0");
|
|
//}
|
|
|
|
private static void Erstelle2010Satz(StringBuilder sb, DataRow row, DateTime date, int rowIndex)
|
|
{
|
|
//( ):2010;0;"Kontonummer";"Kontobezeichnung";;1;0;0;
|
|
sb.Append("( ):2010;0;");
|
|
sb.Append(row[2].ToString()); // Kontonummer
|
|
sb.Append(";"); //
|
|
sb.Append(""); // Kontobezeichnung?
|
|
sb.Append(";;1;0;0;");
|
|
}
|
|
|
|
private static void Erstelle2011Satz(StringBuilder sb, DataRow row, DateTime date, int rowIndex)
|
|
{
|
|
//( ):2011;"Kontoname 1";"Kontoname 2";"Straße";"";"PLZ";"Ort";
|
|
sb.Append("( ):2011;");
|
|
sb.Append(String.Format("{0} {1}", row[0], row[1])); // Kontoname 1
|
|
sb.Append(""); // Kontoname 2
|
|
sb.Append(";"); //
|
|
sb.Append(row[4]); // Str.
|
|
sb.Append(";;"); //
|
|
sb.Append(row[5]); // Plz
|
|
sb.Append(";"); //
|
|
sb.Append(row[6]); // Ort
|
|
sb.Append(";");
|
|
|
|
}
|
|
|
|
private static string GetDifferenzAbrechnungenString(DateTime date, String neuerExport, String letzterExport)
|
|
{
|
|
List<String> neueZeilen = GetExportZeilen(neuerExport);
|
|
List<String> letzterExportZeilen = GetExportZeilen(letzterExport);
|
|
|
|
//prüfe Unterschiede
|
|
List<FibuNetDatensatz> unterschiedlicheDatensaetze = new List<FibuNetDatensatz>();
|
|
foreach (var lineNeu in neueZeilen)
|
|
{
|
|
|
|
|
|
bool istImAltenExportSchonEnthalten = letzterExportZeilen.Contains(lineNeu);
|
|
if (!istImAltenExportSchonEnthalten)
|
|
{
|
|
//Prüfe ob neue Rechnung oder alte Rechnung mit neuem Betrag
|
|
var satzNeu = FibuNetDatensatz.ErzeugeDatensatz(lineNeu);
|
|
|
|
//Suche übereinstimmende Zeile aus dem alten Export um die Differenz zu berechnen
|
|
|
|
decimal differenz = 0;
|
|
foreach (var lineAlt in letzterExportZeilen)
|
|
{
|
|
var satzAlt = FibuNetDatensatz.ErzeugeDatensatz(lineAlt);
|
|
|
|
//Wenn beide Zeilen gleich sind (bis auf Betrag und Stunden) dann handelt es sich um die gleiche Rechnung, von der sich der alte Betrag wegen zwischenzeitlicher Änderungen in der Zeiterfassung geändert hat.
|
|
//Berechne Differenz, weil die mit ausgegeben werden soll
|
|
if (satzAlt.Debitor == satzNeu.Debitor &&
|
|
satzAlt.Kostenstelle == satzNeu.Kostenstelle &&
|
|
satzAlt.Erloeskonto == satzNeu.Erloeskonto &&
|
|
satzAlt.Buchungstext == satzNeu.Buchungstext &&
|
|
satzAlt.Belegdatum == satzNeu.Belegdatum)
|
|
{
|
|
satzNeu.Betrag -= satzAlt.Betrag;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
unterschiedlicheDatensaetze.Add(satzNeu);
|
|
}
|
|
|
|
}
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
sb.AppendLine(String.Format("( ):1000;;{0:ddMMyyyy}", date));
|
|
|
|
foreach (var ds in unterschiedlicheDatensaetze)
|
|
{
|
|
Erstelle1100Satz(sb, ds);
|
|
sb.AppendLine();
|
|
Erstelle1110Satz(sb, ds);
|
|
sb.AppendLine();
|
|
|
|
}
|
|
|
|
sb.AppendLine(String.Format("( ):5;"));
|
|
|
|
return sb.ToString();
|
|
}
|
|
|
|
public static List<String> GetExportZeilen(String export)
|
|
{
|
|
List<String> zeilen = new List<String>();
|
|
|
|
using (StringReader reader = new StringReader(export))
|
|
{
|
|
string line;
|
|
|
|
while ((line = reader.ReadLine()) != null)
|
|
{
|
|
if (line.StartsWith("( ):1100;"))
|
|
{
|
|
zeilen.Add(line);
|
|
}
|
|
}
|
|
}
|
|
|
|
return zeilen;
|
|
}
|
|
|
|
private static String GetErloeskonto(String itemDesc)
|
|
{
|
|
if (itemDesc.Contains("Soziotherapie"))
|
|
return "89410";
|
|
else if (itemDesc.Contains("Jugendamt"))
|
|
return "84190";
|
|
else // Fachleistungenstunden (LWL, LVR, Selbstzahler, Müller), Assistenz LVR
|
|
return "84180";
|
|
}
|
|
|
|
|
|
private static String GetDebitorenSql(DateTime date)
|
|
{
|
|
|
|
String sql = @"
|
|
SELECT
|
|
distinct
|
|
p.`FirstName`,
|
|
p.`LastName`,
|
|
c.DebitorNumber,
|
|
cb2sc.CustomerRefenrenceNumber,
|
|
a.Street,
|
|
a.PostalCode,
|
|
a.Town
|
|
FROM `customer` c
|
|
INNER JOIN `person` p ON p.`Oid` = c.`PersonOid`
|
|
INNER JOIN supportconcept sc on sc.CustomerOID = c.Oid
|
|
INNER JOIN costbearer2supportconcept cb2sc on cb2sc.SupportConceptOID = sc.Oid
|
|
LEFT JOIN Address a on p.addressOid = a.oid
|
|
WHERE c.isactive=1
|
|
order by p.`LastName`, p.FirstName
|
|
";
|
|
return sql;
|
|
}
|
|
|
|
private static String GetMonatlicheRechnungenSql(DateTime date)
|
|
{
|
|
String sql = @"
|
|
select
|
|
ib.InvoiceDate,
|
|
c.DebitorNumber,
|
|
c.CostCenter,
|
|
sip.Claim,
|
|
CONCAT(date_format(ib.AccountingPeriodStart, '%d.%m.%Y'), ' - ', date_format(ib.AccountingPeriodEnd, '%d.%m.%Y'), ' ', p.`FirstName`, ' ', p.`LastName`),
|
|
ib.invoicenumber,
|
|
(select t.name from team t inner join team2customer t2c on t2c.teamoid = t.oid where t2c.customeroid = c.Oid limit 1),
|
|
ii.ItemDescription
|
|
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
|
|
inner join invoiceitem ii on ii.serviceinvoiceperiodoid = sip.oid
|
|
WHERE ib.`AccountingPeriodEnd` >= ':Monat_Start' AND ib.`AccountingPeriodEnd` < ':Monat_End' and ib.IsActive = 1
|
|
order by ib.invoicenumber
|
|
";
|
|
|
|
return sql;
|
|
}
|
|
|
|
private static String GetSpitzabrechnungSql(DateTime date)
|
|
{
|
|
//sb.AppendLine("Datum;Konto;Gegenkonto;Buchungstext;Belegnummer;Betrag;Kostenstelle");
|
|
//Fr.Selter 355931 201
|
|
//0211 355931 376
|
|
//Kostenstelle: 602000
|
|
//Ertragskonto: 8100
|
|
|
|
String sql = @"
|
|
SELECT
|
|
ib.InvoiceDate,
|
|
c.DebitorNumber,
|
|
c.CostCenter,
|
|
Round(si.Claim, 2),
|
|
CONCAT('Endabrechnung ', date_format(ib.AccountingPeriodStart, '%d.%m.%Y'), ' - ', date_format(ib.AccountingPeriodEnd, '%d.%m.%Y'), ' ', p.`FirstName`, ' ', p.`LastName`),
|
|
ib.InvoiceNumber,
|
|
(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;
|
|
}
|
|
|
|
private static String GetMonatlicheBetraegeSql(DateTime date)
|
|
{
|
|
String sql = @"
|
|
SELECT
|
|
':End_Datum' AS InvoiceDate,
|
|
c.DebitorNumber,
|
|
c.CostCenter,
|
|
IF(crpRateFactor.`CostRateValue` is null, 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` > '2023-02-01') order by IF(crp.`EndDate` is null, MAKEDATE(9999,365),crp.`EndDate`) LIMIT 1 )),
|
|
ROUND(ROUND((sr.`GeleisteteFLM` * ((100 + crpRateFactor.`CostRateValue`)/100) / 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` > '2023-02-01') order by IF(crp.`EndDate` is null, MAKEDATE(9999,365),crp.`EndDate`) LIMIT 1 ), 2)) AS 'Betrag',
|
|
CONCAT(':PeriodeSlash', ' FLStd/BeWo ', p.`LastName`) as 'Verwendung',
|
|
':Periode' AS invoicenumber,
|
|
cb2sc.Oid,
|
|
Cat
|
|
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`, sc.`Name` AS Cat, 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`, sc.`Name`)
|
|
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')
|
|
ORDER BY p.`LastName`, p.`FirstName`, cb2sc.`ApprovedStartDate`
|
|
";
|
|
|
|
return sql;
|
|
}
|
|
|
|
public static DataTable ExecuteQuery(String sql, DateTime dt)
|
|
{
|
|
var newsql = sql;
|
|
newsql = newsql.Replace(":PeriodeSlash", String.Format("{0:MM}/{0:yy}", dt));
|
|
newsql = newsql.Replace(":Periode", String.Format("{0:yyyyMM}", dt));
|
|
newsql = newsql.Replace(":Abrechnungsmonat", String.Format("{0:ddMMyyyy}", 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));
|
|
dt = dt.AddDays(-1);
|
|
newsql = newsql.Replace(":End_Datum", String.Format("{0:ddMMyyyy}", dt));
|
|
|
|
return DAOFactory.AdoDAO.ExecuteQuery(newsql).Tables[0];
|
|
}
|
|
|
|
//Buchung Abrechnung Stundenzettel
|
|
//F,0,050,, BEWO, DA,01012016,012016, iBelegNr1, Belegnr1,220001,,,,999.99, "Name AZ Abrechnung 01/2016 LVR",,, EUR,,,,,,,,,,, R,,,
|
|
//G,0,1695,,,-999.99,"Name AZ Abrechnung 01/2016 LVR",
|
|
|
|
//Buchung Abschlagszahlung
|
|
//F,0,050,, BEWO, DA,02012016,012016, iBelegNr2, Belegnr2,220001,,,,-888.88, "Name AZ Abschlagszahlung LVR 01/2016",,, EUR,,,,,,,,,,, R,,,
|
|
//G,0,4473,,,888.88,"Name AZ Abschlagszahlung LVR 05/2016",
|
|
|
|
//Buchung Abrechnung LVR / Selbstzahler
|
|
//F,0,050,, BEWO, DA,01022016,022016, iBelegNr3, Belegnr3,220001,,,,900.00, "Name AZ Abrechnung LVR + SZ 02/2016",,, EUR,,,,,,,,,,, R,,,
|
|
//G,0,1695,,,-800.00,"Name AZ Abrechnung 05/2016 LVR",
|
|
//G,0,1695,,,-100.00,"Name AZ Abrechnung 05/2016 SZ",
|
|
|
|
//schwarz = konstant
|
|
//rot = variabel
|
|
}
|
|
|
|
|
|
} |