Files
BeWoPlaner/ReportImp/AsbRuhr/Export/FibuNetExporter.cs
Christian 4e7d7426ec Fibu Übergabeprotokoll ASB Rhein Ruhr+Die Perspektiven
+ Bugfix fehlendes Icon im Kalender nach Übertrag in Zeiterfassung
2023-03-28 00:02:15 +02:00

633 lines
25 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;
namespace AsbRuhr.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;
foreach (DataRow row in dt.Rows)
{
if (!String.IsNullOrEmpty(row[3].ToString()))
{
var ds = ErstelleFibuNetDatensatz(row);
Erstelle1100Satz(sb, ds);
sb.AppendLine();
Erstelle1110Satz(sb, ds);
sb.AppendLine();
}
rowIndex++;
}
sb.AppendLine(String.Format("( ):5;"));
return sb.ToString();
}
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.Belegnr == satzNeu.Belegnr &&
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
}
}